我编写了一个简单的C代码,它应该在结构中存储字符串地址列表(char *)。该列表是动态的,因此每次添加新字符串时,我都会保留足够的内存来存储所有当前字符串地址和新字符串地址。然后我释放旧的缓冲区并将新的缓冲区分配给结构。问题是它在free()上崩溃了。
我确信我有空()我从calloc()获得的确切地址,但仍然崩溃。
这是输出:
main(3618,0x7fff7a83f300)malloc:***对象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;
}
我在俯瞰什么?
答案 0 :(得分:0)
您的缓冲区太小 - 您忘记为额外元素添加空间。第一个功能行应为:
int currentBufferSize = (node->stringcount + 1) * sizeof(char*);
答案 1 :(得分:0)
calloc
的签名如下:
void* calloc (size_t num, size_t size);
因此,假设stringcount
是实际金额,您应该使用不同的参数调用它,例如
calloc(sizeof(char*), node->stringcount +1)
在任何情况下,stdlib中都有另一个有用的函数realloc
,这允许你直接调整分配的内存大小,而不需要自己复制所有数据或释放以前的内存:
node->stringList = realloc(node->stringList, (node->stringcount+1)*sizeof(char*));
node->stringList[node->stringcount] = (char*)string;