动态字符串列表和free()崩溃的应用程序

时间:2015-06-26 01:43:11

标签: c free

我编写了一个简单的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;
}

我在俯瞰什么?

2 个答案:

答案 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;