【发布时间】:2021-05-15 18:28:17
【问题描述】:
我知道,如果合适的话,我可以将变量重新分配给更大的类型,这样做可以。例如:
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
【问题讨论】:
-
en.cppreference.com/w/c/language/conversion 了解为什么您可以将 int 或 short 或任何其他整数类型的参数传递给函数。但整数不是指针,它们有不同的规则。
-
数据指针的大小都是一样的。他们的目标大小不同。如果
sizeof(int) != sizeof(short),int *和short *将永远不会兼容,因为它不会访问正确的目标大小。如果您的编译器警告不兼容的指针类型,您应该将其视为错误并修复它。 -
但这意味着
int *和long long int *也永远不会兼容,但这不会失败。感谢@Shawn 的链接。 -
@piptin 不,如果
sizeof(int) != sizeof(long long int),这意味着它们不兼容。但是由于它们在大多数平台上确实具有不同的尺寸,因此它们在您的平台上可能不兼容。仅仅因为您没有看到问题并不意味着它不存在。如果您将long long加载为int,您可能会得到低阶(在小端机器上)或高阶(在大端机器上)。您可能没有注意到差异,但这是未定义的行为。而且,如果您要存储到更大的大小,则情况会更糟,因为您正在破坏内存。 -
解决方法是用
-Wall -Wextra -Werror编译,然后修复代码中的错误。