【问题标题】:segmentation fault double pointer分段错误双指针
【发布时间】: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);

}

【问题讨论】:

  • 故障发生时ijntoken的值是多少?
  • 您可以对您的程序运行 valgrind 并在此处发布结果吗?
  • 如果你想要一个行数组,而每一行都是一个标记数组,你需要一个 3D 数组,因为每个标记都是一个字符数组。
  • 此外,您的内部循环结构是错误的。当您说while (token != NULL) 时,您可以在分配给循环体中的token 之前使用*token,但不能在之后使用。你也失去了第一个令牌。想想如何通过一个简单的改变同时解决这两个问题。

标签: c segmentation-fault double-pointer


【解决方案1】:
while(token != NULL){
    printf("%s\n", token);
    token = strtok(NULL,s); // A
    plaintexts[i][j]=(unsigned char) (*token); // B

    j++;
}

如果此循环至少运行一次,它将以段错误结束。为什么?直到token 在我标记为A 的行中设置为NULL,然后在我标记为B 的行中取消引用,循环才能终止。取消引用 NULL 会导致段错误。

【讨论】:

  • 感谢 David,它解决了这个分割问题(​​我倒转了 A 和 B 行),但是当我对纯文本 [i] 执行 malloc 时,我现在有另一个 i=1...
  • 您需要学习如何排除故障。了解如何准确识别导致段错误的代码行以及该代码行的哪些错误导致段错误。
  • 我同意你的观点,大卫,只是这个问题应该是我必须为学校做的一个更大的项目的一个细节,我正在努力尽快解决它,我想我不明白双指针和二维数组是如何工作的,我必须复习一下
  • 尝试解释 free(token)free(str) 在那里做什么。你释放他们多少次?你 malloc 多少次?
  • 谢谢!当我删除 'free(str)' 时不再出现 Seg 错误!我不明白为什么......它只是释放 str 指向的区域,我看不到与 malloc 的纯文本 [i] 的链接
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-02
  • 2012-04-01
相关资源
最近更新 更多