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

为什么C语言定义字符串数组需使用*names[]而非names[]

C语言字符串数组两种写法的区别

1. 两种定义的本质差异

  • const char *names[] 是指针数组:数组的每一个元素都是const char*类型的指针,分别指向不同的字符串字面量的首地址。
    你的代码里初始化了4个独立的字符串,数组中依次存储这4个字符串的起始内存地址,因此循环时names[i]拿到的就是对应字符串的首指针,完全匹配printf中%s占位符要求的char*类型参数,运行正常。
  • const char names[] 是普通字符数组:只能存储单个以\0结尾的字符串,无法容纳多个独立字符串。如果你尝试用多个字符串初始化该数组,编译器会直接报语法错误;即使你强行修改为单个字符串初始化,循环时names[i]拿到的是单个char类型的字符值,将这个值作为地址传给%s会触发非法内存访问,直接导致程序崩溃。

2. 替代方案说明

如果你不想用指针数组,也可以选择二维字符数组实现存储多个字符串的需求,写法如下:

// 提前为每个字符串预留足够的存储空间,这里假设最长的字符串不超过10个字符(包含末尾\0)
const char names[4][10] = {
    "dggg",
    "ggq",
    "gg2",
    "g23",
};

这种写法和指针数组的区别是,二维数组会把所有字符串的内容直接存在栈上,需要提前确定每个字符串的最大长度,灵活性低于指针数组。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 08:54:03