有人能帮我弄清楚为什么我得到错误malloc():损坏的最大大小

t98cgbkg  于 2022-12-03  发布在  其他
关注(0)|答案(1)|浏览(140)

概述

我目前正在尝试创建一个动态扩展数组,我可以在c++和c中使用该数组,该数组包含在我称为Train的结构中,该结构必须使用称为initialize_train的函数进行初始化,并使用insert_cart向数组中添加更多内容。当这个函数被执行时,它使用函数realloc将数组扩展1,然后通过指针插入一个分配的数组。当我第二次使用insert_cart时,函数malloc出现了m incurring,错误是malloc():损坏的最大大小。我已经尝试找出为什么这发生了2天还没有为什么它发生只有它似乎发生第三次我使用malloc当代码从行0和行51保持不变。

代码

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

const unsigned short CHAR_POINTER_SIZE = sizeof(char*);

typedef struct
{
    char **carts;
    unsigned short count;
} Train;

void initialize_train(Train *train)
{
    train->carts = (char **)malloc(CHAR_POINTER_SIZE);
    train->count = 0;
}

void insert_cart(Train *train, char *text)
{
    char* allocatedText;
    {
        unsigned int length = strlen(text) + 1 ;
        printf("%d: %s\n", length, text);
        allocatedText  = (char*)malloc(length);
        printf("bytes allocated\n");
    }

    train->count += CHAR_POINTER_SIZE;
    train->carts = (char **)realloc(train->carts, train->count);
    
    
    unsigned int index = 0;
    while (*text != '\n')
    {
        allocatedText[index] = *text;
        text++;
        index++;
    }

    train->carts[train->count++] = allocatedText;
}

int main(void)
{
    Train train;
    initialize_train(&train);
    
    
    insert_cart(&train, "cart_0");
    insert_cart(&train, "cart_1");
    insert_cart(&train, "cart_2");
    insert_cart(&train, "cart_3");
    insert_cart(&train, "cart_4");
    insert_cart(&train, "cart_5");
    free(&train);
}

输出

7: cart_0
bytes allocated
7: cart_1
malloc(): corrupted top size

我希望输出是

7: cart_0
bytes allocated
7: cart_1
bytes allocated
7: cart_2
bytes allocated
7: cart_3
bytes allocated
7: cart_4
bytes allocated
7: cart_5
bytes allocated
nhn9ugyo

nhn9ugyo1#

您有多个问题。
让我们从循环复制字符串的while (*text != '\n')开始(而不是使用标准的strcpy)。这个循环将查找换行符以知道何时结束。
但是你传递给函数的字符串没有任何换行符,所以你的循环会超出界限,你会有 undefined behavior
可以使用普通的strcpy复制字符串:

strcpy(allocatedText, text);

或循环,直到到达字符串结束符:

while (*text != '\0')

另一个非常严重的问题是如何使用结构中的count成员。您要同时使用它作为元素的数量 * 和 * 内存重新分配的字节大小。它不能两者都是,只能是其中之一。
在找到更多错误后,下面列出了我目前能找到的所有错误:

  • 复制输入字符串的循环没有在空终止符处停止,超出了输入字符串的范围。
  • 由于前面的问题,您将写入allocatedText的边界之外
  • 永远不要以空值结束allocatedText
  • 使用train->count作为realloc调用的新字节大小,然后使用它作为train->carts数组的索引。
  • 调用free(&train),尝试释放未由malloc分配的内存

所有这些问题都将以某种方式导致 * 未定义的行为 *,并可能解释您的所有消息和未来的崩溃。

相关问题