在 C 中使用 free() 时出现堆损坏错误
Heap Corruption Error when using free() in C
今天我试图在 C 中使用链表实现堆栈,一切都很好,直到我创建了一个使用 free 的 pop 函数,一旦我调用 free 函数我的程序崩溃然后 Visual Studio throws Heap新 window 中的损坏错误消息。除此功能外,所有其他功能都运行良好,我只是无法弄清楚发生了什么。感谢您的所有回答。
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
struct Node {
char data;
struct Node *next;
};
void push(struct Node **top, char data) {
struct Node *temp = (struct Node *)malloc(sizeof(struct Node *));
if (temp == NULL) {
printf("Stack overflow.\n");
} else {
temp->data = data;
temp->next = *top;
(*top) = temp;
}
}
void pop(struct Node **top) {
struct Node *aux;
if (*top != NULL) {
printf("Popped element: %c\n", (*top)->data);
aux = *top;
*top = (*top)->next;
free(aux);
} else {
printf("Stack is empty");
}
}
void display(struct Node *top) {
struct Node *aux = top;
while (aux != NULL) {
printf("%c ", aux->data);
aux = aux->next;
}
printf("\n");
}
int main() {
struct Node *root = NULL;
push(&root, 'a');
push(&root, 'b');
push(&root, 'c');
printf("Stack:\n");
display(root);
pop(&root);
printf("\nStack:\n");
display(root);
return 0;
}
您只为该行中的指针分配了缓冲区
struct Node *temp = (struct Node *)malloc(sizeof(struct Node *));
在典型环境中,结构的大小将大于指针,因此分配的内存大小不够。
该行应该是
struct Node *temp = malloc(sizeof(struct Node));
或
struct Node *temp = malloc(sizeof(*temp));
注:c - Do I cast the result of malloc? - Stack Overflow
您可能想这样做:
struct Node *temp = (struct Node *)malloc(sizeof(struct Node));
而不是:
struct Node *temp = (struct Node *)malloc(sizeof(struct Node *));
今天我试图在 C 中使用链表实现堆栈,一切都很好,直到我创建了一个使用 free 的 pop 函数,一旦我调用 free 函数我的程序崩溃然后 Visual Studio throws Heap新 window 中的损坏错误消息。除此功能外,所有其他功能都运行良好,我只是无法弄清楚发生了什么。感谢您的所有回答。
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
struct Node {
char data;
struct Node *next;
};
void push(struct Node **top, char data) {
struct Node *temp = (struct Node *)malloc(sizeof(struct Node *));
if (temp == NULL) {
printf("Stack overflow.\n");
} else {
temp->data = data;
temp->next = *top;
(*top) = temp;
}
}
void pop(struct Node **top) {
struct Node *aux;
if (*top != NULL) {
printf("Popped element: %c\n", (*top)->data);
aux = *top;
*top = (*top)->next;
free(aux);
} else {
printf("Stack is empty");
}
}
void display(struct Node *top) {
struct Node *aux = top;
while (aux != NULL) {
printf("%c ", aux->data);
aux = aux->next;
}
printf("\n");
}
int main() {
struct Node *root = NULL;
push(&root, 'a');
push(&root, 'b');
push(&root, 'c');
printf("Stack:\n");
display(root);
pop(&root);
printf("\nStack:\n");
display(root);
return 0;
}
您只为该行中的指针分配了缓冲区
struct Node *temp = (struct Node *)malloc(sizeof(struct Node *));
在典型环境中,结构的大小将大于指针,因此分配的内存大小不够。
该行应该是
struct Node *temp = malloc(sizeof(struct Node));
或
struct Node *temp = malloc(sizeof(*temp));
注:c - Do I cast the result of malloc? - Stack Overflow
您可能想这样做:
struct Node *temp = (struct Node *)malloc(sizeof(struct Node));
而不是:
struct Node *temp = (struct Node *)malloc(sizeof(struct Node *));