重新分配内存以增加C中的数组大小

时间:2016-02-10 21:12:00

标签: c arrays memory

我对C很新,所以我在使用realloc()时遇到了麻烦。

我有一个测试用例,我需要延长kstring

我已经使用malloc()为数组分配内存。

现在,如果nbytes大于kstring,我需要延长内存。

以下是代码:

    void kstrextend(kstring *strp, size_t nbytes)
    {
        kstring *strp1;
        int len=strp->length;
        if(len < nbytes)
        {
            //allocate a new array with larger size
            strp1 = realloc(strp, nbytes);
            //copy older array to new array
            for(int i = 0; i<len; i++)
            {
                strp1->data[i]=strp->data[i];
            }
            //remaining space of new array is filled with '\0'
            for (int i = len; i < nbytes; i++)
            {
                strp1->data[i] = '\0';
            }
        }
    }

我不确定我做错了什么,但是当我尝试重新分配时,我正在获得核心转储。

1 个答案:

答案 0 :(得分:1)

我对您的代码进行了一些更正,未经测试(没有MVCE!),但我希望它有效。请注意,无需复制数据,因为realloc可确保保留以前的内存内容。在realloc之后,旧指针无论如何都会变得无效。

void kstrextend(kstring *strp, size_t nbytes)
{
    char *data1;                        // altered type and name
    int len=strp->length;
    if (len < nbytes)
    {
        //allocate a new array with larger size
        data1 = realloc(strp->data, nbytes);
        if (data1 == NULL)
        {
            // take evasive measures
        }
        strp->data = data1;             // replace old pointer
        strp->length = nbytes;          // update length

        //remaining space of new array is filled with '\0'
        for (int i = len; i < nbytes; i++)
        {
            strp->data[i] = '\0';       // use original pointer now
        }
    }
}