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

为什么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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 04:45:04