假设泛型库中的一个函数在任何情况下都想使用长整数(比方说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;
}

C++相关问答推荐

Zig将std.os.argv转换为C类型argv

ATTiny1606定时器TCA 0中断未触发

为什么我得到更多的256假阳性在PKZIP解密密钥验证?

当execvp在C函数中失败时杀死子进程

如何使fputs功能提示错误输入并要求用户重新输入.程序停止而不是请求新的输入

ATmega328P EEPROM未写入

是什么让numpy.sum比优化的(自动矢量化的)C循环更快?

在Rust和C之间使用ffi时如何通过 struct 中的[U8;1]成员传递指针

在WSL关闭/重新启动后,是什么原因导致共享对象依赖关系发生更改?

如何使用_newindex数组我总是得到错误的参数

如何在提取的索引中分配空值?

cairo 剪辑区域是否存在多个矩形?

为 struct 中的数组动态分配内存时出错

接受任何参数的函数指针是否与接受不同参数的函数兼容

使用nmake for程序比Hello World稍微复杂一些

为什么realloc函数在此代码中修改变量?

为什么我在我的代码中得到错误和退出代码-1073741819(0xC0000005),但如果我添加了一个不相关的打印语句,它仍然有效?

从系统派生线程调用CRT

如何使用 VLA 语法使用 const 指针声明函数

Linux memcpy 限制关键字语法