2013-09-21 115 views
0

我想将文件中的记录加载到动态数组中。我有以下代码:realloc后无效的结构体大小

typedef struct my_data { 
    char name[100]; 
}my_data; 
struct my_data *data; 

void load_data() 
{ 
struct my_data *temp = NULL; 
    int i = 0; 
    FILE * in; 
    if((in = fopen("data.txt","rt")) != NULL) { 
    temp = malloc((i+1)*sizeof(my_data)); 
    while(!feof(in)) 
     { 
      fscanf(in,"%s", &temp[i].name); 
      i++; 
      temp = realloc(temp,((i+1)*sizeof(my_data))); 
     }; 
     fclose(in); 
    data = temp; 
    free(temp); 

    for (i=0;i<sizeof(data);i++) 
     printf("%s\n",data[i].name); 
    } 

我有超过100条记录。为什么它只显示4?

回答

3
sizeof(data) 

上面给出的data其尺寸为my_data *类型,您的系统上的4个字节。要获得记录数量,请遵循与分配内存的方式相同的逻辑(即i+1记录)。请注意,您已在for循环初始化表达式中重新分配了i到。

+0

我明白了,你是对的。但有没有其他的方式来导出记录的数量,除了让int我是全局的? –

+1

@SamReina您始终可以将指针与尺寸一起传递。或者你可以把指针和大小放在一个结构体中。 –

+0

感谢您的通知,但该循环仅用于测试目的。所以我应该在结构中添加int(循环外部)或每个值(循环内部)的总值,对于最后一种情况,我该如何计算总数?我的意思是,如果对于每个数组[i] int的相应值是i,我不知道它是如何计算总数的。或者我应该从最后一个元素中得到整数吗?很抱歉有这么多问题,但我还在努力学习 –

0

因为数据只是指向struct my_data的指针。它等于sizeof(struct my_data *),它等于sizeof(void *)并返回指针的大小(取决于您的系统,这是4或8或其他)。

您不能使用sizeof来获取C中数组的长度。您需要将长度保存在您自己的变量中。

0

sizeof(my_data)等于4,因为实际上结构只包含一个指向char的指针。不是一串100个字符。