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: free(): invalid pointer: 0xbec1b504

顺便说一句……这个程序是在树莓派上编译的!

4

5 回答 5

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

char *DetectDevice(void)您被分配的 "/dev/ttyUSB1"字符串地址Usbs ,您返回。并尝试释放。malloc存储的地址UsbsUsbs = "/dev/ttyUSB1";语句覆盖,并且 Usbs 具有该常量字符串的地址。
"/dev/ttyUSB1"不是您错误地尝试释放的动态分配的!

这样做。

char *DetectDevice(void)
    {   
        char *Usbs = malloc(1024);
        strcpy(Usbs,"/dev/ttyUSB1");
        return Usbs;
    } 
于 2012-12-05T13:20:45.030 回答
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从调用代码中删除。

于 2012-12-05T13:19:33.487 回答
1

free带有mallocor callocorrealloc总是在那对。

free 只能应用于使用mallocorcalloc或分配的指针realloc

当您1024在函数中分配内存块时DetectDevice。在下一行中,您已将指针分配给 String literal "/dev/ttyUSB1"

因此,您的指针返回并指向相同的内容PathToDevice,现在您正在尝试释放它,因此您会收到这种错误消息。

您应该使用strcpy(Usbs,"/dev/ttyUSB1")然后返回Usbs.

你不仅有问题,free而且你也有memory leak。从您的代码中删除后free(PathToDevice),您仍然有内存泄漏而没有任何错误。

建议:首先在堆上分配内存然后编写代码以使指针开始指向其他地址是不好的做法。这会导致内存泄漏)。

于 2012-12-05T13:24:12.787 回答
1

虽然这可能不是您的问题,但您应该检查malloc实际返回的地址是有效地址而不是 NULL,尤其是在资源有限的系统上,例如树莓派。

IE

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;
    } 
于 2012-12-05T14:47:41.593 回答
0

您似乎期望此属性Usbs = "/dev/ttyUSB1"意味着“将右侧字符串的内容写入 Usbs 指向的内存”。

这不是它的意思。它的意思是“覆盖 Usbs 以指向静态分配的常量字符串的位置”。这样的位置不由 管理malloc,也不能由 释放free

要将常量字符串的内容复制到Usbs您需要使用string.h.

于 2012-12-05T13:20:40.007 回答