我有一个包含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
答案 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数组访问时,都必须进行转换。
否则,您可以在开头将其定义为数组,而根本不需要内存分配。