c - 将指针存储到数组时哪里出错了?

标签 c arrays pointers struct

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

typedef struct record
{
    char*title;
    char* year;
    char* length; //in minutes
} record;

void read(record* list[]);
void test(record* list[]);

int main(int args, char* argv[])
{
  record* list[1024];
  read(list); //add record to list (pass by reference)

  test(list);

  write(list);


  return 0;
}
void test(record* list[])
{
    int i;
    for(i=0; i<1024; ++i)
    {
        if(list[i]!=NULL)
        {
            printf("%s index %d \n", list[i]->title ,i);
        }
    }
}

void read(record* list[])
{
    int j;  //ini a array of pointer initially point to null
    for(j=0;j<1024;++j)
      list[j]=NULL;

   FILE* input=fopen("input.txt","r"); //file in
   if(!input)
   {
        printf("Error"); exit(1);
   }else
   {
       int i=0; //index for adding elements to array
       char temp[100];
       while(!feof(input))
       {
           record* current_record=(record*)malloc(sizeof(record));

           fgets(temp,sizeof(temp),input);  //temp is a line of file
           char deli[]=" ";

           char* result=NULL;
           result=strtok(temp,deli);  //titile info
           current_record->title=result;

           result=strtok(NULL,deli); //year
           current_record->year=result;

           result=strtok(NULL,deli); //length
           current_record->length=result;

           list[i]=current_record; //add to array
           printf("%s \n",current_record->title);
           ++i;
       }
       fclose(input);
   }
}

这是我的程序所做的: 1.逐行读取文件 2. 将一行中的所有信息存储到一个结构中,并将所有结构存储到一个数组中。这个数组是一个指针数组。当元素未被使用时,指针指向空。 3.测试方法。我想在此数组的结构中打印数据。

测试方法打印了一个奇怪的输出。谁能帮我解决问题?不要告诉我如何修复。谢谢。

输入.txt:

zombieland 2009 88

avatar 2009 178

watchmen 2009 215

最佳答案

你的错误是你没有保留从文件中读取的数据副本。

当您读取数据时,您将该数据放入局部变量 temp。然后你将各种指针设置到 temp 中的不同位置(你应该复制到不同的内存)。当你阅读另一行时,你覆盖了 temp 的内容,但指针仍然指向同一个地方

step 1 read zombieland 2009 88
pointers    ^          ^    ^

step 2 read avatar 2009 178
oldpointers ^          ^    ^
newpointers ^      ^    ^

简而言之:将 strtok() 的结果复制到全新的 malloc 内存中。

哦!不要忘记在不再需要内存时(可能在程序结束时)free()

关于c - 将指针存储到数组时哪里出错了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22489157/

相关文章:

c - 使用 C 返回数组

c - printf ("%p"int 1) 是什么意思?

c - 数值微分

c - GStreamer:没有这样的文件或目录

javascript - 如何使用map()、reduce()和filter()简化javascript嵌套数组?

c - 自己版本的 strncpy 不应该工作,但它确实有效

python - 拟合 Keras 序列模型给出 ValueError : Failed to convert a NumPy array to a Tensor (Unsupported object type numpy. ndarray)

pointers - 如何在 Go 中将动态创建的结构作为非指针对象传递

c - 在循环中使用 fgets() 获取输入

c - 将值添加到 char* [][]