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

C语言结构体字符串变量赋值疑问:为何直接赋值语句无效?

问题分析与解答

核心错误:s1.name[10] = "Tom";无效的原因

这条语句存在两个致命问题:

  1. 数组下标越界
    s1.name是长度为10的字符数组,合法下标范围是0~9,name[10]访问的是数组边界外的内存空间,属于未定义行为,会破坏内存布局,直接导致程序运行异常。
  2. 类型不匹配
    字符串字面量"Tom"在C语言中本质是指向字符的指针(char *类型),而name[10]是单个char类型变量。把指针类型的值赋值给字符类型,编译器会抛出类型不匹配的错误,属于语法层面的错误,根本无法通过编译。

额外补充:为什么不能直接给字符数组赋值?

C语言中,字符数组的数组名是地址常量,它指向数组首元素,但不能作为赋值操作的左操作数。比如name = "Tom";这种写法同样错误,因为数组名不能被重新赋值。如果要给字符数组填充字符串,必须使用字符串操作函数(如strcpy),或者在数组初始化时直接赋值。

修正后的代码示例

#include <stdio.h>
#include <string.h> // 必须包含strcpy所在的头文件

struct Student {
    char name[10];
    int age;
    double gpa;
};

int main(void)
{
    struct Student s1;
    s1.age = 20;
    s1.gpa = 4.3;
    strcpy(s1.name, "Tom"); // 使用strcpy给字符数组赋值

    printf("%s", s1.name);

    return 0;
}

或者直接在初始化时赋值(更简洁):

#include <stdio.h>

struct Student {
    char name[10];
    int age;
    double gpa;
};

int main(void)
{
    struct Student s1 = {"Tom", 20, 4.3}; // 初始化时直接赋值字符串

    printf("%s", s1.name);

    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 06:06:28