C 为什么我得到错误无效指针?
错误消息:*检测到glibc*/测试:空闲:无效指针:0xbec1b504 顺便说一下。。。这个程序是在树莓皮上编译的 Usbs=/dev/ttyUSB1;将USB更改为指向字符串文字。这可能存在于只读内存中,无法释放。使用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
/* 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;
}