我必须编写一个声明char text[16];
和int number;
的程序,然后用来自用户的输入填充它。然后我必须调用另一个函数(不传递任何东西)并从堆栈中调用该数据并显示它。
我能够找到他们两个
// This is the function that is called without passing any variables
int number;
char text[16];
cout << *(&text + 5) << endl; // This outputs the correct text but I can not figure out how to assign it to text
number = *(int*)(&number + 20); // This works and outputs the correct number and saves correctly to int number;
cout << "\tnumber: "
<< number
<< endl;
cout << "\ttext: "
<< text
<< endl;
我想知道是否有办法将文字从*(&text + 5)
转移到char text[16];
答案 0 :(得分:1)
您正在做的是导致未定义的行为。在很大程度上取决于编译器,因此依赖于体系结构。证据是当我使用不同的优化标志编译和运行代码时,我会得到不同的结果。查看https://en.wikipedia.org/wiki/Buffer_overflow
第一个表达式*(&text + 5)
求值为在内存中取text
指针的地址,向其中添加5,然后取消引用它以获取存储在该位置的字符值。这可能是当时堆栈上的任何东西。
&number + 20
肯定会脱离“可见”堆栈,这是指针算术,并且会导致您将20*sizeof(int)
添加到指向堆栈上number
的内存地址的指针。
如果您打算这样做,那么您应该按照@JafferWilson的建议使用strcpy
答案 1 :(得分:0)
通过阅读Curious对答案的评论,答案是:
没有正确的方法来读取C ++中另一个函数中的局部变量,而不将它们(或指向它们的指针或它们的引用)作为参数传递(或者作为参数传递给对象)。
您可以分配文件范围(所谓的全局)变量并在其他函数中读取它们。这几乎总是一个坏主意。
我觉得你可能会来自汇编编程背景甚至尝试这种事情。你需要向结构化编程范例投降一些。