realloc()无效指针glibc错误

时间:2015-07-15 19:57:39

标签: pointers glibc realloc

我是指针和realloc的新手。我知道出了什么问题,但我不知道如何解决它。

我使用指针数组创建一个结构:

struct DB_SLOT
{
    MYSQL *MYSQL_Connection[10];
    char  *DB_NAME_Connection[10];
};
struct DB_SLOT DB_Conn_SLOT;

我在循环中用realloc分配内存(这是错误的地方)我在屏幕上打印指针2的地址。

如果我然后尝试realloc相同数量的内存(仅用于测试目的)。它给出了一个glibc无效指针。在realloc之前,我再次打印指针2的地址,它不一样。

此代码:

int MallocLoop;

for (MallocLoop = 0;MallocLoop < 10;MallocLoop++)
{
    DB_Conn_SLOT.MYSQL_Connection[MallocLoop] = realloc(DB_Conn_SLOT.MYSQL_Connection[MallocLoop],(sizeof(MYSQL)));
    DB_Conn_SLOT.DB_NAME_Connection[MallocLoop]=realloc(DB_Conn_SLOT.DB_NAME_Connection[MallocLoop],(sizeof(char)));
    if (MallocLoop == 2)
    {   
        printf("pointer  1 %d \n",DB_Conn_SLOT.DB_NAME_Connection[MallocLoop]);
    }
    DB_Conn_SLOT.DB_NAME_Connection[MallocLoop] ="\0";
}
MallocLoop = 2;
printf("pointer  2 %d \n",DB_Conn_SLOT.DB_NAME_Connection[MallocLoop]);
DB_Conn_SLOT.DB_NAME_Connection[MallocLoop] = realloc(DB_Conn_SLOT.DB_NAME_Connection[MallocLoop], (sizeof(char)));

打印指针地址的结果导致2个不同的地址。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

您有以下两行:

DB_Conn_SLOT.DB_NAME_Connection[MallocLoop]=realloc(...); ...
DB_Conn_SLOT.DB_NAME_Connection[MallocLoop] ="\0";

让我们将其简化为:

p = realloc(...);
p = "\0";

第一行使p指向动态分配的内存块。第二行泄漏该内存(您不再有指向它的指针),并使p指向.data部分内的一块内存。

当你再次循环并将.data指针传递给realloc时,它会正确地抱怨:将非动态分配的内存传递给realloc是无效的。

你可能想要做的是:

p = realloc(...);
p[0] = '\0';

这使得p指向动态分配的内存块,并使该块成为空字符串。