为何int数组名返回首元素地址,char数组名表现不同?
问题原因与char数组处理机制解析
核心结论:数组名的本质是统一的
C语言里,不管是int数组还是char数组,数组名在绝大多数表达式中都会自动转换为指向数组首元素的指针,两者没有本质区别。你看到的差异,完全是printf格式符和参数类型不匹配导致的。
你的代码问题分析
先看你写的代码:
#include <stdio.h> int main() { char c[3] = {'s', 'a', 'h'}; int a[3] = {1, 2, 3}; printf("%c\n", c); printf("%d\n", a); return 0; }
printf("%c\n", c);的问题:%c格式符要求传入单个char类型的参数,但这里c被转换为char*(指向首元素的指针),属于类型不匹配,是C语言中的未定义行为。- 实际运行时,程序会把指针的内存地址值(一个整数)的低字节当成
char来打印,所以输出的是一个随机的ASCII字符,和你预期的完全不符。
printf("%d\n", a);的问题:%d格式符要求传入int类型的参数,但这里a被转换为int*指针,同样是类型不匹配的未定义行为。- 32位系统下可能刚好输出地址的数值,但这是巧合;64位系统下指针是8字节,
int通常是4字节,会截断地址,结果必然错误。
正确的用法
- 如果要打印数组的首地址,不管是int还是char数组,都要用
%p格式符(专门用于打印指针):printf("%p\n", (void*)c); // 强制转void*是C标准的要求 printf("%p\n", (void*)a); - 如果要打印char数组的元素:
- 单个元素:
printf("%c\n", c[0]);(打印首元素's') - 整个数组内容:注意
%s要求数组以'\0'结尾,否则会越界读取。可以修改数组初始化:char c[4] = {'s', 'a', 'h', '\0'}; // 手动加结束符,或者直接用字符串初始化:char c[] = "sah"; printf("%s\n", c); // 输出sah
- 单个元素:
内容的提问来源于stack exchange,提问作者Sahil Nayak
相关产品推荐
相关产品推荐

