假设通用库中的函数在任何情况下都希望使用长整型(例如 64 位),但在我的程序中我想使用短整型(例如 32 位)。然后我遇到了如下情况:
void f(long unsigned int *a) {
*a = 10;
}
void main(void) {
unsigned int b;
f(&b);
return;
}
我是否正确理解,这实际上不是一个好主意,函数 f 将覆盖另外 32 位(内存中
b
之后的位),将 0
写入其中(因为编译器从 进行转换) unsigned int *
到 long unsigned int *
)?但是,如果我想象正确,以下内容将不会覆盖(因为编译器从 long unsigned int
转换为 unsigned int
):
long unsigned int f(void) {
return 10;
}
void main(void) {
unsigned int b;
b = f();
return;
}
正确吗?
第二种实现有一个缺点,如果函数返回计算的其他部分对我来说很方便,并且
10
只是计算的附加细节...
我是否正确理解,这实际上不是一个好主意
是的,这是正确的。
...函数 f 将覆盖另外 32 位(内存中 b 之后的位),将 0 写入其中(因为编译器从
转换为unsigned int *
)?long unsigned int *
这是一种可能性。
unsigned long int*
也可能比 unsigned int*
有更严格的对齐要求,因此它甚至可能在到达那么远之前就崩溃。
如果您有这样的接口,您通常会做的是提供正确类型的变量,然后将其分配给您想要的类型的变量:
void f(unsigned long int *a) {
*a = 10;
}
void main(void) {
unsigned long int tmp;
f(&tmp);
// if (tmp > UINT_MAX) ... // possible error check
unsigned int b = tmp;
}