2
因此,我對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 ... yeilds以下:
(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的錯誤內存位置。任何建議或意見將不勝感激!
你沒有'0' – mch
'INT J = 0終止您的字符串'cval';'只有1地方看起來很可疑。我期望它在'while(record!= NULL)' – chux
thx mch之前。我會研究這個。 – Killingsworth