0

我的代码发布在下面,我很确定分段错误发生在 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;
}
4

3 回答 3

4

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

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

于 2013-08-14T06:36:49.463 回答
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中。

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

于 2013-08-14T06:39:36.100 回答
1
steps = argv[2]; 

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

你可以这样做

steps = atoi(argv[2]);
于 2013-08-14T08:09:16.100 回答