2012-12-05 61 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; 
    } 
相关问题