将 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 *
产生一个等于原始指针的值。
- 即使
short
和 int
的宽度相同,比如 32 位,并且对齐良好,C 标准也有关于别名的规则,允许编译器假定 int *
从不访问定义为 short
的对象。因此,优化您的程序可能会以意想不到的方式改变它。
I have integers that I pass as arguments to functions expecting a pointer to a long long.
C 确实允许将整数默认转换为宽度相同或更宽的整数,因为这些通常不是错误。
我知道我可以将变量重新分配给更大的类型(如果合适的话),并且可以这样做。例如:
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 *
产生一个等于原始指针的值。 - 即使
short
和int
的宽度相同,比如 32 位,并且对齐良好,C 标准也有关于别名的规则,允许编译器假定int *
从不访问定义为short
的对象。因此,优化您的程序可能会以意想不到的方式改变它。
I have integers that I pass as arguments to functions expecting a pointer to a long long.
C 确实允许将整数默认转换为宽度相同或更宽的整数,因为这些通常不是错误。