分段错误(核心转储)c

Posted

技术标签:

【中文标题】分段错误(核心转储)c【英文标题】:Segmentation fault (core dumped) c 【发布时间】:2013-08-14 06:30:14 【问题描述】:

我的代码贴在下面,我很确定在 main() 底部的 while 循环中发生了分段错误。

我的程序必须读取一个文件,数据采用网格形式,fscanf 获取网格的维度,然后创建具有这些维度的二维数组,然后我使用 while 循环逐行遍历并然后一个 for 循环在该行中逐个字符地遍历以将其存储在数组的内部,然后 i++ 将其存储在 2D 数组的下一级。

谁能告诉我为什么这样做?

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    char direction;
    int steps;
    int cur[2];
    char** gridArray;
    int* move(int cur[2]);
    int* getCommand(int next[2], char** gridArray);
    char** make2DFileArray(int sizeX, int sizeY);
    int* makeArray(int size);

    int main(int argc, char *argv[] )
    
            FILE *fp;
            int rows;
            int columns;
            int i=0,j;
            char line[1000];

            if ((argc < 2)^(argc > 3)) 
                    fprintf(stderr, "Usage: thebox mapfile [maxsteps]\n");
                    exit(1);
            
            if( argc < 3 )  steps = 10; 
            else  steps = argv[2]; 

            fp = fopen(argv[1], "r");
            if( fp == NULL) 
                    fprintf(stderr, "Missing map file.\n");
                    exit(1);
            

            fscanf(fp, "%d %d", &rows, &columns);
            gridArray = make2DFileArray(rows+1, columns);

            while ( fgets(line, 1000, fp) != NULL) 
                for(j=0; j < columns - 1; j++) 
                        gridArray[i][j] = line [j];
                
                i++;
                printf("%s", line);
        
        fclose(fp);
        printf("(sidepos)>\n");
        return 0;

还有我的辅助方法,是这个

char** make2DFileArray(int sizeX, int sizeY)

        int i;
        char** array;
        array = (char**) malloc(sizeX*sizeof(char*));

        for (i = 0; i < sizeX; i++) 
                array[i] = (char*) malloc(sizeY*sizeof(char));
                return array;
        
        return array;


int* makeArray(int size)

        int* array;
        array = (int*) malloc(size*sizeof(int));
        return array;

【问题讨论】:

你真的是想写这个if ((argc &lt; 2)^(argc &gt; 3))吗? make2DFileArray() 中的内部return array; 是什么?是不是笔误? 一个好的开始是在调试器中运行你的程序。然后,调试器将在崩溃发生的时间和地点停止。然后,您可以检查函数调用堆栈,如果在您自己的代码中没有发生崩溃,则向上走。调试器还可以让您检查变量的值,以帮助您了解发生崩溃的原因。 如果您仍然无法弄清楚,那么至少在调试器中运行程序,并获取可以附加到您的问题的函数调用堆栈列表。它将帮助我们更快地帮助您。 我不认为我可以通过调试器运行它,它适用于大学,我正在通过 Putty 运行它。是的,如果 argc 小于 2,它会要求更多参数,并且超过 3 个参数也是无效的。啊,make2DFileArray 中的返回数组一直给我警告,直到我把它放进去 【参考方案1】:

错误在make2DFileArray 函数中。您只需在循环中的第一次分配后返回,这意味着只会分配 gridArray[0]

由于不会分配任何其他条目,因此访问例如gridArray[1] 是未定义的行为,也是导致您崩溃的原因。

【讨论】:

所以我应该删除第一个返回数组? @AaronTroeger 是的,你应该这样做,inside 循环不应该存在。 是的,它的工作原理!非常感谢 :) 我似乎总是想念这些愚蠢的小错误【参考方案2】:

这个:

for (i = 0; i < sizeX; i++) 
  array[i] = (char*) malloc(sizeY*sizeof(char));
  return array;


return array;

...应该是:

for (i = 0; i < sizeX; i++) 
  array[i] = (char*) malloc(sizeY*sizeof(char));


return array;

...在你的函数make2DFileArray.

备注:元素被分配了内存,但是其余的元素不是因为你在for循环中的return。 [1 ... length - 1] 数组中的每个元素都是随机内存地址(因为当您 malloc 时,您没有将它们填充为正确的指针),因此取消引用除位置 0 之外的任何元素将导致未定义的行为。

【讨论】:

【参考方案3】:
steps = argv[2]; 

变量“steps”类型为int,变量“argv[2]”类型为char *,不能直接赋值。

你可以这样做

steps = atoi(argv[2]);

【讨论】:

在这种情况下atoi() 是未保存的,因为它返回0,以防无法将其参数(此处:arg[2])转换为int。一种安全的方法是使用strtol() 将“字符串”转换为整数。

以上是关于分段错误(核心转储)c的主要内容,如果未能解决你的问题,请参考以下文章

C中的Minishell“分段错误,核心转储”错误

c中的分段错误(核心转储)

分段错误(核心转储)

分段错误(核心转储)c

在 C++ 中的向量中键入所有值后出现分段错误(核心转储)

在opencv c ++中查找图像卷积时出现分段错误(核心转储)错误