導航:首頁 > 源碼編譯 > 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編譯器內存地址溢出相關的資料

熱點內容
vue怎麼打包放上伺服器 瀏覽:165
為什麼安卓服夏日活動沒有兔子頭 瀏覽:894
pubg為什麼顯示伺服器連接失敗 瀏覽:650
阿里雲掃碼登錄伺服器 瀏覽:970
化學基礎pdf 瀏覽:896
51單片機晶碼管 瀏覽:281
怎麼查伺服器假死原因日誌在哪看 瀏覽:277
掃描pdf文件 瀏覽:926
解壓密碼百度雲在線解壓 瀏覽:767
傳播學演算法推薦 瀏覽:749
我的世界網路游戲如何查找伺服器 瀏覽:257
安卓和蘋果通訊錄怎麼互傳 瀏覽:203
怎麼打開隱私與應用加密的菜單 瀏覽:416
我的世界伺服器小游戲的地址大全 瀏覽:578
在網路安全中加密安全機制提供了數據的 瀏覽:249
南京前端程序員私活怎麼收費 瀏覽:981
拓撲pdf 瀏覽:440
如何在工行app查我的訂單 瀏覽:214
車壓縮機改電動 瀏覽:83
如何尋找音樂app 瀏覽:831