關於非法訪問指針的地址的新手問題

WINSON_FU 2014-02-11 10:43:29

#include <iostream>
using namespace std;

int a = 5;
int b = 6;

int main()
{
cout << &a;
int *ap = (int *)4202660;
*ap = 8;
cout << a << endl;
cout << (&b) << endl;

system("pause");
return 0;
}


很奇怪的問題是 這裡輸出的值為 8 4202664

我現在知道的是這是一個不可以在別的機子上運行的程序 因為每個數據儲存的地址不一樣。

我想請問的問題是
1.這道題目中倘若要出現這樣的結果,是否原因是4202660就是a的地址?
2.我之後又嘗試 cout << &a,得出a儲存的地址之後 將原程序中的4202660換成我的內存中的地址,但為何IDE顯示的是編譯錯誤。請具體講講內存的具體數據格式有要求么?我一直以為是十六進制的八位數。

謝謝大家了
...全文
125 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
神-气 2014-02-13
  • 打赏
  • 举报
回复
引用 14 楼 WINSON_FU 的回复:
哦 就是說每次系統都會重新分配內存位置么? 而且IDE在七位數的時候就是runtime error,八位數就是編譯錯誤了 為什麼呢。。。
什么编译错误,你的代码是怎样的,错误信息是怎样的,你贴出看看。
WINSON_FU 2014-02-12
  • 打赏
  • 举报
回复
哦 就是說每次系統都會重新分配內存位置么? 而且IDE在七位數的時候就是runtime error,八位數就是編譯錯誤了 為什麼呢。。。
神-气 2014-02-12
  • 打赏
  • 举报
回复
你换一个地址不一定正好还是a的地址,很可能指向一个乱七八糟的地址空间,出现非法访问运行期错误,而不是编译错误、
WINSON_FU 2014-02-12
  • 打赏
  • 举报
回复
引用 11 楼 ADF1230 的回复:
[quote=引用 10 楼 WINSON_FU 的回复:] [quote=引用 9 楼 ADF1230 的回复:]
就是為什麼我這樣子替換不可以
神-气 2014-02-12
  • 打赏
  • 举报
回复
引用 10 楼 WINSON_FU 的回复:
[quote=引用 9 楼 ADF1230 的回复:]
其實不是編譯的問題,原來這個程序就可以運行,但是只是換了一個a的地址。我之前cout<<&a讀出了a的地址,然後記下來替換原來的那個七位數。不是亂改的。[/quote] 那你想问的是什么呢?
WINSON_FU 2014-02-12
  • 打赏
  • 举报
回复
引用 9 楼 ADF1230 的回复:
其實不是編譯的問題,原來這個程序就可以運行,但是只是換了一個a的地址。我之前cout<<&a讀出了a的地址,然後記下來替換原來的那個七位數。不是亂改的。
神-气 2014-02-12
  • 打赏
  • 举报
回复
1,这段代码只能说明恰好a的地址是4202660,被修改成了8; 2,你编译不过,说明代码写错了,没什么好说的。 内存地址只是一个数而已,随便你二进制,八进制,十进制,十六进制的表示。 地址: 十六进制 :0x12345678 十进制 : 305419896 八进制 : 2215053170 二进制 : 10010001101000101011001111000 参考以下代码:
	int* pTest = (int*)12345678;
	*pTest = 16;
	cout<<*pTest<<endl;

	pTest = (int*)305419896;
	*pTest = 10;
	cout<<*pTest<<endl;

	pTest = (int*)02215053170;
	*pTest = 8;
	cout<<*pTest<<endl;
神-气 2014-02-12
  • 打赏
  • 举报
回复
vs2005,结果: 00417004 5 00417008 正常啊
帝王铠 2014-02-12
  • 打赏
  • 举报
回复
台湾人0 0?
WINSON_FU 2014-02-12
  • 打赏
  • 举报
回复
那我1L問的兩個問題能給個答復么?謝了
lin5161678 2014-02-11
  • 打赏
  • 举报
回复
引用 4 楼 WINSON_FU 的回复:
那請問具體有位數的限制么?
4字节的话 是0xFFFFFFFF最大
WINSON_FU 2014-02-11
  • 打赏
  • 举报
回复
引用 3 楼 lin5161678 的回复:
十六进制 请记得前缀 0x
那請問具體有位數的限制么?
lin5161678 2014-02-11
  • 打赏
  • 举报
回复
十六进制 请记得前缀 0x
WINSON_FU 2014-02-11
  • 打赏
  • 举报
回复
這是一道分析題。。。我也不想寫。不然為什麼叫非法訪問地址。。。
derekrose 2014-02-11
  • 打赏
  • 举报
回复
不要写这种代码。。。

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧