C语言中对数组元素取地址&后用%c输出为何得到随机值?
问题原因分析
出问题的代码如下:
char a[] = {'A'}; printf("This is random value %c", &a[0] );
输出随机值的核心原因是printf参数类型和格式控制符要求不匹配,触发了C语言的未定义行为,具体拆解:
printf的%c格式控制符要求对应位置传入的是字符类型的实际值,也就是ASCII码数值,但代码里传入的是&a[0],即数组首元素的内存地址,属于指针类型,参数类型完全不匹配。- 程序运行时会错误把传入的内存地址的低8位(
char类型通常占1字节,对应8位)当做ASCII码解析为字符输出。而现代操作系统普遍开启ASLR(地址空间布局随机化),程序运行时的变量内存地址每次启动都会随机变化,所以解析出来的字符也会是随机值。
修正方案
如果要正确输出字符A,不需要对a[0]取地址,直接传入元素本身即可:
char a[] = {'A'}; printf("This is correct value %c", a[0] );
内容的提问来源于stack exchange,提问作者SK Singh
相关产品推荐
相关产品推荐

