c-将short赋值给int*失败



我知道,如果变量适合,我可以将其重新分配给更大的类型。例如:

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

当我尝试使用指针时,它失败了,我不明白为什么。

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

int *ptr_i = &s;中,&sshort的地址,通常是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的对象。因此,程序的优化可能会以意想不到的方式对其进行转换

我有一些整数,我将它们作为参数传递给函数,这些函数需要一个指向长long的指针。

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

最新更新