将不同类型的指针传递给函数 (C)

问题描述 投票:0回答:1

假设通用库中的函数在任何情况下都希望使用长整型(例如 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
只是计算的附加细节...

c pointers types parameter-passing size
1个回答
0
投票

我是否正确理解,这实际上不是一个好主意

是的,这是正确的。

...函数 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;
}
© www.soinside.com 2019 - 2024. All rights reserved.