如何将char数组内容存入结构体char*成员,避免仅输出最后一次值
问题原因
你遇到的输出异常是指针指向错误导致的:
- 你定义的
char buf[20]是函数栈上的局部数组,内存地址固定,你直接将buf赋值给str_fact,本质是让所有struct fact_entry的str_fact指针都指向同一块栈内存 - 每次循环
sprintf都会覆盖buf里的旧内容,因此所有指针最终指向的内存里只保存了最后一次计算的阶乘字符串,遍历输出时自然全部显示最后一次的结果
修正代码
第一处修改(阶乘计算部分)
把直接赋值buf地址的逻辑,改为申请堆内存复制字符串内容:
/* Your code starts here */ // Allocate memory // Compute fact(n) for i=0 to n fact_table = calloc(n+1, sizeof(struct fact_entry)); long long int f=1; char buf[20]; for (i = 0; i <= n; i++) { if (i == 0) { f = f * i + 1; } else{ f=f*i; } sprintf(buf, "%lld", f); printf("%s\n", buf); fact_table[i].n = i; fact_table[i].lli_fact = f; // 申请堆内存存储字符串,长度要算上末尾的'\0' fact_table[i].str_fact = malloc(strlen(buf) + 1); strcpy(fact_table[i].str_fact, buf); } /* Your code ends here */
如果你的编译环境支持POSIX标准,也可以直接用strdup简化写法,替换上面两行malloc和strcpy为:
fact_table[i].str_fact = strdup(buf);
注:如果编译提示
strlen、strcpy未定义,需要在文件头部引入<string.h>头文件。
第二处修改(内存释放部分)
原来的free只释放了结构体数组的内存,每个str_fact申请的堆内存需要先单独释放,避免内存泄漏:
/* Your code starts here */ // Free memory for (i = 0; i <= n; i++) { free(fact_table[i].str_fact); } free(fact_table); /* Your code ends here */
内容的提问来源于stack exchange,提问作者Charles De Labra
相关产品推荐
相关产品推荐

