在c ++中更改char []的指针

时间:2016-02-06 06:10:05

标签: c++ pointers pointer-arithmetic

我必须编写一个声明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];

2 个答案:

答案 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 ++中另一个函数中的局部变量,而不将它们(或指向它们的指针或它们的引用)作为参数传递(或者作为参数传递给对象)。

您可以分配文件范围(所谓的全局)变量并在其他函数中读取它们。这几乎总是一个坏主意。

我觉得你可能会来自汇编编程背景甚至尝试这种事情。你需要向结构化编程范例投降一些。