开发者社区> 问答> 正文

malloc与free的疑惑

int main()
{
  char *str = (char*) malloc(3 * sizeof(char));
  char *index = str;
  long long count = 0;

  while(index != NULL){
    printf("%p\n", index++);
    count ++;
  }

  printf("lld\n", count);
}
在上面的代码中,我用malloc分配了3个字节的空闲内存。理论上(index+4)应该等于NULL,此时就应该停止循环,但是上面的代码会在while中不断的循环输出地址。
起初,我认为这应该是malloc只是给出一块内存空闲空间的首地址,并未限制空间的大小。而是由free函数根据malloc的参数来做回收,所以又试了下面的例子:

int main()
{
  char *str = (char*) malloc(5 * sizeof(char));
  char *index = str;

  for(int i = 0; i < 10; i++){
    *(index+i) = 'a';
  }
  //输出字符的ASCII码
  for(int i = 0; i < 10; i++){
      printf("%d ", *(str+i));
  }
  printf("\n");

  free((void*) str);

  //输出字符的ASCII码
  for(int i = 0; i < 10; i++){
    printf("%d ", *(str+i));
  }
}
实际的输出结果是这样的:

97 97 97 97 97 97 97 97 97 97
0  0  0  0  97 97 97 97 97 97
无论怎样修改malloc中分配的字节数,总是前面的4个97变为0。
为什么会出现这样奇怪的结果?请大家帮我解释一下这个问题,感激不尽!!!

展开
收起
a123456678 2016-06-06 16:23:03 1809 0
1 条回答
写回答
取消 提交回答
  • 码农|Coder| Pythonista

    malloc不会在分配的内存的下一个字节补上NULL,它也不会初始化内存为NULL,它只是在堆上开辟一块空间。
    free会回收已分配的内存,它只是把一段内存重新标记为可用。但是str的值还是没变的,那么它指向的区域将是“invalid”的,也即是什么值都有可能。可能你的程序刚好只重新使用了前四位,所以后面几位还是保持原来的值不变。

    2019-07-17 19:28:55
    赞同 展开评论 打赏
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载