Answers:
该typedef将是
typedef char type24[3];
但是,这可能是一个非常糟糕的主意,因为结果类型是数组类型,但是使用它的用户不会看到它是数组类型。如果用作函数参数,它将通过引用而不是通过值传递sizeof
,因此它将是错误的。
更好的解决方案是
typedef struct type24 { char x[3]; } type24;
您可能还想使用unsigned char
而不是char
,因为后者具有实现定义的签名。
从R ..的答案:
但是,这可能是一个非常糟糕的主意,因为结果类型是数组类型,但是使用它的用户不会看到它是数组类型。如果用作函数参数,它将通过引用而不是通过值传递,并且它的sizeof将是错误的。
没有看到它是数组的用户很可能会写这样的东西(失败):
#include <stdio.h>
typedef int twoInts[2];
void print(twoInts *twoIntsPtr);
void intermediate (twoInts twoIntsAppearsByValue);
int main () {
twoInts a;
a[0] = 0;
a[1] = 1;
print(&a);
intermediate(a);
return 0;
}
void intermediate(twoInts b) {
print(&b);
}
void print(twoInts *c){
printf("%d\n%d\n", (*c)[0], (*c)[1]);
}
它将编译并显示以下警告:
In function ‘intermediate’:
warning: passing argument 1 of ‘print’ from incompatible pointer type [enabled by default]
print(&b);
^
note: expected ‘int (*)[2]’ but argument is of type ‘int **’
void print(twoInts *twoIntsPtr);
^
并产生以下输出:
0
1
-453308976
32767
数组不能通过C中的值作为函数参数传递。
您可以将数组放入结构中:
typedef struct type24 {
char byte[3];
} type24;
然后按值传递该值,但当然使用起来不太方便:x.byte[0]
代替x[0]
。
您的函数type24_to_int32(char value[3])
实际上是通过指针传递的,而不是通过值传递的。它与完全等效type24_to_int32(char *value)
,并且3
被忽略。
如果您乐于通过指针传递,则可以坚持使用数组并执行以下操作:
type24_to_int32(const type24 *value);
这将传递一个指向数组的指针,而不是指向第一个元素的指针,因此您可以将其用作:
(*value)[0]
我不确定这真的有好处,因为如果您不小心写value[1]
了,就会发生一些愚蠢的事情。
decay
某处提及该术语来改善此答案(也许可以指出,返回数组的情况更糟-根本不起作用)。
这是一个简短的示例,说明为什么typedef数组可能会令人困惑地不一致。其他答案提供了一种解决方法。
#include <stdio.h>
typedef char type24[3];
int func(type24 a) {
type24 b;
printf("sizeof(a) is %zu\n",sizeof(a));
printf("sizeof(b) is %zu\n",sizeof(b));
return 0;
}
int main(void) {
type24 a;
return func(a);
}
这产生输出
sizeof(a) is 8
sizeof(b) is 3
因为type24作为参数是指针。(在C语言中,数组始终作为指针传递。)幸好,gcc8编译器默认会发出警告。
type24 foo
,会是什么尺寸,类型和含义foo
,*foo
,**foo
,&foo
,和&&foo
?这些年来,这些表达的含义和合法性是否发生了变化?