无法弄清楚我是如何得到一个段错误的

Sha*_*ars 0 c struct segmentation-fault

我应该为我的char**分配足够的内存.我使用gdb并找到了分段错误的要点.我已经被困在这个部分大约一个小时,似乎无法弄清楚为什么我会分裂.

计划产出:

大小:10,20

开始:1,1

结束:10,20

分段故障(核心转储)

10 = m1.xsize
20 = m1.ysize
1 = m1.xstart
1 = m1.ystart
10 = m1.xend
20 = m1.yend
Run Code Online (Sandbox Code Playgroud)

我的代码片段:

typedef struct mazeStruct
{
    char** arr;
    int xsize, ysize;
    int xstart, ystart;
    int xend, yend;
} maze;



/* read in the size, starting and ending positions in the maze */
    fscanf (src, "%d %d", &m1.xsize, &m1.ysize);
    fscanf (src, "%d %d", &m1.xstart, &m1.ystart);
    fscanf (src, "%d %d", &m1.xend, &m1.yend);

    /* print them out to verify the input */
    printf ("size: %d, %d\n", m1.xsize, m1.ysize);
    printf ("start: %d, %d\n", m1.xstart, m1.ystart);
    printf ("end: %d, %d\n\n", m1.xend, m1.yend);

    //allocating memory for 2d char array
    m1.arr = (char**)malloc(m1.xsize+2 * sizeof(char*));

    for(i = 0; i < m1.xsize+2; i++)
        m1.arr[i] = (char*)malloc(m1.ysize+2);

    /* initialize the maze to empty */
    for (i = 0; i < m1.xsize+2; i++) <---- when i = 6 it seg faults
        for (j = 0; j < m1.ysize+2; j++)
            m1.arr[i][j] = '.';
Run Code Online (Sandbox Code Playgroud)

我没有分配足够的内存或我做错了什么?

pax*_*blo 5

你的表达:

m1.xsize + 2 * sizeof(char*)
Run Code Online (Sandbox Code Playgroud)

相当于:

(m1.xsize) + (2 * sizeof(char*))
Run Code Online (Sandbox Code Playgroud)

由于运营商的优先权,这不是你想要的.您需要改为使用:

(m1.xsize + 2) * sizeof(char*)
Run Code Online (Sandbox Code Playgroud)

举个例子,假设您已m1.xsize设置为20,指针大小为4个字节.因此,您需要22个指针的空间,即88个字节.该表达式m1.xsize + 2 * sizeof(char*)为您提供20加上指针大小的两倍,总共28个字节,远远不足以满足您的需求.


另外,您还应该停止转换返回值,malloc()因为它可以隐藏某些微妙的错误.C完全能够隐式地将void*返回的内容malloc()转换为任何其他指针类型.