为什么我的错误指针无效?

时间:2012-12-05 13:17:12

标签: c linux gcc

/* 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():指针无效:0xbec1b504

顺便说一句......这个程序是在覆盆子pi上编译的!

5 个答案:

答案 0 :(得分: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 :(得分: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

答案 2 :(得分:1)

free附带malloccallocrealloc它始终位于该对中。

free只能应用于使用malloccallocrealloc分配的指针。

在函数1024中分配了内存块DetectDevice。在下一行中,您已指定了String literal "/dev/ttyUSB1"的指针。

因此,指针PathToDevice会返回并指向它,现在您正试图释放它,因此您收到此类错误消息。

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

您不仅对free有疑问,而且您还有memory leak。 从代码中删除free(PathToDevice)后,您仍然会发生内存泄漏而没有任何错误。

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

答案 3 :(得分:1)

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

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;
    } 

答案 4 :(得分:0)

您似乎期望此归因Usbs = "/dev/ttyUSB1"表示“将右侧字符串的内容写入Usbs指向的内存中”。

这不是它的意思。这意味着“覆盖Usbs以指向静态分配的常量字符串的位置”。此类位置不受malloc管理,无法通过free释放。

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