我对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';
}
}
}
我不确定我做错了什么,但是当我尝试重新分配时,我正在获得核心转储。
答案 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
}
}
}