Malloc已损坏Malloc';C语言中的d存储器

Malloc已损坏Malloc';C语言中的d存储器,c,memory-management,corruption,C,Memory Management,Corruption,我目前正在帮助一位朋友调试他的一个程序,其中包括链表。他的列表结构非常简单: typedef struct nodo{ int cantUnos; char* numBin; struct nodo* sig; }Nodo; 我们得到了以下代码片段: void insNodo(Nodo** lista, char* auxBin, int auxCantUnos){ printf("*******Insertando\n"); int i; if (*lis

我目前正在帮助一位朋友调试他的一个程序,其中包括链表。他的列表结构非常简单:

typedef struct nodo{
    int cantUnos;
    char* numBin;
    struct nodo* sig;
}Nodo;
我们得到了以下代码片段:

void insNodo(Nodo** lista, char* auxBin, int auxCantUnos){
   printf("*******Insertando\n");
int i;
   if (*lista) printf("DecInt*%p->%p\n", *lista, (*lista)->sig);
Nodo* insert = (Nodo*)malloc(sizeof(Nodo*));
   if (*lista) printf("Malloc*%p->%p\n", *lista, (*lista)->sig);
insert->cantUnos = auxCantUnos;
insert->numBin = (char*)malloc(strlen(auxBin)*sizeof(char));
for(i=0 ; i<strlen(auxBin) ; i++)
    insert->numBin[i] = auxBin[i];
insert->numBin[i] = '\0';
insert->sig = NULL;
Nodo* aux;
/* [etc] */
(*lista)->sig
之前被故意设置为
NULL
,直到这里才签出,并修复了一个潜在的缓冲区溢出(他忘记在insert->numBin中复制NULL终止符)

我想不出发生这种情况的原因,也不知道我还应该提供什么进一步的信息。 (在完全补丁的Windows 7下,在最新稳定的MinGW上编译,朋友在Windows XP下使用MinGW。至少在我的机器上,只有在没有连接GDB的情况下才会发生。)

有什么想法吗?建议?可能的驱魔技术?(当前的黑客正在将sig指针复制到一个临时变量,并在malloc之后将其还原。它无论如何都会中断。结果第二个malloc也会破坏它。有趣的是,它将sig重置为与第一个完全相同的值)


更新:谢谢您的回答。关于
节点*
这件事,它是固定的,但没有变化。至少可以防止事后出现潜在问题。字符串复制不是问题,因为我已经自己修复了所有缺少的\0。(注意for后面的
insertBin[i]='\0'

一个问题是这一行:

Nodo* insert = (Nodo*)malloc(sizeof(Nodo*)); 
Nodo* insert = (Nodo*)malloc(sizeof(Nodo*));
应该是

Nodo* insert = (Nodo*)malloc(sizeof(Nodo)); 
(经验法则:sizeof()中应该少一个“*”)

您需要为节点结构分配空间,而不是为指向节点结构的指针分配空间(顺便说一句,在32位系统上为4字节)


存在一个类似的问题,即没有为字符串(字符数组)分配足够的空间;为字符串(char*)分配内存时,不要忘记终止零“\0”的空间。

请确保结尾处的\0的长度为strlen+1

insert->numBin = (char*)malloc(strlen(auxBin)*sizeof(char));
需要

insert->numBin = (char*)malloc(strlen(auxBin) + 1);
也不需要说*sizeof(char),它是1

John关于如何分配结构的另一点是正确的,它不能是指针的大小,而是结构的大小。

在这一行:

Nodo* insert = (Nodo*)malloc(sizeof(Nodo*)); 
Nodo* insert = (Nodo*)malloc(sizeof(Nodo*));
您只为指向Nodo的指针分配了足够的内存,而不是整个Nodo。你想要:

Nodo* insert = (Nodo*)malloc(sizeof(Nodo));
此外,您可能至少有一个其他分配错误:

insert->numBin = (char*)malloc(strlen(auxBin)*sizeof(char));
for(i=0 ; i<strlen(auxBin) ; i++)
    insert->numBin[i] = auxBin[i];
编辑:刚刚注意到您在Windows上,所以strdup()可能不可用(这是一个POSIX例程),所以您可以通过这种方式覆盖字符串复制。注意终端长度上的+1:

insert->numBin = (char *)malloc( strlen(auxBin)+1 );
strcpy( insert->numBin, auxBin );

嗯,这是我忘记注意到的一件malloc古怪的事情。即使您设置
insert->numBin[I]='\0'insert->numBin
执行
malloc()
时,您仍然没有实际为该“\0”分配空间。这里需要一个
+1
。如果局部变量内存(i和insert的内存)接近2832B6EE的范围,您能检查一下吗。。因此可以怀疑堆栈损坏
strdup(3)
可能是标准的(POSIX),但它不是C89或C99中定义的标准C库的一部分。此外,一些真正有用的POSIX函数在Windows上不一定可用(尤其是在使用MinGW时),因此您应该小心推荐的功能:公共域
strdup()
如果您的平台需要它: