簡體   English   中英

為什么不使用malloc就可以使用char指針?

[英]Why can I use a char pointer without malloc?

我已經編寫了類似的東西,我想知道為什么它起作用...

char* produceAString(void){
    char* myString;
    while(somethingIsGoingOn){
        //fill myString with a random amountof chars
    }
    return myString;
}

理論告訴我,當我使用指針時,應該使用malloc分配空間。 但是在這種情況下,我不知道myString需要多少空間,因此我只是跳過了它。 但是為什么這樣做呢? 僅僅是對我有用的不好的代碼,還是char指針后面有什么特別的東西?

它的工作完全是偶然的。 下次嘗試時可能不起作用。 未初始化的指針可以指向內存中的任何地方。 對其進行寫操作可能會導致立即訪問沖突,或者稍后會出現問題,或者一無所獲。

這通常是錯誤的代碼,是的。 同樣,無論您使用什么編譯器,都可能不是很聰明,或者關閉了警告,因為它們通常會引發錯誤或至少發出警告,例如“變量未初始化未使用的變量”,這完全是事實。 不幸的是,當代碼運行時,點很垃圾,而操作系統以某種方式允許寫入(或讀取),可能是在調試模式下運行? 我的個人經驗是,在某些情況下,它可以預測操作系統的運行方式,但是您永遠都不應依賴這些東西,例如,如果您在調試模式下使用MinGW進行構建,則非初始化值通常遵循一個模式或為零,在這種情況下,發布其通常完整的隨機垃圾。

由於您“指向內存位置”,因此無論何時它是另一個變量(指向另一個變量)或在運行時分配空間(malloc),它都必須指向有效位置,因此您基本上都不是讀/寫一個隨機內存塊,並且由於某些黑魔法,該應用不會因此而崩潰,您是否正在Windows上運行? Windows 2000或XP? 由於我知道自Windows Vista以來,這些限制並不像Windows那樣嚴格,因此我記得當時我在Windows XP下做了類似的事情,當它崩潰時什么也發生。

因此,通常,在使用指針之前先分配或指向要使用的內存塊,以防不知道需要使用多少內存來重新分配內存,或者只是想出一種針對特定情況占用最小內存的好的策略。

了解C實際作用的一種方法是更改​​此行

char* myString;

進入

char* myString=(char*)0;

並在調試器的該行之前中斷並觀看myString變量,該變量將為垃圾,如果將變量加為零,則其余代碼將失敗,並出現訪問沖突,因為您指向“ nowhere”。 正常操作是

char* myString=(char*)malloc(125); // whatever amount you want

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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