char a[] = {'A'};
printf(This is random value %c", &a[0] );
问问题
55 次
2 回答
1
该程序调用未定义的行为,因为%c
它不是地址的正确转换说明符。使用%p
, 并将参数转换为(void*)
.
注意:如果参数是 type char*
,则强制转换是可选的,但对于任何其他类型,强制转换是必需的。
于 2021-09-16T06:04:59.750 回答
0
您打印的地址不正确。
%c
用于打印字符。要打印地址,请使用%p
并将指针参数(即地址)转换为 void-pointer。喜欢
printf(This is random value %p", (void*)&a[0] );
C 标准没有定义你的程序应该发生什么。所以原则上任何事情都可能发生,结果可能是随机值。没有人可以确定您的代码会做什么(没有您正在使用的特定系统的专家级知识)。
但是,在大多数系统上,您的代码将从指针中获取 1 个字节并将其打印为就好像它是一个字符一样。因此,“随机字符”的(可能)原因是每次启动程序时数组的地址都不同。这正是许多系统所做的......
他们使用“地址空间布局随机化”。这基本上意味着程序中事物的地址(这里是数组)是在程序启动期间随机确定的。这个想法是让黑客更难利用你的程序。
在此处阅读更多信息:https ://en.wikipedia.org/wiki/Address_space_layout_randomization
于 2021-09-16T06:44:20.013 回答