C 为什么我得到错误无效指针?

C 为什么我得到错误无效指针?,c,linux,gcc,C,Linux,Gcc,错误消息:*检测到glibc*/测试:空闲:无效指针:0xbec1b504 顺便说一下。。。这个程序是在树莓皮上编译的 Usbs=/dev/ttyUSB1;将USB更改为指向字符串文字。这可能存在于只读内存中,无法释放。使用 /* DECLARED FUNCTIONS */ char *DetectDevice(void); int main(int argc, char *argv[]) { char *PathToDevice; PathToDevice = DetectD

错误消息:*检测到glibc*/测试:空闲:无效指针:0xbec1b504

顺便说一下。。。这个程序是在树莓皮上编译的

Usbs=/dev/ttyUSB1;将USB更改为指向字符串文字。这可能存在于只读内存中,无法释放。使用

/* 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;
}
复制字符串,或

char *DetectDevice(void)
{   
    char *Usbs = malloc(1024);
    strcpy(Usbs, "/dev/ttyUSB1");
    return Usbs;
}
而是为字符串分配适当的内存量

或者,您也可以识别DetectDevice返回只读字符串

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

并从调用代码中删除free。

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

这不是它的意思。这意味着覆盖USB以指向静态分配的常量字符串的位置。这样的位置不由malloc管理,并且不能由free释放

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

在char*DetectDevicevoid中,将/dev/ttyUSB1字符串地址分配给返回的USB。试着释放。 由malloc存储在Usbs中的哪个地址被Usbs=/dev/ttyUSB1覆盖;语句和Usbs具有此常量字符串的地址。 /dev/ttyUSB1不是动态分配的,您错误地试图释放它

像这样做

免费随malloc、calloc或realloc一起提供,它们总是成对的

free只能应用于使用malloc、calloc或realloc分配的指针

当您在function DetectDevice中分配了内存块1024时。在下一行中,您已将指针指定给字符串literal/dev/ttyUSB1

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

您应该使用strcpyUsbs,/dev/ttyUSB1,然后返回usb

你不仅有空闲的问题,还有内存泄漏。 从代码中删除freePathToDevice后,仍然存在内存泄漏,没有任何错误


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

尽管这可能不是您的问题,但您应该检查malloc是否实际返回有效地址且不为NULL,特别是在资源有限的系统上,如raspberry pi

i、 e


这不仅会给你一个运行时错误,我敢打赌编译器也会给你一个警告,提醒你在这段代码中丢弃限定符。听警告。重复的不是真正的重复。。。。这里的结构也很重要!
const char *DetectDevice(void)
{   
    return "/dev/ttyUSB1";
}
char *DetectDevice(void)
{   
    char *Usbs = malloc(1024);
    Usbs = "/dev/ttyUSB1";
    return Usbs;
}
char *DetectDevice(void)
    {   
        char *Usbs = malloc(1024);
        strcpy(Usbs,"/dev/ttyUSB1");
        return Usbs;
    } 
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;
    }