これはばかげた質問になるかもしれません。私は次の機能を実行しました:
char **getArrayOfStrings(int rows, int cols){
int i;
char **aux = malloc(rows * sizeof(char*));
for(i = 0; i < rows; i++)
aux[i] = malloc(cols+1);
return aux;
}
これは「文字列」の配列を返します。重要なコードのチャンクは次のようなものです。
void f(...)
{
char **arrayOfStrings;
int i = 0;
arrayOfStrings = getArrayOfStrings(ROWS,COLS);
while(ch != '.' && sscanf (globalString,"%[^,|.]s", arrayOfStrings[i]) > 0)
{
globalString += strlen(arrayOfStrings[i++]) + 1;
ch = (*globalString-1); /** take the terminal characters */
}
freeMemory(&arrayOfStrings,ROWS);
}
ここで、freeMemory は次のとおりです。
void freeMemory(char ***matrix, int size){
int i;
for(i = 0; i < size; i++) free((*matrix)[i]);
free(*matrix);
*matrix = NULL;
}
アプリケーションが完成したら、valgrind を実行してメモリ リークを探します (初めて valgrind を使用します)。
そして、次のエラーが表示されます。
Finding Invalid Pointer Use With Valgrind
==25012== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
==25012== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==25012== Command: dist/Debug/GNU-MacOSX/app
==25012==
==25012== Invalid read of size 8
==25012== at 0x406445: f (Data.c:24)
==25012== by 0x400BE3: main (main.c:27)
関数 getArrayOfStrings は私には完全に問題ないように見えるため、何が欠けているのかわかりません(mallocを1つだけ使用することもできましたが、それは別の問題です)。
編集。
valgrind が示す行は、これです f (Data.c:24):
char **aux = malloc(rows * sizeof(char*));