双指针内的值未正确更新(C)

时间:2012-10-17 14:14:06

标签: c fgets double-pointer

我有一个读取输入文件的函数,应该修改char **和int *的内容。功能如下:

void
input_parser(arguments* args, char** input, int* files) {
   char buffer[MAX];
   FILE *fr;
   fr = fopen(args->file,"r");
   if (fr == NULL) {
       printf("No correct input file was entered\n");
       exit(0);
   } 
   while(fgets(buffer,MAX,fr) != NULL) {
       input[*files] = strtok(buffer,"\n");
       (*files)++;
   }
   fclose(fr);
   return;
}

我在主程序中定义了如下输入和文件:

char* input[25];
files = 0;

我按如下方式调用该函数:

input_parser(args, input, &files);

输入文件包含3行,如下所示:

output1.xml
output2.xml
output3.xml

我注意到在while循环期间,'current'值被正确读取但存储在所有输入[*]中导致:

input[0] = output3.xml
input[1] = output3.xml
input[2] = output3.xml

如果有人知道这里出了什么问题,我将不胜感激。

2 个答案:

答案 0 :(得分:3)

该函数将局部变量buffer的地址存储到input数组中的每个元素:您需要复制strtok()返回的值。它所代表的代码是未定义的行为,因为buffer一旦input_parser()返回就超出范围,即使逻辑不正确也是如此。

如果您有strdup(),则只需使用它:

input[*files] = strdup(strtok(buffer,"\n")); /* NULL check omitted. */

否则malloc()strcpy()。 <!1}}当不再需要时,请记住free()的元素。

初始化input以确定哪些元素指向有效字符串:

input

答案 1 :(得分:0)

你将最终拥有悬空指针,这些指针在缓冲区被释放后指向缓冲区内。