`<unknown>' 中的错误:损坏的双链表:0x011eb8e0 偶尔会在调用 free 时发生
Error in `<unknown>': corrupted double-linked list: 0x011eb8e0 happens Occasionally when calling free
我对 free
有疑问。
我在在线编译器中测试了我的代码,但一切正常。但是在我的设备(这是一个 POS)中,它在免费调用时会出现异常。它释放了 4 个变量中的两个,然后引发异常。
我的设备真实代码:
char **MenuItems = malloc (MAX_PACKETS * sizeof(char *));
struct packetInfos * packets = (struct packetInfos *)malloc(sizeof(struct packetInfos)*MAX_PACKETS);
size = getPacketNames(groupId,packets,MenuItems);
...
...
...
TRACE(("====size %d",size));
for(;i<size;i++) {
TRACE(("====%d=",i,MenuItems[i]));
free(MenuItems[i]);
}
free(MenuItems);
给我:
[src/menu.c][NetChargeMenu_L3][1637]>>>====size 4
[src/menu.c][NetChargeMenu_L3][1639]>>>===counter=0 address=34259480
[src/menu.c][NetChargeMenu_L3][1639]>>>===counter=1 address=34260528
有时它会释放所有变量,但会出现以下错误并冻结所有内容:
Error in `<unknown>': corrupted double-linked list: 0x011eb8e0
我的程序是这样的
#include <stdio.h>
#include <stdlib.h>
#define MAX 16
int getPacketNames(char **names){
int limit = 4;
int i = 0;
for(i=0;i<MAX;i++) {
if(i==limit)
break;
names[i] = malloc(64);
sprintf(names[i],"random text %d",i);
}
return i;
}
int main()
{
printf("Hello World");
int i=0;
int size=0;
char **MenuItems = malloc (MAX * sizeof(char *));
size = getPacketNames(MenuItems);
// do something
for(i=0;i<size;i++) {
free(MenuItems[i]);
}
free(MenuItems);
return 0;
}
我读了这个 post (What does 'corrupted double-linked list' mean) 找不到对我的 C 代码有用的提示。
感谢任何提示。
原因是 malloc
记忆而不是 free
它。我在分配中使用了定长!在我使用动态大小进行分配之前。然而,分配动态大小的内存一定不是问题,但使用固定大小的分配可能会解决其他问题,例如我的问题。
我以前的代码(免费时有问题):
struct packetInfos{
int id;
char name[64];
long amount;
};
void getOperatorNames(char *names[]) {
int i=0;
for(; i<MAX; i++) {
sprintf(packets[i].name, "%s", sqlite3_column_text(stmt, 2));
names[i] = malloc(strlen(packets[i].name) + 1); // the cause of problem in free
strcpy(names[i], op[i].fname);
}
}
我当前的代码(没有问题):
void getOperatorNames(char *names[]) {
int i=0;
for(; i<MAX; i++) {
sprintf(packets[i].name, "%s", sqlite3_column_text(stmt, 2));
names[i] = malloc(64);
strcpy(names[i], op[i].fname);
}
}
我对 free
有疑问。
我在在线编译器中测试了我的代码,但一切正常。但是在我的设备(这是一个 POS)中,它在免费调用时会出现异常。它释放了 4 个变量中的两个,然后引发异常。
我的设备真实代码:
char **MenuItems = malloc (MAX_PACKETS * sizeof(char *));
struct packetInfos * packets = (struct packetInfos *)malloc(sizeof(struct packetInfos)*MAX_PACKETS);
size = getPacketNames(groupId,packets,MenuItems);
...
...
...
TRACE(("====size %d",size));
for(;i<size;i++) {
TRACE(("====%d=",i,MenuItems[i]));
free(MenuItems[i]);
}
free(MenuItems);
给我:
[src/menu.c][NetChargeMenu_L3][1637]>>>====size 4
[src/menu.c][NetChargeMenu_L3][1639]>>>===counter=0 address=34259480
[src/menu.c][NetChargeMenu_L3][1639]>>>===counter=1 address=34260528
有时它会释放所有变量,但会出现以下错误并冻结所有内容:
Error in `<unknown>': corrupted double-linked list: 0x011eb8e0
我的程序是这样的
#include <stdio.h>
#include <stdlib.h>
#define MAX 16
int getPacketNames(char **names){
int limit = 4;
int i = 0;
for(i=0;i<MAX;i++) {
if(i==limit)
break;
names[i] = malloc(64);
sprintf(names[i],"random text %d",i);
}
return i;
}
int main()
{
printf("Hello World");
int i=0;
int size=0;
char **MenuItems = malloc (MAX * sizeof(char *));
size = getPacketNames(MenuItems);
// do something
for(i=0;i<size;i++) {
free(MenuItems[i]);
}
free(MenuItems);
return 0;
}
我读了这个 post (What does 'corrupted double-linked list' mean) 找不到对我的 C 代码有用的提示。
感谢任何提示。
原因是 malloc
记忆而不是 free
它。我在分配中使用了定长!在我使用动态大小进行分配之前。然而,分配动态大小的内存一定不是问题,但使用固定大小的分配可能会解决其他问题,例如我的问题。
我以前的代码(免费时有问题):
struct packetInfos{
int id;
char name[64];
long amount;
};
void getOperatorNames(char *names[]) {
int i=0;
for(; i<MAX; i++) {
sprintf(packets[i].name, "%s", sqlite3_column_text(stmt, 2));
names[i] = malloc(strlen(packets[i].name) + 1); // the cause of problem in free
strcpy(names[i], op[i].fname);
}
}
我当前的代码(没有问题):
void getOperatorNames(char *names[]) {
int i=0;
for(; i<MAX; i++) {
sprintf(packets[i].name, "%s", sqlite3_column_text(stmt, 2));
names[i] = malloc(64);
strcpy(names[i], op[i].fname);
}
}