【发布时间】:2017-01-17 12:26:59
【问题描述】:
我正在尝试将内存分配给函数内的 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");
}
}
【问题讨论】:
-
所有
*Str[i]都应该是(*Str)[i]。 -
与您的问题无关,但
sizeof(char)根据定义始终为 1。并且您不应该从malloc()和朋友那里投射返回值。 -
您的
AllocateDeallocate函数会查看*Str以将其与NULL进行比较——但调用者从未给header1一个值,所以您正在查看垃圾。 -
旁注:三个间接级别
char*** Str似乎过分了。您可能需要重新考虑您的设计。 -
对我来说,让一个函数同时进行分配和释放的设计似乎有缺陷。这将使代码更难阅读和维护,尤其是使用magic numbers。