![](/img/trans.png)
[英]Why destructor getting called even though I have allocated memory using malloca?
[英]Why does gets work even when I have not allocated memory to it?
我最近在 SO 中回答了一個問題,問題是輸入幾句代碼並打印出來。 我的代碼是這樣的:
#include<stdio.h>
int main() {
clrscr();
int line, i;
char (*string)[100];
printf("How many line?\n");
scanf("%d",&line);
getchar();
for(i=0;i<line;i++) {
gets(string[i]);
}
printf("You entered:\n");
for(i=0;i<line;i++) {
puts(string[i]);
}
return 0;
}
如您所見,我沒有為單個字符串分配任何內存,即s[0]
, s[1]
,......但令人驚訝的是,我的編譯器沒有給我任何警告或錯誤,它完美地工作。
所以我發布了這段代碼,坦率地說,它得到了很多反對(我知道我應得的)。 你能解釋一下為什么這段代碼有效而不給出分段錯誤嗎?
我的輸出如圖所示:
char (*string)[100];
好的, string
代表一個指向 100 char
的指針,但它沒有被初始化。 因此,它代表一個任意地址。 (更糟糕的是,在后續訪問時,它甚至不一定代表相同的任意地址。)
gets(string[i]);
嗯,這將數據從標准輸入讀取到從隨機地址開始的內存塊,加上i*100
,直到讀取 NUL 字節。
不是很健壯。 也不保證會產生錯誤。 如果您沒有得到,則隨機地址必須已映射到可寫字節。
如您所見,我沒有為單個字符串分配任何內存,即
s[0]
、s[1]
但令人驚訝的是我的編譯器沒有給我任何警告或錯誤,並且它完美地工作。
是時候降低您的期望,或者提高編譯器的診斷級別。 嘗試-Wall -Wextra
,如果它采用那種風格的選項。 應該警告您使用string
沒有先初始化。 該警告gets
已被棄用,也將是一個不錯的主意,但我的編譯器並沒有提到它。
C 和 C++ 允許您自己管理內存。 您負責驗證指針。 在 C 中,這是問題的主要來源。
在 C++ 中,解決方案是使用指針的替代方法,例如引用(不能未初始化)和智能指針(為您管理內存)。 盡管該問題被標記為 C++ 並編譯為 C++ 程序,但它並不是以稱為 C++ 的風格編寫的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.