You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
}

关键说明

  1. 字符串复制:C语言中不能直接用=复制数组,必须用字符串处理函数。strncpy比strcpy更安全,它限制了复制的长度,避免目标数组溢出。
  2. 字符串结束符:strncpy如果源字符串长度超过目标数组长度,不会自动添加'\0',所以需要手动设置最后一个字符为'\0',保证printf能正确识别字符串结束位置。
  3. 内存检查与释放:malloc可能失败,必须检查返回值;使用完动态分配的内存后要调用free,防止内存泄漏。

内容的提问来源于stack exchange,提问作者programmer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 03:33:31