为什么C语言中字符数组声明时赋值有效,后续直接赋值却不生效?
问题解答
两段代码的运行差异原因
第一段可正常运行的代码逻辑
该代码属于字符数组声明阶段的初始化操作,C语言语法原生支持该写法:编译器会自动将字符串字面量"Johnathan"的所有字符(包括末尾自动补的空终止符\0)按顺序写入personName数组的对应内存空间,printf用%s读取时能正常识别到完整字符串。
第二段代码无法正常运行的核心原因
personName[20] = "Johnathan"存在两个致命错误:
- 数组下标越界:长度为20的字符数组合法下标范围是
0~19,personName[20]本身就是数组外的非法内存地址 - 语法逻辑错误:C语言不允许直接用
=给已声明的整个字符数组赋值,此处你实际是把字符串字面量"Johnathan"的内存地址,强制赋值给了越界的char类型内存单元,不仅类型不匹配,personName数组本身的内存区域完全没有被写入目标字符串,printf读取时只会读到数组里的随机垃圾值,自然无法正常输出。
已声明字符数组的字符串赋值方案
要实现需求,请使用C标准库提供的strcpy字符串拷贝函数,操作示例如下:
#include <stdio.h> // 必须引入字符串操作相关头文件 #include <string.h> int main() { char personName[20]; // 调用strcpy完成赋值:第一个参数是目标数组,第二个参数是源字符串 strcpy(personName, "Johnathan"); printf("%s", personName); return 0; }
注意:请确保目标字符数组的长度足够容纳源字符串的所有字符+末尾的
\0终止符,否则会触发缓冲区溢出问题,引发程序崩溃或不可预知的错误。
内容的提问来源于stack exchange,提问作者tasminemma
相关产品推荐
相关产品推荐

