当前位置: 首页 > 知识库问答 >
问题:

为什么这段涉及数组和指针的代码会像它一样运行?

华煜祺
2023-03-14
int a[5] = { 1, 3, 5, 7, 9 };
int *p = (int *)(&a + 1);
printf("%d, %d", *(a + 1), *(p - 1));
    null

共有1个答案

马坚白
2023-03-14

答案可能是“1)3,9”或“2)错误”(或者更具体地说是未定义的行为),这取决于您如何阅读C标准。

首先,让我们来看看这个:

&a + 1

&运算符获取数组a的地址,为我们提供int(*)[5]类型的表达式,即指向大小为5的int数组的指针。在此基础上添加1将指针视为指向int[5]数组的第一个元素,结果指针指向之后的一个。

(int *)(&a + 1)

然而,C标准并不清楚是否允许这种转换以及随后对结果的操作。假设指针正确对齐,它确实允许从一种对象类型转换到另一种对象类型并返回。虽然对齐不应该是一个问题,但使用这个指针是不确定的。

所以这个指针被分配给p:

int *p = (int *)(&a + 1)

然后使用如下:

*(p - 1)
 类似资料:
  • 这段代码(从来历不明的LZW压缩程序中提取)在大小为5021的哈希表中找到一个空槽,索引从0到5020: 这不是典型的线性或二次探测。为什么要这样调查?这是一种已知的探测算法吗?我在哪里可以找到更多关于它的信息?

  • 我正在尝试插入: 在: 但我不工作... 我试过: 为什么??

  • 问题内容: 考虑以下Java源代码: 该是。 为什么该语句有时会抛出? 谢谢。 问题答案: 线程安全 如果您的代码是多线程的,则有可能。例如: 如果在语句执行之后(但在循环之前)立即将另一个线程设置为,则您将获得一个。通过使用访问器(与延迟初始化结合使用)可以避免这种情况。 另外,如其他人所提到的,如果可能,请避免使用有利于泛型的此类循环构造。有关详细信息,请参见其他答案。 配件提供保护 如果始终

  • 我写了一些欧拉问题35的代码: 我想知道为什么这个代码(上图)运行得这么快,当我设置在函数中。这段代码的运行时间约为8秒。最初,我没有设置,我的函数是这样的: 我的初始代码(没有)运行了很长时间,我没有等它完成。我很好奇,为什么这两段代码在运行时间上存在如此大的差异,因为我不相信会有任何重复项,这会使迭代花费如此长的时间,以至于迭代。也许我对set()的想法是错误的。欢迎任何帮助。

  • 令牌“if”的语法错误(应在此令牌之后 谢谢你的建议!