我有一个头文件,其中包含char** globalScreen,我在函数中分配了内存,当程序在main.c中启动时就调用这个函数。
我已按以下方式分配内存;

    char (*globalScreen)[SSIZEY] = malloc(SSIZEX * SSIZEY * sizeof(char*));

    int i,j;
    for(i = 0;i < SSIZEX;i++)
    {
        for(j = 0; j < SSIZEY;j++)
        {
            globalScreen[i][j] = (char)0x41;
        }
    }

也初始化了数组。
然后我可以成功地打印整个数组,但只能从我分配并初始化它的函数内部进行。当我试图在调用初始化数组的函数后从main访问数组时-程序segfaults。
我试过用lldb调试,但发现它似乎找不到我试图设置它们的任何位置。
头文件的相关部分如下:;
        #ifndef _VECTORDATA_H_
            #define _VECTORDATA_H_
        #include "vectorAPI.h"

        char** globalScreen;
        #endif

最佳答案

我假设你的初始化函数是这样的:

void initialize()
{
    char (*globalScreen)[SSIZEY] = malloc(SSIZEX * SSIZEY * sizeof(char*));
    // rest of code
}

这意味着它声明了一个名为globalScreen的新变量,而不是给全局变量赋值。
此外,如果未将globalScreen声明为不带强制转换的数组,则不能将其作为2D数组访问。此外,如果您只需要一个2D数组,那么使用指针char **而不是单个指针char *是多余的。
请改为使用以下代码:
char * globalScreen;

void initialize()
{
    globalScreen = (char *) malloc(SSIZEX * SSIZEY * sizeof(char*));

    char (*tmp)[SSIZEY] = globalScreen;

    int i,j;
    for(i = 0;i < SSIZEX;i++)
    {
        for(j = 0; j < SSIZEY;j++)
        {
            tmp[i][j] = (char)0x41;
        }
    }
}

每次想以二维数组的形式访问globalScreen时,都必须对其进行强制转换。
否则,可以在开始时将其定义为数组,而根本不需要内存分配。

关于c - 段故障可能涉及范围,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30142089/

10-09 13:26