我知道,如果变量适合,我可以将其重新分配给更大的类型。例如:
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;
中,&s
是short
的地址,通常是16位整数。如果ptr_i
被设置为指向相同的存储器,并且使用*ptr_i
,则它尝试引用该地址处的int
,通常是32位整数。这通常是一个错误;从一个有16位整数的地方加载一个32位整数,而我们不知道超出它的是什么,这通常不是一个理想的操作。C标准没有定义尝试执行此操作时的行为。
事实上,有很多事情可能会出错:
- 如上所述,当我们只知道存在
short
时使用*ptr_i
可能会产生不希望的结果 short
对象可能具有不适合int
的对齐,这可能导致指针转换或使用转换后的指针的问题- C标准没有定义将
short *
转换为int *
的结果,只是如果它与int
正确对齐,则可以将结果转换回short *
,以产生与原始指针相等的值 - 即使
short
和int
的宽度相同,比如32位,并且对齐良好,C标准也有关于混叠的规则,允许编译器假设int *
从不访问定义为short
的对象。因此,程序的优化可能会以意想不到的方式对其进行转换
我有一些整数,我将它们作为参数传递给函数,这些函数需要一个指向长long的指针。
C允许将整数默认转换为相同宽度或更宽的整数,因为这些通常不会出错。