释放C中的内存
free the memory in C
在释放指针 p
并且 p
不是 NULL
之后,代码 1 的结果仍然是 10
。
code 2的输入是5
(长度),每个节点的值是1 2 3 4 5
,但是在后面的所有节点都为空的情况下输出什么都没有不是 NULL
.
我的问题是,根据代码1的逻辑,节点的所有值不是NULL
,难道不应该打印出来吗?
谁能给我解释一下?非常感谢!
代码 1:
#include <stdio.h>
#include <stdlib.h>
int main() {
int *p = (int*)malloc(sizeof(int));
*p = 10;
free(p);
if (p != NULL) {
printf("%d\n", *p);
}
return 0;
}
代码 2:
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
struct Node *next;
int value;
} Node, *list;
list create_Node() {
list head = (list)malloc(sizeof(Node));
if (!head)
exit(-1);
list tail = head;
int len;
int val;
printf("Please enter the length of the list:\n ");
scanf("%d", &len);
for (int i = 0; i < len; i++) {
list new = (list)malloc(sizeof(Node));
if (!new)
exit(-1);
printf("Please enter the value of the node:\n ");
scanf(" %d", &val);
new->value = val;
tail->next = new;
tail = new;
}
return head;
}
int delete_List(list l) {
if (l == NULL) {
printf("List is empty!");
exit(-1);
}
list temp;
while (l) {
temp = l->next;
free(l);
l = temp;
}
return 1;
}
int main() {
Node *n = create_Node();
n = n->next;
delete_List(n);
while (n->next != NULL) {
printf("%d\n", n->value);
n = n->next;
}
return 0;
}
有
int main(){
int *p = (int*)malloc(sizeof(int));
*p = 10;
free(p);
if(p!=NULL)
{
printf("%d\n",*p);
}
return 0;
}
My question is that based on the logic of code 1, shouldn't all the values of nodes be printed because they are not NULL??
除了在没有更多内存的情况下,malloc 将工作并且 return 一个非空值,在 free p 的值未更改且仍然非空,因此代码尝试读取空闲内存,这是未定义的行为
有更好的方法(尝试)打印随机值:-)
在代码 2 中,这是相同的,您在 while 和 printf 的测试中都可以访问空闲内存以及要分配的值 n
...based on the logic of code 1...
代码 1 访问释放的内存(所谓的悬空指针),这是未定义的行为。任何事情都可能发生,包括但不限于您的程序崩溃、返回的最后一个值(=您观察到的行为)或程序做一些完全出乎意料的事情。
因此,您不能从 "the logic of code 1".
推断出 任何东西
在释放指针 p
并且 p
不是 NULL
之后,代码 1 的结果仍然是 10
。
code 2的输入是5
(长度),每个节点的值是1 2 3 4 5
,但是在后面的所有节点都为空的情况下输出什么都没有不是 NULL
.
我的问题是,根据代码1的逻辑,节点的所有值不是NULL
,难道不应该打印出来吗?
谁能给我解释一下?非常感谢!
代码 1:
#include <stdio.h>
#include <stdlib.h>
int main() {
int *p = (int*)malloc(sizeof(int));
*p = 10;
free(p);
if (p != NULL) {
printf("%d\n", *p);
}
return 0;
}
代码 2:
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
struct Node *next;
int value;
} Node, *list;
list create_Node() {
list head = (list)malloc(sizeof(Node));
if (!head)
exit(-1);
list tail = head;
int len;
int val;
printf("Please enter the length of the list:\n ");
scanf("%d", &len);
for (int i = 0; i < len; i++) {
list new = (list)malloc(sizeof(Node));
if (!new)
exit(-1);
printf("Please enter the value of the node:\n ");
scanf(" %d", &val);
new->value = val;
tail->next = new;
tail = new;
}
return head;
}
int delete_List(list l) {
if (l == NULL) {
printf("List is empty!");
exit(-1);
}
list temp;
while (l) {
temp = l->next;
free(l);
l = temp;
}
return 1;
}
int main() {
Node *n = create_Node();
n = n->next;
delete_List(n);
while (n->next != NULL) {
printf("%d\n", n->value);
n = n->next;
}
return 0;
}
有
int main(){ int *p = (int*)malloc(sizeof(int)); *p = 10; free(p); if(p!=NULL) { printf("%d\n",*p); } return 0; }
My question is that based on the logic of code 1, shouldn't all the values of nodes be printed because they are not NULL??
除了在没有更多内存的情况下,malloc 将工作并且 return 一个非空值,在 free p 的值未更改且仍然非空,因此代码尝试读取空闲内存,这是未定义的行为
有更好的方法(尝试)打印随机值:-)
在代码 2 中,这是相同的,您在 while 和 printf 的测试中都可以访问空闲内存以及要分配的值 n
...based on the logic of code 1...
代码 1 访问释放的内存(所谓的悬空指针),这是未定义的行为。任何事情都可能发生,包括但不限于您的程序崩溃、返回的最后一个值(=您观察到的行为)或程序做一些完全出乎意料的事情。
因此,您不能从 "the logic of code 1".
推断出 任何东西