将 short 分配给 int * 失败

Assigning a short to int * fails

我知道我可以将变量重新分配给更大的类型(如果合适的话),并且可以这样做。例如:

short s = 2;
int i = s;
long l = i;
long long ll = l;

当我尝试使用指针执行此操作时,它失败了,我不明白为什么。我有整数作为参数传递给期望指向 long long 的函数。而且它还没有失败..

前几天我从 short 到 int,发生了一些奇怪的事情,我希望有人能给我解释一下。这将是最少的重现代码。

short s = 2;
int* ptr_i = &s; // here ptr_i  is the pointer to s, ok , but *ptr_i   is definitely not 2

When I try to do it with pointers it fails and I don't understand why.

C 中类型系统的一个主要目的是减少编程错误。默认转换可能会被禁止或诊断,因为它是错误的征兆,而不是因为值无法转换。

int *ptr_i = &s;中,&s是一个short的地址,一般是16位整数。如果 ptr_i 设置为指向同一内存并使用 *ptr_i,它会尝试在该地址引用 int,通常是 32 位整数。这通常是一个错误;从一个有 16 位整数的地方加载一个 32 位整数,而我们不知道超出它的地方是什么,通常不是我们想要的操作。 C 标准没有定义这种尝试时的行为。

事实上,有很多事情可能会出错:

  • 如上所述,当我们只知道有一个 short 时使用 *ptr_i 可能会产生不希望的结果。
  • short 对象可能具有不适合 int 的对齐方式,这可能导致指针转换或使用转换后的指针出现问题。
  • C 标准没有定义将 short * 转换为 int * 的结果,只是如果针对 int 正确对齐,则结果可以转换回 short * 产生一个等于原始指针的值。
  • 即使 shortint 的宽度相同,比如 32 位,并且对齐良好,C 标准也有关于别名的规则,允许编译器假定 int * 从不访问定义为 short 的对象。因此,优化您的程序可能会以意想不到的方式改变它。

I have integers that I pass as arguments to functions expecting a pointer to a long long.

C 确实允许将整数默认转换为宽度相同或更宽的整数,因为这些通常不是错误。