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

熱點內容
安卓手機微信發不出視頻怎麼弄 瀏覽:229
壓縮機專用工具 瀏覽:575
qtcreator可以編譯cp嗎 瀏覽:405
小項目是雲伺服器還是本地好 瀏覽:14
墨痕齋是什麼游戲的伺服器 瀏覽:942
word文件如何壓縮大小 瀏覽:279
遵義聯通伺服器地址是什麼 瀏覽:29
ansys約束命令流 瀏覽:814
解壓軟體電腦版如何下載 瀏覽:791
閃電匕首演算法球 瀏覽:692
linuxredis停止命令 瀏覽:670
大麥賬號怎麼加密 瀏覽:113
穿越火線怎麼找伺服器 瀏覽:526
秘密加密社交軟體app 瀏覽:256
c語言編譯器怎麼找文件 瀏覽:836
數學不好能編程嗎 瀏覽:254
微雲里的視頻加密 瀏覽:41
3大加密貨幣交易平台 瀏覽:647
鈑金激光切割機編程 瀏覽:496
vivo手機手電筒app在哪裡 瀏覽:787