1

所以我有一个不断被新值覆盖的数组。例如,这是输出:

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

其中 PRINTNUM 应该是数组中的最后一个元素,而前两个元素应该是其他元素。

这是我针对特定部分的代码:

    //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

您将数组中的每个索引都指向相同的内存地址。我认为你最好使用 strcpy

于 2013-04-21T18:17:08.657 回答
1

没有分配内存来存储从文件中读取的行。是的,分配了内存但instruc属于类型char **,并且程序正在使用此内存,就好像instruc属于char *类型一样。

如果您希望将指向文件中所有记录的指针存储在文件内存中,则不仅必须分配内存以将数据存储在文件中,而且还需要内存来存储指向每个记录开头的指针。

在此代码中,文件记录的长度固定为 200 字节。一个变量指向的指针数组char **并不是绝对必要的——只需将 200 个字节添加到 char * 指针,指向从文件读取的数据的开始,就可以确定下一条记录的开始。

要存储指向每条记录开头的指针,需要像这样:

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 回答