《剑指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
版权声明:本文博主原创文章。博客,未经同意不得转载。