当前位置: 首页 > 面试题库 >

在free()之后使用指针

章宏峻
2023-03-14
问题内容

在测试期间,我发现在free()之后可以使用指针。我有以下代码:

typedef struct{

    int module_id;
    int adc_id;
    struct config_line * pnext;

} config_line;
config_line * create_list()
{

config_line * phead = (config_line *) malloc(sizeof(config_line));
phead->pnext=NULL;
phead->module_id = 1;
phead->adc_id = 2;

printf("module_id=%d adc_id=%d\n",phead->module_id, phead->adc_id);

free(phead);

printf("module_id=%d adc_id=%d\n",phead->module_id, phead->adc_id);

phead->module_id = 2;
phead->adc_id = 5;

printf("module_id=%d adc_id=%d\n",phead->module_id, phead->adc_id);
}

此代码的输出是:

module_id=1 adc_id=2
module_id=0 adc_id=2
module_id=2 adc_id=5

为什么在free(phead)之后我可以访问(读和写)指针?为什么没有分割错误?


问题答案:

因为使用无效的指针会调用未定义的行为。这意味着行为是…好… 未定义。 它没有崩溃的 义务



 类似资料:
  • 在处理一个包含二进制数据的旧数据库的导出时,我偶然发现了我们的一个实用方法中的一个异常: java.lang.AbstractMethoderror:net.sourceforge.jtds.jdbc.blobimpl.free() 在检查了我们的代码库之后,我发现实用方法直到现在都没有使用过,基本上是这样的: BinaryHolder只是保存二进制数据的包装器(在您询问之前,代码执行得很好,直到

  • 我完全是Java的初学者。我制作了一个类,想输入一个数字和一个字符串,但我认为s=in。nextLine() 忽略此行。如何逐行输入两个值。

  • 本文向大家介绍webpack4之SplitChunksPlugin使用指南,包括了webpack4之SplitChunksPlugin使用指南的使用技巧和注意事项,需要的朋友参考一下 写在前面 前面写了一篇有关webpack4的不完全升级指南以及在webpack3.x迁移的时候遇到的问题,有兴许可以看一下。 0. 参数介绍 先对参数有一个大概的认识,虽然撸了很多遍官方的更新文档,但是还是去参看了一

  • free(释放原先配置的内存) 相关函数 malloc,calloc,realloc,brk 表头文件 #include<stdlib.h> 定义函数 void free(void *ptr); 函数说明 参数ptr为指向先前由malloc()、calloc()或realloc()所返回的内存指针。调用free()后ptr所指的内存空间便会被收回。假若参数ptr所指的内存空间已被收回或是未知的内存

  • free 释放原先配置的内存 相关函数 malloc,calloc,realloc,brk 表头文件 #include<stdlib.h> 定义函数 void free(void *ptr); 函数说明 参数ptr为指向先前由malloc()、calloc()或realloc()所返回的内存指针。调用free()后ptr所指的内存空间便会被收回。假若参数ptr所指的内存空间已被收回或是未知的内