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

熱點內容
有個腹黑程序員男友是什麼體驗 瀏覽:110
pdf添加文本框 瀏覽:770
系統文件夾很大沒有文件 瀏覽:74
蘇寧電器app如何還分期 瀏覽:635
蘋果怎麼在主屏幕創建文件夾 瀏覽:627
河南雲伺服器租用虛擬主機 瀏覽:361
centos修改ip命令 瀏覽:779
租用伺服器屬於什麼服務類型 瀏覽:135
英雄聯盟說沒有網路連接到伺服器地址 瀏覽:28
單片機周期信號波形識別 瀏覽:42
演算法驅動的成長史 瀏覽:936
好又省APP怎麼用 瀏覽:576
pdf在線格式轉換jpg格式轉換器 瀏覽:868
中興捧月演算法大賽第二場 瀏覽:15
穿雲伺服器 瀏覽:394
單片機核心電壓表 瀏覽:151
最強大逃頂通達信指標源碼 瀏覽:441
java程序員面試寶典歐立奇 瀏覽:457
cad命令不要跟著游標 瀏覽:200
騰訊軟體伺服器是什麼 瀏覽:895