簡體   English   中英

在C ++中更改char []的指針

[英]change pointer of char[] in c++

我不得不寫一個聲明char text[16];的程序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];

您正在執行的操作將導致未定義的行為。 在很大程度上取決於編譯器,因此也取決於體系結構。 證明是,當我使用不同的優化標志編譯和運行代碼時,會得到不同的結果。 查看https://en.wikipedia.org/wiki/Buffer_overflow

第一個表達式*(&text + 5)計算結果為獲取內存中文text指針的地址,將其添加5,然后對其進行解引用以獲得存儲在該位置的字符值。 那時,這幾乎是堆棧上的所有內容。

&number + 20肯定會離開“可見”堆棧,這是指針運算,將導致您在指向堆棧上number內存地址的指針上加上20*sizeof(int)

如果這是您打算要做的,那么您應該按照@JafferWilson的建議使用strcpy。

通過閱讀Curious對答案的評論,答案是:

沒有適當的方法來讀取C ++中另一個函數中的局部變量,而不將它們(或指向它們的指針或對其的引用)作為參數(或在作為參數傳遞的對象內)傳遞。

您可以分配文件范圍(所謂的全局)變量,並在其他函數中讀取它們。 那幾乎總是一個壞主意。

我覺得您可能來自匯編程序編程背景,甚至嘗試這種事情。 您需要向結構化編程范式多投降。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM