首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在空闲指针内存之后,我可以重新赋值

在空闲指针内存之后,我可以重新赋值
EN

Stack Overflow用户
提问于 2014-02-27 09:32:57
回答 2查看 1.9K关注 0票数 0

嗨,我正在学习一些调试概念。在这个程序中,我试图模拟核心转储。我希望核心会被抛弃,但它不是生成核心。程序执行没有任何问题。

首先,我为ptr分配20个字节。我将一个新字符串复制到ptr。然后,我释放ptr,然后打印ptr它没有任何pblm工作。最后,我将分配一些其他字符串,这一次它可能会生成核心转储。但我没有得到任何核心垃圾。有谁能解释一下为什么它不产生核心转储。

代码语言:javascript
运行
复制
int main()
{
   char *ptr;
   ptr =(char*)  malloc (20);
   strcpy(ptr,"MemoryOperations");
   printf("Before Free memory : %s\n",ptr);
   free(ptr);
   printf("After Free memory : %s\n",ptr);
   strcpy(ptr,"MemReassign");
   printf("After Re Assigning : %s\n",ptr);
   return 0;
}

与我使用dbx运行的代码相同,

代码语言:javascript
运行
复制
(dbx) check -all
access checking - ON
memuse checking - ON
(dbx) run
Running: a.out 
(process id 19081)
RTC: Enabling Error Checking...
RTC: Running program...
Before Free memory : MemoryOperations
Read from unallocated (rua):
Attempting to read 1 byte at address 0x100101a48
which is 2232 bytes into the heap; no blocks allocated
stopped in _ndoprnt at 0xffffffff671abbf0
0xffffffff671abbf0: _ndoprnt+0x1c04:    call     _PROCEDURE_LINKAGE_TABLE_+0x620 [PLT] ! 0xffffffff67340d20
(dbx) exit
EN

Stack Overflow用户

发布于 2014-02-27 09:38:14

如果在内存释放后写入内存,任何事情都可能发生。这是不确定的行为。你可以得到一个核心转储物。在您的情况下,您没有得到一个核心转储,因为内存,即使它已经释放,仍然可以由您的进程访问。如果您要在malloc语句之前执行另一个return 0语句并写入该内存,则字符串“重新赋值后.”很可能会被覆盖。

对于dbx,printf("After Free memory : %s\n",ptr);语句会产生一个“从未分配的数据中读取”错误,因为您已经打开了访问检查,但是如果没有dbx,就根本不存在访问检查。

为了模拟核心转储,您可以这样做:

代码语言:javascript
运行
复制
void main()
{
  char *p = NULL ;
  *p = 'A' ;
}

这将在大多数平台上崩溃。

票数 3
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22064341

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档