我有一个头文件,其中包含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/