0

ポインターへのポインター (char**) を、それを初期化する関数に渡してから、メモリを解放する別の関数に渡そうとしていますが、解放時にセグ フォールトが発生してしまいます。私の割り当てが間違っていると信じるために。

Valgrind は、この行で初期化されていない値の使用を報告しています。tmp[i] は 0x0 を指しています。

if(tmp[i]) free((char*)tmp[i]);

これがコードです(これはテストコードのみです)

void 
alloc_strings(char ***test, int count) 
{
  char **tmp = *test;
  tmp = malloc(count * sizeof(char*));

  int i;
  for(i = 0; i < count; i++) {
    tmp[i] = malloc(6);
    strcpy(tmp[i],"Hello");
  }
}

void
free_strings(char ***test, int count)
{
  char **tmp = *test;

  int i;
  for(i = 0; i < count; i++) {
    if(tmp[i]) free((char*)tmp[i]);
  }

  if(tmp)
    free(tmp);
}

そして呼び出し:

int
main(int argc, char **argv)
{

  char **test;
  alloc_strings(&test, 10);
  free_strings(&test, 10);

  return 0;
}

私はしばらくこれをいじっていましたが、ポインターなどを読んでいますが、問題を回避することはできません。どんな考えでも大歓迎です!

4

2 に答える 2

1

から割り当てるのではなく、に割り当てる必要があります*test。どうですか:

void 
alloc_strings(char ***test, int count) 
{
    char **tmp = malloc(count * sizeof *tmp);
    /*...*/
    *test = tmp;
}
于 2013-02-10T14:55:28.693 に答える
0

コード例では、

alloc_strings(char ***test, int count) 
{
    char **tmp = *test;

*testchar **現在割り当てられていないポインターを格納するためのスペースが必要です。したがって、例がこのような場合

char** array[1];

alloc_strings(&array[0], 7);

コードが動く気がします。

于 2013-02-10T14:59:07.867 に答える