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

通过尝试访问大于其在C[duplicate]中的维度的位置来访问数组后面的变量

贺卜霸
2023-03-14

因为在这个例子中,由于指针运算,我能够读取integer2的值:

#include <stdio.h>

    int main() {
      int integer1 = 1;
      int integer2 = 2;
      int *p = &integer1;
      p++;
      printf("%d\n", *p);
    } 

输出:

$ ./test
2

我想知道为什么在这个例子中:

#include <stdio.h>

int main()
{
  int array[2] = {0, 1};
  int variable = 0;
  for(int i = 0; i < 3; i++) {
    printf("%d\n", array[i]);
  }
}

然后我无法读取试图指向下一个整数的变量的值,但这就是我得到的:

0
1
336859392

我试着打印

161695488
161695492
161695480

变量的地址不仅小于数组中第一个元素的地址,甚至也不是前一个。
为什么在第一个例子中变量的地址是连续的,而在第二个例子中不是?
关于变量和缓冲区在堆栈中是如何分配的,我可能有些不明白。

编辑:我知道不应该这样做,但我试图理解缓冲区溢出(更现实地说,缓冲区应该是字符,由用户输入),目标应该是改变变量的值。所以我想了解的是,是否有可能知道变量在内存中的确切位置。

EDIT2:事实证明,给予-fno-stack-protected ector使其按预期工作,因此gcc在默认情况下添加了某种保护,以避免缓冲区溢出

共有1个答案

鄢修德
2023-03-14

局部变量的放置是实现的一个细节。它们可以按其认为合适的任何顺序放置。

试图读取数组的边界会调用未定义的行为。您看到的不一致结果就是这种情况的表现。

例如,如果我运行你的第一个代码片段,我不会得到2作为输出。打印每个变量的地址时,我得到:

&integer1=0x7ffcfa6e8c24, &integer2=0x7ffcfa6e8c20

所以在我的例子中,实现将integer1放在integer2之后。

 类似资料:
  • 我对Java很陌生,只是有点纠结于数组。我有一个代码块,我已经写了当遵循教程,但正在努力理解它,希望有人能解释给我。 null 对不起,如果这是一个琐碎的问题给你,但这是最好的地方,我可以想到转向。

  • 问题内容: 我有以下代码,想在javascript中返回变量“ t”: 后面的代码: javascript中的调用者变量: 那么,如何使变量“ t”从代码隐藏函数GetSomeText获得“结果”? 谢谢。 问题答案: 试试这个- 假设这是页面上的公共方法。这将在页面类上调用方法GetSomeText(),然后在呈现页面时对页面数据进行Response.Write()。结果应以JavaScript

  • 可能重复: 为什么我的程序在循环8192个元素时速度很慢? 我一直在修补一个程序,我正在使用它来简单地求和一个2D数组的元素。一个错字导致了至少在我看来,一些非常奇怪的结果。 处理数组时,矩阵[SIZE][SIZE]: 运行非常快,然而是上面的行SUM1...已修改: 就像我在一次意外中没有意识到的那样,我注意到我的运行时间显著增加了。这是为什么?

  • 问题内容: 我刚刚开始学习Go,有些事情引起了我的注意。 功能如下: 等等。作为来自C语言的人,我想知道: 1)是否可以通过变量本身来调用这些函数(如中所述)? 2)这是一种常见的做法(定义泛型函数并让其找出类型及其应执行的操作),还是仅用于内置类型。例如,如果我要定义自己的类型,例如,是否应该在类型内定义和附加函数,并将其命名为 还是应该定义一个接收列表的函数,例如: 问题答案: 1-您不能将内

  • 问题内容: 我正在尝试使用当前位置在android中提交用户注册表格。我是android和java开发的新手。当我尝试在我的名称值对代码中访问onLocationChanged方法的myLat和myLan时,无法同时找到这两个变量。如何访问我的名称/值对代码中的两个变量。 问题答案: 您可能应该研究范围和成员变量。问题是,您不能在一个方法中声明一件事,然后尝试从另一方法访问它。 因此,我们将该事物

  • 问题内容: 我试图在把手模板内的数组中指定项的索引: 使用这个: 如果上述方法不可行,我将如何编写一个可以访问数组中特殊项目的助手? 问题答案: 尝试这个: