【问题标题】:Value inside a double pointer isn't updated correctly (C)双指针内的值未正确更新 (C)
【发布时间】:2012-10-17 14:14:06
【问题描述】:

我有一个读取输入文件的函数,它应该修改 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 循环期间,“当前”值被正确读取,但存储在所有输入 [*] 中,导致:

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

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

【问题讨论】:

  • 核心问题是你的文件读取功能,按照它的设计,必须要关心很多与文件处理无关的事情。由于您正在阅读某种 xml 文件,我将假设这些文件的格式和长度在编译时是已知的。正确的?如果是这样,则不需要动态内存。您应该能够在调用者中以真正的二维数组的形式分配所需的内存。然后将此二维数组及其大小传递给文件读取函数。确保函数不会越界。

标签: c fgets double-pointer


【解决方案1】:

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

如果你有strdup(),你就用它:

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

否则malloc()strcpy()。不再需要时,请记住 free() input 的元素。

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

char* input[25] = { NULL };

【讨论】:

  • 我不应该使用 strcpy,因为即使 input[x] 已经分配为 char[25],strdup 也会分配内存?
  • 我将 '\0' 分配给 main 中的所有输入值,但未在原始问题中包含该块。我在其他部分使用它来检查其中有多少元素。
  • @BasJansen,你需要分配内存来存储字符串。 input 是一个 25 个数组 char*:没有地方可以直接在该数组中存储字符串的字符。如果您要使用strcpy(),您必须分配要复制到的内存,使用malloc()
  • 我不太喜欢动态内存分配,但它确实可以解决问题。我现在因为忘记不为输入指向的位置分配内存而感到有点傻。
  • @BasJansen 我认为没有一个程序员喜欢动态内存 :) 但它在各种桌面应用程序中是必不可少的。至于这种特定情况,您可能不需要动态内存。这取决于您正在阅读的 xml 文件的性质。
【解决方案2】:

你最终会得到 danging 指针,这些指针在缓冲区被释放后指向你的缓冲区。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-28
    • 2012-11-06
    • 2018-06-10
    • 2019-11-01
    • 1970-01-01
    • 2021-03-18
    • 1970-01-01
    • 2011-06-30
    相关资源
    最近更新 更多