核心转储到超过 26 个字符的 realloc 文本 c

Core dumped upon realloc text above 26 chars c

我需要用我自己的协议与服务器和一些发送数据的望远镜进行通信。通信完成后,我将消息拆分以了解它是什么情况。连接和断开连接工作正常,但拆分数据让我核心转储(realloc(): invalid next size).

连接发送此消息:0x01[]10[Telescope1]
断开连接发送此消息:0x02[]10[Telescope1]
发送数据发送此消息:0x03[METADATA]22[.txt&15&someRandomDate]

我打算将这些消息拆分为 type (0x03)、header (METADATA)、lenght of data field (22) 和 data (.txt&15&someRandomDate).

经过一些测试,我得出的结论是字符串的大小。为了进行调试,在发送数据时我使用了连接消息,并且拆分可以正常工作(每个文件都正确返回)。

然后我会逐渐将它一个字符一个字符地更改为它应该拆分的内容,并将这条消息很好地拆分 0x03[METADA]10[Telescope1](大小 26),而不是 0x03[METADAT]10[Telescope1](大小 27)。在第二种情况下,它会输出以下内容:

string to split: 0x03[METADAT]10[Telescope1]
copying type 0
realloc of size 1
copying type x
realloc of size 2
realloc(): invalid next size
Aborted (core dumped)

所以它会读到 0x,然后它们进入核心转储。 如果我通过在消息中添加随机文本使连接或断开连接字符串大于 27 个字符,也会发生核心转储。

这是我拆分字符串的代码。这很糟糕,因为我总是与 mallocs 和 reallocs 作斗争,提前抱歉。

Data read_data (char* string){
printf("string to split: %s\n", string);
Data d;
int i = 0;
char *aux = (char *) malloc(1);

while (string[i] != '[' || string[i] == '[=11=]'){

    printf("copying type %c\n", string[i]);
    printf("realloc of size %d\n", (i + 1));
    aux = (char *) realloc(aux, (i + 1));
    //here also tried aux = (char *) realloc(aux, (i + 1) * sizeof(char*)); didn't work
    strcpy(&aux[i], &string[i]);
    i++;
}
aux[i] = '[=11=]';
d.type = aux[3];

i++;

int j = 0;
aux = (char *) malloc(1);
while (string[i] != ']' || string[i] == '[=11=]'){
    printf("copying header %c\n", string[i]);
    aux = (char *) realloc(aux, j + 1);
    strcpy(&aux[j], &string[i]);
    i++;
    j++;
}
aux[j] = '[=11=]';
d.header = aux;

i++;

j = 0;
aux = (char *) malloc(1);
while (string[i] != '[' || string[i] == '[=11=]'){
    printf("copying size %c\n", string[i]);
    aux = (char *) realloc(aux, j + 1);
    strcpy(&aux[j], &string[i]);
    i++;
    j++;
}
aux[j] = '[=11=]';
d.length = atoi(aux);

i++;
j = 0;
aux = (char *) malloc(1);
while (string[i] != ']' || string[i] == '[=11=]'){
    printf("copying data %c\n", string[i]);
    aux = (char *) realloc(aux, j + 1);
    strcpy(&aux[j], &string[i]);
    i++;
    j++;
}
aux[j] = '[=11=]';
d.data = aux;
return d;
}

我该如何解决这个问题?如果它是一个较短的字符串,为什么它可以正常工作?

编辑:正如 Spikatrix 指出的那样,如果我使用 aux[i] = string[i]; 而不是 strcpy(&aux[i], &string[i]); 就可以正常工作

错误消息 realloc(): invalid next size 基本上表示堆已损坏(在 realloc() 调用之前)。所以问题不是realloc而是其他代码。

乍一看,以下语句是罪魁祸首:

strcpy(&aux[i], &string[i]);

您可能想将单个字符复制到 aux 的末尾。但它做了完全不同的事情。它复制 string——从位置 i 开始,直到 string 的结尾——到 aux 从位置 i 开始。但是,aux 只有 i + 1 个字符长。所以这个操作在分配的字符串之外写入并破坏了堆。

最好放弃整个代码。它不必要地复杂且效率低下。使用 strchr 定位相关字符(左括号和右括号)。然后你就知道位置了,就可以轻松复制相关的子串了。