1

そのため、新しい値で上書きされ続ける配列があります。たとえば、これは出力です。

instruc[0] = PRINTNUM
instruc[1] = PRINTNUM
instruc[2] = PRINTNUM

ここで、PRINTNUM は配列の最後の要素であり、最初の 2 つの要素は別のものである必要があります。

特定のセグメントのコードは次のとおりです。

    //array of instructions
char** instruc = malloc(numLines * 200); 

c = fgets(inputString, 200, in_file);

while (c != NULL){
    instruc[i]=inputString;     
    i++;
    c = fgets(inputString, 200, in_file);
}

//print out what's in the array
i=0;
for (i=0; i<numLines; i++){
    printf("instruc[%d] = %s\n", i, instruc[i]);
}

前もって感謝します!

4

2 に答える 2

1

ファイルから読み取った行を格納するためのメモリが割り当てられていません。はい、メモリが割り当てられていますinstrucが、タイプchar **であり、プログラムはこのメモリinstrucchar *タイプのように使用しています。

ファイル内のすべてのレコードへのポインターを保存する場合は、ファイル内のデータを保存するためだけでなく、各レコードの先頭へのポインターを保存するためにもメモリを割り当てる必要があります。

このコードでは、ファイル レコードの長さが 200 バイトの固定長であることがわかります。の変数char **が指すポインターの配列は、厳密には必要ありません。ファイルから読み取ったデータの先頭への char * ポインターに 200 バイトを追加するだけで、次のレコードの先頭を特定できます。

各レコードの先頭へのポインターを保存するには、次のようなものが必要です。

char **fileRecPtrs = malloc(sizeof(char *) * numLines);
char *instruc = malloc(200 * numLines); 

次に、ループでファイルの各レコードを読み取ります-:

c = fgets(instruc, 200, in_file);     
while (c != NULL) {
    fileRecPtrs[i] = instruc;
    instruc += 200;
    i++;
    c = fgets(instruc, 200, in_file);
}
于 2013-04-21T18:41:23.147 に答える
1

配列内のすべてのインデックスを同じメモリアドレスに向けています。strcpy を使ったほうがいいと思います

于 2013-04-21T18:17:08.657 に答える