我目前正在帮助一个朋友调试他的一个程序,其中包括链表。他的列表结构非常简单:
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] */
(带有额外缩进的行是我出于调试目的添加的)
这产生了以下结果:
*******Insertando
DecInt*00341098->00000000
Malloc*00341098->2832B6EE
(*lista)->sig以前故意设置为NULL,直到这里检查,并修复了潜在的缓冲区溢出(他忘记在 insert->numBin 中复制 NULL 终止符)。
我想不出发生这种情况的单一原因,我也不知道我还应该提供什么作为进一步的信息。(在完全修补的 Windows 7 下在最新的稳定 MinGW 上编译,朋友在 Windows XP 下使用 MinGW。至少在我的机器上,只有在未连接 GDB 时才会发生。)
有任何想法吗?建议?可能的驱魔技术?(当前的黑客正在将 sig 指针复制到一个临时变量并在 malloc 之后恢复它。无论如何它都会中断。结果第二个 malloc 也破坏了它。有趣的是,它将 sig 重置为与第一个完全相同的值)。
更新:感谢您的回答。关于这Node*件事,它是固定的,但没有改变。至少可以防止事后出现潜在问题。字符串复制不是问题,因为我自己已经修复了所有丢失的 \0。(注意insertBin[i] = '\0'for后面的)