微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为 int * 分配一个 short 失败

如何解决为 int * 分配一个 short 失败

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

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 标准未定义尝试此操作时的行为。

事实上,这可能有很多问题:

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

我将整数作为参数传递给需要指向 long long 的指针的函数。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。