私有变量在C ++中的堆栈中存在于何处

时间:2011-03-09 23:38:07

标签: c++ stack private

我正在尝试在C ++中溢出一个私有变量的缓冲区。它在哪里生活?这可能吗?

这样的东西
class aClass{
private:
  char buffer[SIZE];
public:
}

6 个答案:

答案 0 :(得分:4)

在布局方面,公共和私有变量的处理方式不同。在堆栈上分配的类具有在堆栈上分配的内部数据成员 - 无论是私有还是公共。

class MyClass {
public:
    int PublicInt;
private:
    int PrivateInt;
};

int main() {
    MyClass instance;
}
在内存中

相当于

int main() {
    int a, b;
};

答案 1 :(得分:2)

是的,可能的是,变量以与该对象的其余成员相邻的顺序排列在堆栈上;而且,在C ++中,数据本身总是可以通过较低级别的机制访问。私有/公共范例只是一种旨在防止在编译时意外访问的保护,但绝不意味着无法访问该数据。

然而,您将面临的问题是“由访问说明符分隔的非静态成员的分配顺序未指定。”根据标准第9.2条第12节。有关详细信息,请参阅this帖子。

话虽这么说,如果你编写了你正在谈论的代码(因此你有能力修改它),我强烈建议改变你的设计,这样你就不必这样做了。 C ++中有一个名为“朋友”或“朋友类”的关键字,您可能需要查找。

或者......你可以作弊,正如this海报所说的那样。

答案 2 :(得分:2)

呃......你的问题听起来像“蓝天是什么颜色的?”。答案显然是“蓝色”。

当一个变量“在堆栈上”分配时,它将放在堆栈上。没有更详细的解释。 “在堆栈上”是“哪里?”的答案。题。堆栈内存是统一的。没有更详细的“在哪里”而不是简单的“在堆栈上”。

您的数组是该类的私有成员的事实没有任何区别。整个数组是对象的组成部分。如果将类类型的对象定义为本地对象(“在堆栈上”),那么整个数组将存在于堆栈中,无论它是否为私有。

如果这不能回答你的问题,十,你必须以更有意义的方式重新陈述。

答案 3 :(得分:1)

这是一个可能破坏堆栈的简单程序; 它实际上产生了与平台相关的未定义行为或行为

void function_destroyer(int a, double b, char c)
{
  unsigned char array[1];
  for (int i = 0; i < 32; ++i)
  {
    array[1 - i] = 0x24; // A value chosen at random
  }
  return;
}

int main(void)
{
  function_destroyer(1, 1.5. 'f');
  return EXIT_FAILURE;
}

通过访问数组中第一个元素之前的元素,可能会损坏堆栈。这取决于编译器生成堆栈并在堆栈上传递变量。

答案 4 :(得分:0)

尝试以下方法:

#include <string.h>

void foo (char *bar)
{
   char  c[12];

   strcpy(c, bar);  // no bounds checking...
}

int main (int argc, char **argv)
{
   foo(argv[1]); 
}

答案 5 :(得分:0)

写过数组可以看作是缓冲区溢出的一个例子。你可以做到这一点,但我不知道你想要通过这样做来实现。

 void aClass:: bufferOverflow() // Assuming this a member of aClass
 {
      for( int i=0; i<(SIZE+2), ++i )
          buffer[i] = 'a'; // Writing past the 2 locations.
 }

它在堆栈中的哪个位置?

自动堆叠是一个存储位置。它是什么意思,它存在于堆栈中。