我有一个名为ipN_details
的指针数组,其类型为ip_details
:
typedef struct
{
char name[64];
char ip[16];
char Flags;
char mac[17] ;
} ip_details;
在我打印get_ip_details
的元素时调用函数ipN_details
后,只要此数组包含多个成员,它就包含mac
元素的错误值。 (所有其他元素都具有预期的正确值。)例如,当此数组在第一个成员中有两个成员值mac
时,会与第二个成员的name
的某些最后一个字符连接在一起。
第一个成员:name = mina ip = 9.9.9.9 Flags = a mac = 3f:fd:df:fd akh
第二名成员:name = sim akh ip = 9.9.9.1 Flags = ab mac = 3f:gv:hj:fd
我尝试在gdb
行之后使用memcpy
调试此代码,
我打印了mac
的元素,它包含正确的值,当我使用cout
打印它时,我不知道为什么它包含错误的值(我在调用此函数后调用cout
{{1} })。我还使用get_ip_details
在memcpy行之后打印了ipN_details
数组的内容。它们也是对的,因此我认为这个问题与函数gdb
无关。
extract_ip
我这样称呼这个函数:
int get_ip_details(ip_details **ipN_details, int *ip_details_len)
{
int_details *int_details_list=0;
int int_details_list_len = 0;
int ret =
get_int_details(&int_details_list,&int_details_list_len,"eth");
if(ret == 0)
{
int k = 0;
for(int i=0; i < int_details_list_len; i++)
{
ip_details * ipN_details=0;
int ipN_details_len=0;
int int_index = int_details_list[i].index;
extract_ip(int_index,
&ipN_details,&ipN_details_len); // here I read ipN_details_len number of members into ipN_details array using this function
/*
* I wanna add members one by one to array ip_details(using for loop with j),
* thus I increase allocated
* memory of this array using realloc function and then memcpy the members from
* ipN_details function to ip_details, one by one
*/
if (ipN_details_len != 0)
{
*ip_details_len += ipN_details_len;
*ip_details = (ip_details *)realloc(*ip_details,
(*ip_details_len) * sizeof(ip_details));
for(int j=0; j < ipN_details_len; j++)
{
memcpy(&((*ip_details)[k]), &
(ipN_details[j]),sizeof(ip_details));
k++;
}
}
free(ipN_details);
}
free(int_details_list);
}
}
答案 0 :(得分:0)
我无法编译此代码,因为您遗漏了int_details
,get_int_details
和extract_ip
。你能否包括那些定义(或用硬编码值而不是函数调用替换它们),以便我可以编译并重新创建/修复问题?
我怀疑你没有为你ip_details
指针分配足够的空间,所以你最后写的超出你分配的空间,然后你提到的第二个成员会覆盖你在第一个成员写的内容,因为第一个成员所在的内存未正确保留。
快速观察一下,你有一个为mac
保留的17字符数组,然后你尝试将它打印成一个只有14个字符长的字符串。我假设您在cout ... string(...)
阅读之前没有null terminate the string like you are supposed to。 string
函数将一直读取,直到找到空终止符,或读取17个字符,以先到者为准。这就是为什么它读得比它应该的更远,所以当你打印它时,你会在该字符串的末尾得到三个未定义的字符。这三个 akh 之所以需要更多的逻辑/信息,但问题是它们是什么并不重要,它是未定义的区域,并且空终止符应该在此之前结束字符串