“在 tcache 2 中检测到双重释放”重新分配指向动态字符串数组的指针时出错

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

我编写了这段代码来存储可以执行不同操作的动态字符串数组。当我最初输入字符串和添加 2 个字符串时,它可以正常工作,但在第三个字符串上,它每次都会失败,并出现错误“free():在 tcache 2 中检测到双重释放”。我没有在程序中的任何地方释放内存,所以我不明白为什么会发生这个错误。另外,从我搜索此错误后看到的情况来看,当程序尝试释放之前已释放的内存位置时,就会发生这种情况。

该错误是由于 addend() 函数中的 realloc 语句而发生的。但我无法理解到底出了什么问题。

有人可以提示我在这里可能做错了什么吗?谢谢!

#include <stdio.h>
#include <stdlib.h>

void addend(char** arr,int size) {
    arr = (char **) realloc(arr, (size+1)*sizeof(char *));
    *(arr+size) = (char *) calloc(100, sizeof(char));

    printf("Enter new string to be added : ");
    scanf("%s",*(arr+size));
}

void addbegin(char** arr,int size) {
    arr = (char **) realloc(arr, (size+1)*sizeof(char *));
    for (int i = size; i>0; i--) {
        *(arr+i) = *(arr+i-1);
    }
    printf("Enter new string to be added : ");
    scanf("%s",*(arr));
}

void printarr(char** arr, int size) {
    printf("[");
    for (int i = 0; i<size; i++) {
        printf("%s, ",*(arr+i));
    }
    printf("]\n");
}

void delete() {}

int main() {
    int n;
    printf("Enter the size of the array : ");
    scanf("%d",&n);

    char** arr = (char **) calloc(n,sizeof(char*));

    for(int i=0; i<n; i++) {
        *(arr+i) = (char *) calloc(100, sizeof(char));
    }

    for (int i = 0; i<n; i++) {
        printf("Enter the (%d) string to be entered : ",i);
        scanf("%s",*(arr+i));
    }

    int option;
    for (;;) { 
        printf("Choose out of the following options: Add End (1), Add Beginning (2), Delete (3), Length (4), Print Array (5) : ");
        scanf("%d",&option);

        switch(option) {
            case 1:
                addend(arr,n);
                n++;
                break;
            case 2:
                addbegin(arr,n);
                n++;
                break;
            case 3:
                delete();
                break;
            case 4:
                printf("%d",n);
                break;
            case 5:
                printarr(arr,n);
                break;
            default:
                printf("Invalid option, enter again\n");
        }
    }
}
c dynamic-memory-allocation realloc calloc
1个回答
1
投票
void addend(char** array,int size) {
   array = (char **) realloc(array, (size+1)*sizeof(char *));
   /* ... */

它不会更改

arr
函数中的
main
,因为
array
(我故意更改名称以明确区分这两个变量)是
addend
函数作用域中的局部变量。

您需要将引用传递给

arr
才能修改它。

void addend(char*** array,int size) {
   *array = realloc(*array, (size+1)*sizeof(**array));
   /* ... */

并且在

main
函数中
addend(&arr,n);

您需要修改犯了同样错误的所有其他函数(以及对它们的调用)。

旁注:

  1. 您错误地使用了
    realloc
    。您需要将结果保存到临时变量,因为
    realloc
    可能会失败并且会出现内存泄漏(因为您将无法引用先前分配的内存)
  2. 请勿投射
    malloc
    和朋友的结果。如果它不能编译,则意味着您正在使用 C++ 编译器编译 C 代码,并且它不正确。
© www.soinside.com 2019 - 2024. All rights reserved.