2012-12-05 90 views
0
/* DECLARED FUNCTIONS */ 
char *DetectDevice(void); 

int main(int argc, char *argv[]) 
{ 
    char *PathToDevice; 
    PathToDevice = DetectDevice(); 

... 

    if(close(fd) == -1) 
    { 
     printf("Error Closing Port"); 
    }else 
    { 
     printf("whihi!"); 
     free(PathToDevice); 
    } 

    return 0; 
} 

char *DetectDevice(void) 
{ 
    char *Usbs = malloc(1024); 
    Usbs = "/dev/ttyUSB1"; 
    return Usbs; 
} 

錯誤消息:* glibc的檢測* ./test:免費():無效的指針:0xbec1b504爲什麼我得到錯誤無效指針?

的方式......這個程序被編譯在樹莓派!

+0

它不僅給你一個運行時錯誤,我敢打賭,編譯器爲您提供了一個關於「始亂終棄預選賽」與此代碼藏漢警告。聽聽警告。 – junix

+0

重複的http://stackoverflow.com/questions/11075697/segmentation-fault-when-free-is-used – anishsane

+0

不是真的重複....這裏的結構也很重要! – Christian

回答

4

Usbs = "/dev/ttyUSB1";更改Usbs指向字符串文字。這可能存在於只讀存儲器中,無法釋放。使用

char *DetectDevice(void) 
{ 
    char *Usbs = malloc(1024); 
    strcpy(Usbs, "/dev/ttyUSB1"); 
    return Usbs; 
} 

複製的字符串,或

char *DetectDevice(void) 
{ 
    return strdup("/dev/ttyUSB1"); 
} 

只有內存適量,而不是分配的字符串。

或者,你也可以意識到,DetectDevice返回一個只讀字符串

const char *DetectDevice(void) 
{ 
    return "/dev/ttyUSB1"; 
} 

和調用代碼,而不是刪除free

0

您似乎認爲此屬性Usbs = "/dev/ttyUSB1"的意思是「將右側字符串的內容寫入Usbs指向的內存」。

這不是這個意思。這意味着「覆蓋Usbs指向靜態分配的常量字符串的位置」。這樣的位置不受malloc的管理,不能通過free來解除。

要將常量字符串的內容複製到Usbs中,您需要使用string.h中的設施。

5
char *DetectDevice(void) 
{ 
    char *Usbs = malloc(1024); 
    Usbs = "/dev/ttyUSB1"; 
    return Usbs; 
} 

char *DetectDevice(void)你被分配"/dev/ttyUSB1"字符串地址Usbs,你的回報。並嘗試釋放。 malloc的Usbs中存儲的地址被Usbs = "/dev/ttyUSB1";語句覆蓋,Usbs具有該常量字符串的地址。
"/dev/ttyUSB1"不會動態分配,您錯誤地嘗試釋放!

這樣做。

char *DetectDevice(void) 
    { 
     char *Usbs = malloc(1024); 
     strcpy(Usbs,"/dev/ttyUSB1"); 
     return Usbs; 
    } 
1

free帶有malloccallocrealloc它總是在對。

空閒只能應用於使用malloccallocrealloc分配的指針。

當您在功能DetectDevice中分配了內存塊1024時。在下一行中,您已將指針指定給字符串字面值"/dev/ttyUSB1"

因此,您的指針PathToDevice返回並指出相同的內容,現在您正試圖釋放它,因此您收到了此類錯誤消息。

您應該使用strcpy(Usbs,"/dev/ttyUSB1"),然後返回Usbs

而且您不僅有問題free,但您也有memory leak也。 從您的代碼中刪除free(PathToDevice)後,您仍然有內存泄漏,沒有任何錯誤。

建議:這是不好的做法,首先分配堆上的內存,然後代碼,使指針開始指向其他地址,這將導致內存泄漏)。

1

雖然這可能不是你的問題,但你應該檢查malloc實際上是否返回一個有效的地址,而不是NULL,尤其是在資源有限的系統上,比如樹莓派。

char *DetectDevice(void) 
    { 
     char *Usbs = malloc(1024); 
     if(Usbs != NULL) 
     { 
      strcpy(Usbs,"/dev/ttyUSB1"); 
     } 
     else 
     { 
      // malloc didn't allocate memory do something about it. 
     } 
     return Usbs; 
    } 
相關問題