• 堆内存或者堆栈存储器?


    《剑指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

    
    
    

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

  • 相关阅读:
    二叉搜索树
    【树】List Leaves
    模板——dijkstra单源最短路
    余数求和——除法分块
    倍增——ST表
    线段树——内存池
    线段树——模板
    洛谷 P1498 南蛮图腾
    洛谷 P2199 最后的迷宫
    洛谷 P1495 中国剩余定理
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4829454.html
Copyright © 2020-2023  润新知