我在C中编写哈希游戏,我使用malloc
来为表格分配内存。但是,当我编译程序时,我遇到了分段错误。使用调试器我能够找到一个错误:显然,我不能使用malloc,因为它无法找到malloc.c或类似的东西。这是代码(发生段错误的地方):
int inicializaTabuleiro(char *ptrTabuleiro)
{
//Aloca memória para o tabuleiro
ptrTabuleiro = malloc(9);
//Verifica se a memória foi alocada
if(!ptrTabuleiro)
return 0;
int contadorPosicao;
//Preenche o tabuleiro com '-'
for(contadorPosicao = 0; contadorPosicao < 9; contadorPosicao++)
ptrTabuleiro[contadorPosicao] = '-';
return 1;
}
对可能导致什么的任何想法?附加信息:在Linux Mint上使用带有GCC编译器的代码块。谢谢你的时间!
答案 0 :(得分:4)
问题不在您的代码段中,这很好,主要是。问题是你没有将指针返回给调用者!在C中,参数按值传递,因此如果您执行以下操作:
char *arr;
mycharalloc(arr);
arr[3] = 'X'; /* <-- arr is still uninitialized! */
mycharalloc使用其本地arr副本来存储新创建的指针,但调用者arr内部未受影响。因此,arr是一个随机指针,下次你写一些东西时,你会得到段错误。
我建议您将功能更改为:
char *inicializaTabuleiro()
{
//Aloca memória para o tabuleiro
char *ptrTabuleiro = malloc(9);
//Verifica se a memória foi alocada
if(!ptrTabuleiro)
return NULL;
int contadorPosicao;
//Preenche o tabuleiro com '-'
for(contadorPosicao = 0; contadorPosicao < 9; contadorPosicao++)
ptrTabuleiro[contadorPosicao] = '-';
return ptrTabuleiro;
}
然后在来电者中:
char *myTable = inicializaTabuleiro();
if (!myTable)
error();
答案 1 :(得分:2)
您显然正在初始化将在函数外部使用的内容。所以你需要一个更多级别的间接。将指针类型更改为char**
。
int inicializaTabuleiro(char **ptrTabuleiro)
{
//Aloca memória para o tabuleiro
*ptrTabuleiro = malloc(9);
//Verifica se a memória foi alocada
if(!*ptrTabuleiro)
return 0;
int contadorPosicao;
//Preenche o tabuleiro com '-'
for(contadorPosicao = 0; contadorPosicao < 9; contadorPosicao++)
(*ptrTabuleiro)[contadorPosicao] = '-';
return 1;
}
并且这样打电话:
char *ptrTabuleiro;
if( inicializaTabuleiro( &ptrTabuleiro ) )
{
/* now you can use ptrTabuleiro */
}