簡體   English   中英

為什么即使我沒有為它分配內存也能工作?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM