【发布时间】:2020-04-07 09:00:19
【问题描述】:
void * ptr = NULL; // array of unspecified 13-byte type
for (int i = 0; i < 10; i++) {
printf("%i ", ((char (*) [13]) ptr) + i);
}
putchar('\n');
输出:
0 13 26 39 52 65 78 91 104 117
所以这行得通(至少在 GCC 上),但是我如何声明一个 (char (*) [13] 类型的变量,这样我就不必在每次我想对该指针执行指针算术时都进行这种转换?
这种行为是否可移植?
【问题讨论】:
-
首先,您的程序有一个未定义的行为,因为无效指针上的指针算术是 UB。其次,你“对象”的大小是
13,是一个大小为13的char数组,即char x[13]; -
"%i"用于int,而不是指针。最好使用printf("%p ", (void*) some_object_pointer_expression); -
我知道,这只是为了提高可读性,
%p的输出将是这样的:(nil) 0xd 0x1a 0x27 0x34 0x41 0x4e 0x5b 0x68 0x75当然,在我的实际代码中我永远不会这样做。
标签: c void-pointers pointer-arithmetic