指针数组中有错误(不需要的)值elemnt

时间:2017-04-14 18:02:56

标签: c arrays pointers

我有一个名为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);
      }
}

1 个答案:

答案 0 :(得分:0)

我无法编译此代码,因为您遗漏了int_detailsget_int_detailsextract_ip。你能否包括那些定义(或用硬编码值而不是函数调用替换它们),以便我可以编译并重新创建/修复问题?

我怀疑你没有为你ip_details指针分配足够的空间,所以你最后写的超出你分配的空间,然后你提到的第二个成员会覆盖你在第一个成员写的内容,因为第一个成员所在的内存未正确保留。

快速观察一下,你有一个为mac保留的17字符数组,然后你尝试将它打印成一个只有14个字符长的字符串。我假设您在cout ... string(...)阅读之前没有null terminate the string like you are supposed tostring函数将一直读取,直到找到空终止符,或读取17个字符,以先到者为准。这就是为什么它读得比它应该的更远,所以当你打印它时,你会在该字符串的末尾得到三个未定义的字符。这三个 akh 之所以需要更多的逻辑/信息,但问题是它们是什么并不重要,它是未定义的区域,并且空终止符应该在此之前结束字符串