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

熱點內容
程序員主題婚禮 瀏覽:841
制勝之道pdf 瀏覽:137
有什麼喝酒聚會用的app 瀏覽:312
桌面編程軟體 瀏覽:665
調圖片解析度用什麼手機app 瀏覽:918
java記錄鍵盤 瀏覽:202
用執行命令造句 瀏覽:743
啟動程序命令怎麼用 瀏覽:122
如何查看伺服器log日誌 瀏覽:770
儒教中國pdf 瀏覽:509
單片機24個寄存器怎麼記 瀏覽:51
安卓軟體如何添加授權碼 瀏覽:824
命令行安裝服務 瀏覽:526
linux如何查看文件夾 瀏覽:185
什麼app能測臉型和皮膚 瀏覽:656
試卷的文件夾怎麼做 瀏覽:924
辦公室雲桌面伺服器配置 瀏覽:97
socket網路編程java 瀏覽:220
cad命令使用 瀏覽:252
支付寶加密碼怎麼解啊 瀏覽:330