问题描述:
在vs中编写c语言代码。再main函数中调用malloc的程序正常运行。放在另外一个.c文件里总是报访问失败。
char * test = (char *)malloc(10);
memset(test,0,10);
非常基础的一句话。
运行memset,访问内存的时候总是异常。
问题分析:
当查看内存的时候,调试器的反应是
为啥会造成读取出错呢?
查看反汇编代码如下(汇编解释在最后):
char * test = (char *)malloc(10);
00007FF7D7AD1D5A mov ecx,0Ah
00007FF7D7AD1D5F call malloc (07FF7D7AD1361h)
00007FF7D7AD1D64 cdqe
00007FF7D7AD1D66 mov qword ptr [test],rax
msdn上写的。使用malloc需要包含头文件 <stdlib.h> and <malloc.h>
问题原因:
包含之后的正确的反汇编是:
char * test = (char *)malloc(10);
00007FF7D1411D5A mov ecx,0Ah
00007FF7D1411D5F call qword ptr [__imp_malloc (07FF7D14344D0h)]
00007FF7D1411D65 mov qword ptr [test],rax
问题解决方法:
使用malloc需要包含头文件 <stdlib.h> and <malloc.h>
汇编解释:
mov 指令:指令用于将一个值写入某个寄存器
call指令:调用功能。这些指令实现了子例程的调用和返回
CBW/CWDE/CDQE扩展指令:使用符号扩展的方式对源操作数进行双倍扩展。使用eax的最高位拓展rax高32位的所有位
qword ptr:指针内容。大小指令BYTE PTR,WORD PTR和DWORD PTR可以达到这个目的,分别指示1、2和4个字节的大小。