查看完整版本: malloc和free,是不是不free會有大問題?
頁: [1]

oasis33y 發表於 2016-7-20 04:50 AM

malloc和free,是不是不free會有大問題?

這不是功課,我是C的很久的留級生。程式碼如下:
(eyny不讓我貼程式碼,所以貼圖片,請別見怪)

我預期跑這個程式應該出來
1     2

可是結果是
1     1

我想可能是因為我在IntToStr00()中沒有free()
可是又不知道要如何釋放記憶體
可以請知道的先進指導一下嗎?
<div></div>

include 發表於 2016-7-20 09:47 AM

substring這個函數中的sub變數是區域變數

第二次呼叫的時候改到第一次呼叫的結果

ren1244 發表於 2016-7-20 03:15 PM

如果研究C語言標準函式庫,幾乎沒有回傳動態宣告記憶體的指標,再讓使用者free的。
建議您的函式應該宣告成這個樣子。char* IntToStr(int value,char* buf);使用時可以這樣char AAA;
puts(IntToStr(35,AAA));把記憶體宣告留給使用者自行處理。

另外也寫了一個範例,提供參考。
(因為EYNY會把"printf+括號"視為敏感字,所以程式中特別用巨集取代)#include <stdio.h>

#define PRT printf

char* IntToStr(int value,char* buf)
{
    int i=0;
    if(value<0)
    {
        buf='-';
        value=-value;
    }
    else if(value==0)
        buf='0';
    while(value)
    {
        buf=value%10+'0';
        value/=10;
    }
    buf='\0';
    return buf;
}

int main()
{
    char A,B,C;
    PRT("%s\t%s\t%s\n",IntToStr(3,A),IntToStr(-2,B),IntToStr(0,C));
    return 0;
}
...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

chevylin0802 發表於 2016-7-20 04:05 PM

本帖最後由 chevylin0802 於 2016-7-20 04:07 PM 編輯

ITOA宣告成100個char的空間
sprintf卻只用到Ret= '1' 或 '2'
Ret = '\0'; 則是成了固定的值
Ret~Ret 則一直都是亂數值
substring的from 永遠是8, length 永遠是2
想也知道
永遠讀到的數就不是正確的




GT

inunu 發表於 2016-7-21 06:47 AM

先看 IntToStr00():
s2 = malloc(10); 分配給了它 10 bytes
strcpy(s2, "0000000000"); 寫了 11 bytes (!?)
我數了很多次, 10 個 '0', 加結尾 '\0' 共 11 bytes, 超寫
strcat(s2, s); 還不當? 繼續超寫, 下探底線, 看你還能忍我多久...
最後用 "超寫的部份" 去呼叫 substring()... (從參數判斷出的動機目地)

再來看 substring():
char sub; 一開始就從堆疊借 1kb 出來
就當作是跟朋友借台雙B轎車吧
然後複製字串, 填上結尾 '\0'
最後雙B 還給朋友, 跟人家說 "要的找他嘿" (... 這招超屌!)

你這寫法讓人很慌啊...
...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div><br><br><br><br><br><div></div>

oasis33y 發表於 2016-7-21 08:00 AM

inunu 發表於 2016-7-21 06:47 AM static/image/common/back.gif
先看 IntToStr00():
s2 = malloc(10); 分配給了它 10 bytes
strcpy(s2, "0000000000"); 寫了 11 bytes (!?) ...

別慌, 術業有專攻, 就是不會寫才一直寫, 有問題來問, 想一段時間後變得會寫呀.
頁: [1]