0

コードからエラーが発生しましたが、どこを修正すればよいかわかりません。

私のコードが何をするかの説明は次のとおりです。

入力ファイルを読み取り、各行をオブジェクト (char 型) として配列に格納するコードを書いています。入力ファイルの最初の行は数字です。この数値は、読み取って配列に格納する必要がある行数を示しています。これが私のコードです:

int main(int argc, char *argv[]){
    FILE *fp; 
    char **path;
    int num, i;
    ...
    /*after reading the first line and store the number value in num*/
    path = malloc(num *sizeof(char));
    ...
    free(path);
}

コードを実行した後、これを取得します

*** glibc detected *** free(): invalid next size (fast): 

私は周りを検索し、これがmalloc/freeエラーであることを知っていますが、それを修正する方法を正確には知りません. どんな助けでも素晴らしいでしょう。ありがとう!

4

1 に答える 1

3
path = malloc(num *sizeof(char));

これは間違っています。 pathは char へのポインターへのポインターであるため、常に 1 になるnum * sizeof(char*)ではなくを割り当てる必要がありsizeof(char)ます (ただし、ポインターはほぼ確実に 1 バイトではありません)。

ポインターを動的に初期化するには、必要な要素数にポインターが指す型のサイズを掛けた値を常に割り当てます。このポインタはchar*ではなくを指しますchar。sを指し示すポインターchar(それを言うのはちょっと楽しいです...)

単純化するには:

some_ptr *p = malloc(num_elems * sizeof *p);

コンパイラは正しく処理する方法を知ってsizeof(*p)います。実際にはポインターを逆参照していません (そうしないと、ポインターが初期化されていない可能性があるため、UB が呼び出されます)。

于 2012-06-04T21:51:50.423 に答える