可能涉及范围的段错误问题

Segfault issue possibly involving scope

我有一个包含 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 访问数组时 - 在调用我的初始化数组的函数 - 程序段错误。

我尝试使用 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 声明为一个二维数组,则您无法将其作为二维数组访问。此外,如果您只想要一个二维数组,那么使用指向指针的指针 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作为二维数组访问时,都必须对其进行转换。

否则一开始就定义成数组,根本不需要分配内存