可能涉及范围的段错误问题
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
作为二维数组访问时,都必须对其进行转换。
否则一开始就定义成数组,根本不需要分配内存
我有一个包含 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
作为二维数组访问时,都必须对其进行转换。
否则一开始就定义成数组,根本不需要分配内存