zoukankan      html  css  js  c++  java
  • 堆内存或者堆栈存储器?

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

    
    
    

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

  • 相关阅读:
    my first android test
    VVVVVVVVVV
    my first android test
    my first android test
    my first android test
    ini文件
    ZZZZ
    Standard Exception Classes in Python 1.5
    Python Module of the Week Python Module of the Week
    my first android test
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4829454.html
Copyright © 2011-2022 走看看