Structs数组值在内存中丢失

时间:2017-06-08 19:15:18

标签: c linux

所以,我对C来说很陌生并在几个小时前碰到了一些我认为令人费解的事情。

我基本上正在使用C中的csv文件解析器。我已经获得了以下结构来保存csv文件中的单个值。 (例如" 5.13"或" Test1")。

struct CSV_DATA {
    enum { is_int, is_float, is_char } type;
    int ival;
    char cval[10];
    float fval;
};

内部主要是以下(注意:第40和41行是重要的):

int main()
{

   struct CSV_DATA csv_data[500][50];

   char buffer[1024] ;
   char *record,*line;

   int i = 0;
   int j = 0;

   FILE *fstream = fopen("iris.csv","r");

   if(fstream == NULL)
   {
      printf("\n file opening failed ");
      return -1 ;
   }

   while((line=fgets(buffer,sizeof(buffer),fstream))!=NULL)
   {
     record = strtok(line,",");
     printf("%s", record);
     while(record != NULL)
     {

        csv_data[i][j].type = is_char;
        for (int k=0; k < strlen(record); k++){
          csv_data[i][j].cval[k] = record[k];//record;          
        }

        j++;

     record = strtok(NULL,",");
     printf("%s", record);

     }
     ++i;
   }




   return 0 ;
 }

此代码的要点是从csv文件中读取值并将其中的每一个存储在CSV_DATA的一个实例中。然后,我将该值存储在2d数组中,以便以后能够访问数据。

现在,这实际上将值存储到内存中。我知道因为我可以用GDB看到它们,但问题是数据在内存中偏离数组的实际索引。

以下命令:x / 200ub csv_data ...提供以下内容:

(gdb) x/200ub csv_data 
0x7ffffff6b1f0: 2   0   0   0   0   0   0   0
0x7ffffff6b1f8: 53  46  49  0   0   0   0   0
0x7ffffff6b200: 0   0   0   0   0   0   0   0
0x7ffffff6b208: 2   0   0   0   0   0   0   0
0x7ffffff6b210: 51  46  53  0   0   0   0   0
0x7ffffff6b218: 0   0   0   0   0   0   0   0

同样地,x / 200ub csv_data [0]产生了与预期相同的东西。

然而,x / 200ub csv_data [1]正在查看内存中错误的索引值!!但是,我可以看到它们存储在内存中,但是数组的索引指向1..n的错误内存位置。任何建议或想法将不胜感激!

1 个答案:

答案 0 :(得分:0)

内循环索引仅初始化一次。移动,索引

其他想法也包含在内

j

[编辑]更正后的代码