【发布时间】:2015-12-29 09:52:17
【问题描述】:
我在下面的代码中遇到了分段错误,我真的没有看到我错过了什么,这段代码的目的是检索 .csv 的行并将它们放入使用双指针创建的二维数组中.
段错误位于 csv 文件第一行的明文[i][j] 的最后分配处。
非常感谢您的帮助(从昨天开始就这个问题......)
int main(){
int n=48; //nbers of columns in csv file
int m=60; //nbers of lines in csv file
int cpt,i,j;
cpt=0;
i=0;
FILE *fp;
char *token;
const char s[2] = ",";
unsigned char **plaintexts;
plaintexts = malloc(sizeof(*plaintexts) * m);
char *str=malloc(sizeof(char)*15*n); //maximum 15 char per box
fp = fopen("aes_traces.csv","r");
while(fgets(str,15*n,fp)!=NULL){
plaintexts[i] = malloc(sizeof(*plaintexts[i]) * n);
token = strtok(str,s);
j=0;
while(token != NULL){
printf("%s\n", token);
token = strtok(NULL,s);
plaintexts[i][j]=(unsigned char) (*token);
j++;
}
i++;
free(str);
free(token);
}
fclose(fp);
}
【问题讨论】:
-
故障发生时
i、j、n、token的值是多少? -
您可以对您的程序运行 valgrind 并在此处发布结果吗?
-
如果你想要一个行数组,而每一行都是一个标记数组,你需要一个 3D 数组,因为每个标记都是一个字符数组。
-
此外,您的内部循环结构是错误的。当您说
while (token != NULL)时,您可以在分配给循环体中的token之前使用*token,但不能在之后使用。你也失去了第一个令牌。想想如何通过一个简单的改变同时解决这两个问题。
标签: c segmentation-fault double-pointer