释放C中的内存

free the memory in C

在释放指针 p 并且 p 不是 NULL 之后,代码 1 的结果仍然是 10code 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 中,这是相同的,您在 whileprintf 的测试中都可以访问空闲内存以及要分配的值 n

...based on the logic of code 1...

代码 1 访问释放的内存(所谓的悬空指针),这是未定义的行为。任何事情都可能发生,包括但不限于您的程序崩溃、返回的最后一个值(=您观察到的行为)或程序做一些完全出乎意料的事情。

因此,您不能从 "the logic of code 1".

推断出 任何东西