Segfault问题可能涉及范围

时间:2015-05-09 15:59:39

标签: c arrays segmentation-fault

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

我已尝试使用lldb进行调试,但发现它似乎无法找到我尝试设置它们的任何位置。 头文件的相关部分如下;

        #ifndef _VECTORDATA_H_
            #define _VECTORDATA_H_
        #include "vectorAPI.h"

        char** globalScreen;
        #endif

1 个答案:

答案 0 :(得分:3)

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

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作为2D数组访问时,都必须进行转换。

否则,您可以在开头将其定义为数组,而根本不需要内存分配。