Typedef数组古怪

时间:2016-07-18 11:52:58

标签: c arrays

我发现了一些我认为已被破坏的代码,但由于我无法理解或找到解释而起作用。如果有人能帮我直截了当,我将非常感激。它在以下片段中进行了演示:

#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) 

但是还有其他事情发生在这里?

2 个答案:

答案 0 :(得分:6)

char_block *char (*)[16]

答案 1 :(得分:2)

f()中,参数b的类型为pointer to 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