C语言结构体字符串变量赋值疑问:为何直接赋值语句无效?
问题分析与解答
核心错误:s1.name[10] = "Tom";无效的原因
这条语句存在两个致命问题:
- 数组下标越界
s1.name是长度为10的字符数组,合法下标范围是0~9,name[10]访问的是数组边界外的内存空间,属于未定义行为,会破坏内存布局,直接导致程序运行异常。 - 类型不匹配
字符串字面量"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
相关产品推荐
相关产品推荐

