堆内存或者堆栈存储器?

《剑指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] != '')
    {
        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!
");
    }
    ...
}

盗一段代码,(这段代码对于堆和栈的差别说的非常清楚啊):


PS. 关于栈,堆内存分配相关文章參考:

     http://bbs.csdn.net/topics/390147637





版权声明:本文博主原创文章。博客,未经同意不得转载。

原文地址:https://www.cnblogs.com/blfshiye/p/4829454.html