我正在尝试将内存分配给函数内的char指针。但是我在for cycle at i=1
中的函数内部出现了分段错误。对于i=0
,它分配内存。我正在努力解决这个问题。也许其他“眼睛”可以看出出了什么问题。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
void AllocateDeallocate(int, int, int, char***);
int main(void)
{
char** header1;
char** header2;
AllocateDeallocate(1,3,40,&header1);
return 0;
}
void AllocateDeallocate(int iopt, int nStr, int StrLen, char*** Str)
{
int i;
switch (iopt)
{
case 1:
if (NULL == Str)
{
exit(EXIT_FAILURE);
}
if(*Str == NULL)
{
*Str = (char**)malloc(sizeof(char*)*nStr);
if (*Str== NULL)
{
puts("Memory allocation failed.");
exit(EXIT_FAILURE);
}
}
for(i = 0 ; i< nStr;i++)
{
printf("String %d allocation\n",i);
*Str[i] = (char*)malloc(sizeof(char)*(StrLen+1));
if (*Str[i] == NULL)
{
puts("Memory allocation failed.");
exit(EXIT_FAILURE);
}
}
break;
case 2:
for( i = 0; i<nStr; i++)
{
free(*Str[i]);
}
free(*Str);
break;
default:
printf("Wrong Option");
}
}
答案 0 :(得分:3)
当您调用函数AllocateDeallocate
时,变量header1
未初始化。这意味着函数*Str
内部存在不确定值(并且看似随机)。
然后使用*Str
(例如在*Str == NULL
中)会导致问题(因为该值很可能 等于NULL
)
简单的解决方案?初始化main
函数中的变量:
char** header1 = NULL;
char** header2 = NULL;
一旦你解决了上述问题,你就会有其他问题。就像你做*Str[i]
时一样。由于operator precedence规则,它等于*(Str[i])
,而不是您想要的。您需要明确使用括号来(*Str)[i]
。
上述两个问题都会导致未定义的行为,并可能导致崩溃。