繁体   English   中英

有人可以帮我弄清楚为什么我收到错误 malloc(): corrupted top size

[英]Could someone help me figure out why I am getting the error malloc(): corrupted top size

概述

我目前正在尝试创建一个动态扩展数组,我可以在 c++ 和 c 中使用该数组,该数组包含在我称为Train的结构中,该结构必须使用名为initialize_train的 function 进行初始化,并且添加了更多内容使用insert_cart到数组,当执行此 function 时,它使用 function realloc将数组扩展一个,然后通过指针插入分配的数组。 当我第二次使用 function malloc时,我遇到的问题是insert_cart ,错误是malloc(): corrupted top size 我已经尝试弄清楚为什么会发生这种情况 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);
}

Output

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

我期待 output 是

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

你有多个问题。

让我们从循环开始while (*text != '\n')用于复制字符串(而不是使用标准strcpy )。 此循环将查找换行符以了解何时结束。

但是你传递给 function 的字符串没有任何换行符,所以你的循环将 go 超出范围并且你将有未定义的行为

要么使用普通的strcpy复制字符串:

strcpy(allocatedText, text);

或者循环直到到达字符串终止符:

while (*text != '\0')

另一个非常严重的问题是如何使用结构的count成员。 您将它用作元素数量memory 重新分配的字节大小。 不可能两者兼而有之,只能是其中之一。


在发现更多错误后,这里列出了我目前能找到的所有错误:

  • 复制输入字符串的循环不会在空终止符处停止,超出输入字符串的范围。
  • 由于前面的问题,您将超出allocatedText的范围
  • 你永远不会空终止allocatedText
  • 您使用train->count作为realloc调用的新字节大小,稍后您将其用作train->carts数组的索引。 不能两者兼而有之,只有一个或另一个
  • 你打电话给free(&train)试图释放 memory 不是由malloc分配的

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM