-4
char a[] = {'A'};
printf(This is random value %c", &a[0] );
4

2 回答 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 回答