C语言结构体char成员赋值多字符报错及仅打印末位问题咨询
触发警告及输出异常的原因
char类型的存储限制
C语言中char类型仅能存储1字节长度的单个ASCII字符,使用单引号'包裹的内容如果是单个字符(如'X'),属于合法的char类型字面量,赋值给char类型变量不会报错,运行输出也正常,这就是你给name赋值'X'没有问题的原因。
如果单引号内包裹了多个字符,这种语法属于多字节字符常量,本质是int类型,默认最大长度和系统的int长度一致(通常为4字节),超过该长度就会触发编译器的长度过长警告。你的代码中'Character'包含9个字符,远超过长度限制,因此会抛出警告。仅打印最后一位字符的原因
C语言标准没有对多字节字符常量的存储规则做强制统一,但目前主流编译器(GCC、MSVC等)都默认采用小端序存储多字节字符常量,即把字符序列的最后一个字符存储在最低地址位。
当你把多字节字符常量赋值给1字节的char类型变量时,编译器只会截取最低地址位的1个字节写入变量,也就是取到了最后一个字符r,因此打印fav_char时只会输出r。
修复建议
如果你需要存储字符串(多个字符),可以将结构体中对应的字段修改为字符数组,赋值时使用strcpy函数,示例修改如下:
#include<stdio.h> #include<string.h> struct Student { int id; int marks; // 改为字符数组,长度可根据需要调整 char fav_char[20]; char name[20]; }; int main() { struct Student s1; s1.id = 1; s1.marks = 90; // 字符串需要用双引号包裹,用strcpy赋值给字符数组 strcpy(s1.fav_char, "Character"); strcpy(s1.name, "X"); printf("The favorite character is %s \n" , s1.fav_char); printf("The name is %s" , s1.name); return 0; }
内容的提问来源于stack exchange,提问作者Chetxn04
相关产品推荐
相关产品推荐

