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。
为什么会出现这样奇怪的结果?请大家帮我解释一下这个问题,感激不尽!!!
malloc
不会在分配的内存的下一个字节补上NULL,它也不会初始化内存为NULL,它只是在堆上开辟一块空间。free
会回收已分配的内存,它只是把一段内存重新标记为可用。但是str的值还是没变的,那么它指向的区域将是“invalid”的,也即是什么值都有可能。可能你的程序刚好只重新使用了前四位,所以后面几位还是保持原来的值不变。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。