结构中字符指针的内存分配

我试着自学C语言,我正在努力解决它看起来是一个非常基本的问题。我有一个带有字符指针的结构,我想动态分配内存并在完成后释放它。我的理解是,我需要为struct和char指针分配内存,但看起来我缺少了一些东西,因为我在sprintf行上遇到了分段错误

作为理解和使用mallocfree的练习,我试图构建一个简单的程序,该程序将int作为输入,并输出一个包含从0到输入的所有数字的阶乘的表。每个表项都有其索引(int)、阶乘(long-long-int)的结果和结果,但采用字符数组格式(这是有问题的)

以下是我到目前为止所拥有的:

#包括<stdlib.h>
#包括<errno.h>
#包括<标准h>
#包括<字符串.h>
#包括<数学h>
#定义限制20
结构条目
{/*每个表项的定义*/
int n;
长内特里;
char*str;
};
无效呼叫(字符*m)
{
fprintf(stderr,s\n,m);
出口(0);
}
int main(int argc,char*argv[])
{
int n;
int i;
结构项*事实表;
如果(argc!=2)
呼喊(“参数错误”);
n=atoi(argv[1]);
如果(n<0)
喊叫(太小了);
如果(n>限制)
大喊大叫(“n太大”);
//为结构分配内存
事实表=(结构项*)malloc((n+1)*sizeof(结构项));
if(事实表==NULL){
大喊大叫(“马洛克”);
}
//计算阶乘
事实表[0]。n=0;
事实表[0]。lli=事实表[1]。n=事实表[1]。lli=1;//0!=1!=1
事实表[0]。str=事实表[1]。str=“1”;;
对于(i=2;i<=n;i++){
事实表[i].n=i;
事实表[i].lli=i*事实表[i-1].lli;//N!=N*(N-1)!
int digits=log10(fact_table[i].lli)+1;//获取结果的位数以分配结果中的内存
事实表[i].str=malloc((位数+1)*sizeof(字符));
if(事实表[i].str=NULL){
大喊大叫(“马洛克”);
}
sprintf(事实表[i].str,“lld”,事实表[i].lli);//转换为字符串。此处出错
}
//打印阶乘表
对于(i=0;i<=n;i++)
{
printf("%d%lld%s\n",事实表[i].n,事实表[i].lli,事实表[i].str);
}
//空闲内存
对于(i=0;i<=n;i++){
自由(事实表[i].str);
}
免费(事实表);
返回0;
}

在为事实表[I].str分配内存时,我可能遗漏了一些非常明显的东西,并且犯了一个愚蠢的错误,但我正在努力使它正常工作

除了关于为n>释放内存的注释之外:2、如果您在malloc之后查看您的测试:

if(事实表[i].str=NULL){

您正在将指针设置为NULL。相反,您应该编写:

事实表[i].str=malloc((数字+1)*sizeof(字符));
if(事实表[i].str==NULL){
大喊大叫(“马洛克”);
}

这里有一些小小的建议。如果您使用-Wall进行编译,则此错误会在大多数编译器上生成警告:

fact.c:在函数“main”中:
事实.c:53:9:警告:建议在用作真值的赋值周围加括号[-wParenthes]
if(事实表[i].str=NULL){
^~~~~~~~~~

此外,为了确保编译器在忘记=时会抱怨,您可以比较变量和常量的值,将常量放在左侧:如果您编写if(NULL=fact\u table[i].str),编译器会抱怨并通知您错误

发表评论