《剑指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
原文地址:http://blog.csdn.net/gaohuaid/article/details/40027153