Realloc 给出错误:_CrtIsValidHeapPointer(block)

问题描述 投票:0回答:1

我有一份学校作业,其中需要我们修改一些代码。我遇到问题的部分是截断动态分配的字符串。我们正在编写一个函数,其中接收指向字符串的指针和字符串的新长度(作为 int)。

void dstring_truncate(DString* destination, unsigned int truncatedLength)
{

    assert(destination != NULL);
    assert(*destination != NULL);
    assert(truncatedLength > 0);

    DString temp = (DString)malloc(strlen(*destination) * sizeof(char));
    strcpy(temp, *destination);
    printf("\n%s test dstring truncate\n", temp);
    temp[truncatedLength] = '\0';
    temp = (DString)realloc(temp, truncatedLength + 1);

    *destination[truncatedLength] = '\0';
    *destination = (DString)realloc(*destination, truncatedLength + 1);
    printf("%s test dstring truncate after realloc\n", *destination);
    
}

函数的调用如下所示

dstring_truncate(&str1, 10);
DString 是我们正在使用的 ADT
typedef char* DString; 

程序中的第一个函数还初始化字符串

DString dstring_initialize(const char* str);

我认为我不理解指针,因为上面代码中的“Temp”按预期工作,但“*destination”却不然。

我尝试过使用“目的地”、“*目的地”、“**目的地”,并且我已经重新观看了给出的材料和一些在线 YouTube/文档,但我就是无法理解这一点。

这也是我编写初始化代码的方式,也许这里有问题?

DString dstring_initialize(const char* str)
{
    assert(str != NULL);
    DString arr = (DString)malloc((strlen(str) + 1) * sizeof(char));
    if (arr == NULL) {
        printf("Memory allocation Failed");
        return NULL;
    }
    strcpy(arr, str);
    if (strcmp(str, arr) == 0) 
    {
        return arr; // Ersatt denna rad. Den ar just nu med for att programmet ska kompilera
    }
}
c string dynamic-memory-allocation realloc
1个回答
0
投票

当您超出之前分配的内存范围时,该错误是典型的。

就像你做的那样

strcpy(temp, *destination);

没有为空终止符分配空间。

请记住,

strlen
计算空终止符。

快速修复:

DString temp = malloc(strlen(*destination) + 1);
© www.soinside.com 2019 - 2024. All rights reserved.