首页 > 代码库 > 堆内存还是栈内存?
堆内存还是栈内存?
《剑指Offer》里面有一道题目,“把一字符数组中的空格用字符串“%20”代替“,看了书上的思路,然后写出来的程序输入的空格太多时,会出现错误“memory clobbered before allocated block”。其原因是没搞清楚栈内存,堆内存的分配和区别。错误代码如下:
#include <stdio.h> #include <malloc.h> #include <string.h> void replaceSpace(char string[]); int main() { char string[] = "This is a test!"; //字符数组,在栈内存区分配内存 replaceSpace(string); printf("%s",string); free(string); return 0; } void replaceSpace(char string[]) { int index, spaceNum; size_t OriginLen, FinalLen; int OriginIndex, FinalIndex; index = 0; spaceNum = 0; OriginLen = 0; while(string[index] != '\0') { if(string[index] == ' ') spaceNum++; OriginLen++; index++; } FinalLen = OriginLen + spaceNum * 2; string = realloc(string,FinalLen); //realloc函数 在堆内存区分配内存 OriginIndex = OriginLen; FinalIndex = FinalLen; while(OriginIndex >= 0) { if(string[OriginIndex] != ' ') { string[FinalIndex] = string[OriginIndex]; } else { string[FinalIndex] = '0'; string[--FinalIndex] = '2'; string[--FinalIndex] = '%'; } --FinalIndex; --OriginIndex; } }
程序的第9行定义并初始化了一个字符数组string,它的内存分配由系统自动在完成,且是在栈上分配的。
当我在replaceSpace函数中要把string中的空格替换成“%20”的时,需要给它扩展内存,这是我想到了realloc函数。但不幸的是,realloc函数操作的是堆内存,
而我们的string是在栈上分配的,所以realloc函数在堆上根本就找不到string对应的地址,更别说给它扩展内存了,所以这个函数返回一个空值,这也就是报错的原因。
解决方法:
1. 最初就给string字符数组给足空间,不在replaceSpace函数中重新扩展。
char string[100] = "this is a test!";
2. 最初使用malloc函数给string分配空间。
int main() { char * string; string = (char*)malloc(strlen("test")*sizeof(char)); strncpy(string,"test",strlen("test")); ... } void replaceSpace(char string[]) { string = realloc(string,FinalLen); ... if(string != NULL) { ... } else { printf("alloc memory error!\n"); } ... }
PS. 关于栈,堆内存分配相关文章参考:
http://bbs.csdn.net/topics/390147637
堆内存还是栈内存?
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。