C语言中结构体char数组赋值后无法输出内容的原因
问题原因及解决方法
核心错误点
你的代码里给结构体char数组赋值的方式完全错误:
x->name[20] = arr[20];这行代码只尝试给name数组的第21个位置(数组下标从0开始,name[20]超出了char name[20]的合法范围)赋值了arr的第21个字符,这根本不是复制整个字符串的操作。- 而且
arr[20]本身也超出了传入的name[20]数组的范围,原字符串"Arthur morgan"长度远小于20,这个位置的内容是不确定的。
另外还有个小问题:你在assign函数里直接把age写死成21,没有使用传入的参数值。
修正后的代码
#include <stdio.h> #include <string.h> #include <stdlib.h> struct person { char name[20]; int age; }; struct person *assign(char arr[], int age) { struct person *x = malloc(sizeof(struct person)); if (x == NULL) { // 务必检查malloc是否成功 perror("malloc failed"); exit(EXIT_FAILURE); } // 使用strncpy复制字符串,避免缓冲区溢出 strncpy(x->name, arr, sizeof(x->name) - 1); x->name[sizeof(x->name) - 1] = '\0'; // 确保字符串以'\0'结尾 x->age = age; // 使用传入的age参数 return x; } int main() { char name[20] = "Arthur morgan"; int age = 34; struct person* person1 = assign(name, age); printf("name: %s\n", person1->name); printf("age: %d\n", person1->age); free(person1); // 记得释放malloc分配的内存,避免内存泄漏 return 0; }
关键说明
- 字符串复制:C语言中不能直接用
=复制数组,必须用字符串处理函数。strncpy比strcpy更安全,它限制了复制的长度,避免目标数组溢出。 - 字符串结束符:
strncpy如果源字符串长度超过目标数组长度,不会自动添加'\0',所以需要手动设置最后一个字符为'\0',保证printf能正确识别字符串结束位置。 - 内存检查与释放:
malloc可能失败,必须检查返回值;使用完动态分配的内存后要调用free,防止内存泄漏。
内容的提问来源于stack exchange,提问作者programmer
相关产品推荐
相关产品推荐

