簡體   English   中英

malloc防止垃圾被打印?

[英]malloc preventing garbage from being printed?

程序用C編程,並用GCC編譯。

我正在嘗試幫助一個試圖使用(淺)復制傳遞給函數的值的朋友。 他的值是一個保存原語和指針(沒有數組或緩沖區)的結構。 他不確定malloc的工作方式,因此使用它的方式類似於以下操作:

void some_function(int rand_params, SOME_STRUCT_TYPEDEF *ptr){
    SOME_STRUCT_TYPEDEF *cpy;
    cpy = malloc(sizeof(SOME_STRUCT_TYPEDEF));// this line makes a difference?!?!?
    cpy = ptr;// overwrites cpy anyway, right?
    //prints a value in the struct documented to be a char*,
    //sorry couldn't find the documentation right now
}

我告訴他,malloc不應該影響程序,所以告訴他將其注釋掉。 令我驚訝的是,malloc導致了與malloc被注釋掉(打印出我們的垃圾值)的實現不同的輸出(帶有一些預期的字符串)。 傳遞給this函數的指針來自其他一些我目前沒有文檔的庫函數。 最好的假設是指針指向的值實際上是一個緩沖區(在堆棧上)。 但是我仍然看不到malloc如何導致這種差異。 有人可以解釋一下malloc如何引起差異嗎?

我要說的是,對指針的明顯缺乏理解是造成ptr實際指向尚未正確分配 (如果有的話)的內存的原因,並且您正在經歷未定義的行為 問題在調用some_function之前在程序的其他地方

順便說一句,分配和復制數據的正確方法是:

SOME_STRUCT_TYPEDEF *cpy = malloc(sizeof(SOME_STRUCT_TYPEDEF));
if (cpy) {
    *cpy = *ptr;

    // Don't forget to clean up later
    free(cpy);
}

但是,除非該結構是巨型結構,否則當您可以在堆棧上進行如下操作時,在堆上執行該操作有點愚蠢:

SOME_STRUCT_TYPEDEF cpy = *ptr;

我看不出為什么印刷品有差異。 可以顯示打印代碼嗎? 無論如何,malloc會導致內存泄漏。 您不應該為'cpy'分配內存,因為指針分配不是淺拷貝的,您只需將該內存的起始地址存儲在'cpy'中,使'cpy'指向同一內存的'ptr'點即可( cpy通常是一個32/64位值,用於存儲地址,對於malloc,它將存儲您分配的內存部分的地址)

暫無
暫無

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

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