我是指针和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个不同的地址。我该如何解决这个问题?
答案 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
指向动态分配的内存块,并使该块成为空字符串。