类型定义数组的奇怪行为

3

我遇到了一些代码,我原以为它是有问题的,但由于某些我无法理解或找到解释的原因,它却能正常工作。如果有人能给我指点迷津,我将不胜感激。以下是示例代码:

#include <stdio.h>

typedef char char_block[16];

void f(char_block *b) {
    printf("block 0x%p - b\n",   b);
    printf("block 0x%p - *b\n", *b);
}

main() {
    char_block b = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 };
    f(&b);
}

使用g+编译并执行,会打印出以下内容:
block 0x0x7fff4794b4e0 - b
block 0x0x7fff4794b4e0 - *b

我曾天真地认为

将参数声明为“类型的数组”应调整为“类型的限定指针”

意味着该函数将等同于

void f(char ** b) 

但这里还有其他事情发生了吗?

代码没有实现“类型为数组”的参数声明,而是实现了“类型为[指向]数组”的参数声明。 - alk
2个回答

6

char_block * 等同于 char (*)[16]


2
在函数f()中,参数b的类型为指向char_block数组的指针(指向长度为16的字符数组);*b的类型为char[16]。在大多数情况下,使用*b会将该类型转换为指向数组第一个元素(类型为char*)的指针。
在一些当前的C实现中,char(*)[16]char*类型的值可以安全地解释为void*,这是%p格式说明符所期望的类型。
请注意,按照标准,将char(*)[16]char*解释为void*类型的值并不保证成功。为了安全起见,您应该进行强制类型转换。
    printf("block 0x%p - b\n",   (void*)b); // b has type char(*)[16]
    printf("block 0x%p - *b\n", (void*)*b); // *b is converted to type char*
    sizeof *b == 16; // no conversion when used as argument to sizeof operator

1
现在有意义了 - 解除引用的值别无选择,只能退化为指针。非常邪恶。感谢大家的帮助。 - user268385

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接