導航:首頁 > 源碼編譯 > dev編譯器內存地址溢出

dev編譯器內存地址溢出

發布時間:2025-01-21 21:18:37

A. char a[4]; strcpy(a,"abcd");「abcd」所佔用的內存單元為5個位元組,在vc6.0下編譯竟然通過,為什麼不溢出

確實會溢出,並且覆蓋了a後面緊接的那個位元組。但是溢出覆寫的哪個位元組屬於哪個對象是不確定的,而且可能剛好本來就等於0,因此除了使a正常輸出外,沒有其它效果。
如果是棧中的自動變數,a後面緊接著的是a前面定義的對象。
編譯器是沒智能到能檢查到溢出的,這是邏輯錯誤而不是語法錯誤,所以不會對此產生編譯錯誤。
可以試試
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
unsigned long u = 0xFFFFFFFF;
char a[4];
strcpy(a, "abcd");
cout << a << endl;
cout << u << endl;
cin.get();
return 0;
}
可以看到u的值被改寫了(在幾乎所有的平台上應該是這樣;至於改寫成的值……和位元組序有關,Windows等little endian的平台上是0xFFFFFF00,Mac等big endian的平台上是0x00FFFFFF)。
另外, 35254659 說到的 malloc 分配的空間比實際的要大,確實有這么回事。不過多的空間是不能使用的,因為這些空間是控制塊,被用於存儲連續內存本身的信息,供釋放內存使用。如果覆蓋了這些部分,那麼 free 這塊空間以後,程序可能會發生莫名其妙的錯誤,甚至直接崩潰。
====
[原創回答團]

B. 在C語言中如果已經知道了一個數據的內存地址,怎樣直接從內存中讀取出該數據

要讀取內存數據的話,只能通過指針,你只能通過自己定義一個int的指針,讓他指向一個內存地址,然後通過*指針的形式讀出來。
你說的「我不想通過指針變數來直接輸出該int數據的值,而是想直接讀取內存的數據,看看和我定義的int數據值是否相同。」是沒意義的,就好像你要確定我這個人是不是我這個人一樣,如果你一定要寫的話,可以寫成這樣。
#include<stdio.h>
int main()
{
int a=123,b=1234567;
int adda=&a,addb=&b;
int *m,*n;
m=adda;
n=addb;
//printf("*m=%d\t,*n=%d\n",*m,*n); //這里不用指針變數直接輸出int數據
printf("m=%d\t,n=%d\n",a,b);
return 0;
}
這里的m和n已經和a,b沒有任何邏輯聯系了,他們只是表示兩個內存段的數據而已。
再明確點可以寫成
#include<stdio.h>
int main()
{
int a=123,b=1234567;
int adda=&a,addb=&b;//adda和addb僅僅表示兩個內存地址
int contenta,contentb;
contenta=*adda;
contentb=*addb;//這兩句的含義是兩個內存地址裡面的內容,他們和變數a,b沒有邏輯關系
//printf("*m=%d\t,*n=%d\n",contenta,contentb); //這里不用指針變數直接輸出int數據
printf("m=%d\t,n=%d\n",a,b);
return 0;
}
這里就是你說的比較a以及a所在的內存塊(adda)裡面內容是不是和a相等

閱讀全文

與dev編譯器內存地址溢出相關的資料

熱點內容
zip加密與rar加密一樣不 瀏覽:944
高低區間指標源碼 瀏覽:344
網頁伺服器地址怎麼查詢 瀏覽:934
如何解析域名伺服器 瀏覽:443
怎麼解綁微信賬號的app 瀏覽:594
pdf雜志網站 瀏覽:770
xsmax如何軟體加密 瀏覽:115
跟版網下載的源碼在雲伺服器中如何運行 瀏覽:467
單片機插晶振 瀏覽:360
ubuntu部署ftp伺服器是什麼 瀏覽:441
android線性加速度感測器 瀏覽:742
配置文件可以在哪個文件夾 瀏覽:195
宏觀經濟學曼昆pdf 瀏覽:406
android掛載nfs 瀏覽:440
電腦篩選多個文件夾 瀏覽:746
java程序員常用工具 瀏覽:401
單片機控制二極體以4赫茲閃爍 瀏覽:812
python中django是什麼庫 瀏覽:220
表單重置命令 瀏覽:804
proe填充曲面命令 瀏覽:466