Я написал простой код C, который должен хранить список строковых адресов (char *) внутри структуры. Список динамический, поэтому каждый раз, когда добавляется новая строка, я оставляю достаточно памяти для хранения всех текущих строковых адресов и нового. Затем я освобождаю старый буфер и назначаю новую структуру. Проблема в том, что он падает на free().Динамический список строк и бесплатное() сбойное приложение
Я уверен, что я свободен() с точным адресом, который я получил от calloc(), но все же он сработает.
здесь выход:
основной (3618,0x7fff7a83f300) таНос: *** ошибки для объекта 0x7f9902404bd0: неправильная контрольная сумма освобожденного объекта - объект, вероятно, был изменен после освобождения.
Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct StructNODE{
char** stringlist;
int stringcount;
struct StructNODE* next;
} NODE;
void Addstring(NODE* node, const char* string)
{
int currentBufferSize = node->stringcount * sizeof(char*);
// make room for the current string list plus the new one
char** addrList = (char**) calloc(1, currentBufferSize);
printf("malloc: %d bytes starting at 0x%X\n",currentBufferSize, addrList);
// copy all current addresses to the new list
memcpy(addrList, node->stringlist, currentBufferSize);
printf("freeing mem at 0x%X\n",node->stringlist);
free(node->stringlist);
// Append the new address to the end of the address buffer
addrList[node->stringcount] = (char*)string;
//make the node point to the new buffer
node->stringlist = addrList;
// Increment the string number counter
node->stringcount++;
}
void PrintStringlist(NODE* node)
{
int i;
for (i=0; i < node->stringcount; i++)
{
printf("string %d: %s\n",i, node->stringlist[i]);
}
}
int main(int argc, char** argv)
{
NODE* node = (NODE*) calloc(1 , sizeof(NODE));
Addstring(node, "Lewis Skolnick");
Addstring(node, "Gilbert Lowe");
Addstring(node, "Arnold Poindexter");
Addstring(node, "Harold Wormser");
Addstring(node, "Booger");
Addstring(node, "Takashi Toshiro");
Addstring(node, "Lamar Latrelle");
Addstring(node, "Judy");
PrintStringlist(node);
return 0;
}
Что я с видом?
Спасибо. Это была проблема! Я добавил дополнительный размер для вызова calloc(): char ** addrList = (char **) calloc (1, currentBufferSize + sizeof (char *)); – marciovmf