QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 749|回复: 3

难道已经分配过的内存还能再分配

[复制链接]
发表于 2004-10-12 13:27:42 | 显示全部楼层 |阅读模式
我写的一个以空白字符我分隔符的(''之间的不打断)打断字符串的函数.

如图:
buf[0] = 0x8049ab8.已经分配过了.
执行buf = (char**)realloc(buf,num);后.
发现&buf[num-1](也就是&buf[4]) = 0x8049ab8.
难道已经分配过的内存还能再分配吗?
还请高手指教.


#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define TRAN_ABLE    (signed char)('\\')
#define TRAN_NOABLE  (signed char)('\\')|(0x80)

void tranable(char* s)
{
        if(!s)
                return;
        int i = 1;
        while(s != 0)
        {
                if(s == TRAN_ABLE && s[i - 1] == TRAN_ABLE)
                {
                        s[i - 1] = TRAN_NOABLE;
                        strcpy(s+i,s+i+1);
                }
                i++;
        }               
               
}

int  blockchar(char* s,char**& buf,int&  num)
{               
        if(!s)
        {
                buf = 0;
                num = 0;
                return 0;
        }
       
        int len = strlen(s);
        for(len--; s[len] == ' ' || s[len] == '\t';len--){};
        len++;
        tranable(s);

        int sta = 0;
        while(s[sta] == ' '|| s[sta] == '\t')
        {
                sta++;
        }
       
       
        num = 0;
        buf = (char**)malloc(0);
        bool spaceAbleFlag = ((s[sta]=='\'') ? false:true);

        int i = (spaceAbleFlag ? -1:0);
        do
        {
                i++;
                if((s == ' ' || s == '\0') && spaceAbleFlag )
                {
                        num++;
                        buf = (char**)realloc(buf,num);
                        buf[num-1] = (char*)malloc(i - sta + 1);
                        memcpy(buf[num-1],s+sta,i-sta);
                        buf[num-1][i-sta] = 0;
                        for(; s==' '||s=='\t';i++){};
                        sta = i;
                }
                if(s =='\'')
                {
                        if(s[i-1] != TRAN_ABLE)
                        {
                                strcpy(s+i,s+i+1);
                                i--;
                                spaceAbleFlag = !spaceAbleFlag;
                        }
                        else
                        {
                                strcpy(s+i-1,s+i);
                                i -= 2;
                               
                        }
                }
        }while(s != 0);
        return num;
       
}


#include "mystring.h"
int main()
{
        int i;
        char a[100] = "shi'  'nian sheng si liang mang";
        char** b;
        int s;
        puts(a);
        blockchar(a,b,s);
        for(i = 0; i < s;i++)
                puts(b);
}
发表于 2004-10-12 13:38:01 | 显示全部楼层
realloc()  changes the size of the memory block pointed to
       by ptr to size bytes.  The contents will be  unchanged  to
       the minimum of the old and new sizes; newly allocated memュ
       ory will be uninitialized.  If ptr is NULL,  the  call  is
       equivalent  to malloc(size); if size is equal to zero, the
       call is equivalent to free(ptr).  Unless ptr is  NULL,  it
       must  have  been  returned by an earlier call to malloc(),
       calloc() or realloc().

realloc改变已经分配过的块的大小,地址不变,原来块中的内容不变,新增加的内容值不定。
回复

使用道具 举报

 楼主| 发表于 2004-10-12 17:53:19 | 显示全部楼层
关键是0x8049ab8那个内存单元已经分配过了啊?
怎么贴图啊?
请用gdb调试一下就看到了
0x8049ab8确实已经分配过了的?
回复

使用道具 举报

发表于 2004-10-12 21:15:07 | 显示全部楼层
路过。有空再仔细看。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-7 09:30 , Processed in 0.045367 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表