为什么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
相关产品推荐
相关产品推荐

