1

これはばかげた質問になるかもしれません。私は次の機能を実行しました:

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*));
4

1 に答える 1

2

valgrind での私の経験では、不正なアクセスが行われたことを正確に示しています。ただし、出力には、不正なアクセスに関連するポインターとその割り当て先のみが表示されているようです。

つまり、間違ったコード行を見ている可能性があります。

while ループを詳しく見てみましょう:

 while(ch != '.' && sscanf (globalString,"%[^,|.]s", arrayOfStrings[i]) > 0)       
 {
  globalString += strlen(arrayOfStrings[i++]) + 1;    
  ch =  (*globalString-1);                  /** take the terminal characters */ 
 }

何らかの理由で、最終行chで が等しくない場合.、 で不正なアクセスが行われarrayOfStrings[rows]ます。行 + 1 を割り当てることは回避策です。内容は不明であり、おそらく存在しない.ため、while 条件は false と評価され、不正なアクセスはありません。

.最終反復に a が存在することを確認するかi < ROWS、 while 条件に次のようなものを含めることをお勧めします

于 2013-04-06T18:36:45.023 に答える