C-在指针阵列中有错误的(不需要的)值



我有一个名为 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标志= a mac = 3f:fd:df:fd akh

第二成员:name = sim AKH ip = 9.9.9.1 flags = ab mac = 3f:gv:gv:hj:fd

我试图在memcpy行之后使用gdb调试此代码,我打印了mac的Elemnt,它包含正确的值,我不知道为什么使用cout打印它时它包含错误的值(我调用此函数get_ip_details后调用cout(。我还使用gdb打印了Memcpy线后ipN_details数组的内容。它们也是对的,因此我认为此问题与功能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);
      }
}

我称此功能这样:

ip_details* ips_details=0;
int ips_details_len;
get_ip_details(&ips_details, &ips_details_len);
for(int i=0; i < ips_details_len; i++){
    cout << string(ips_details[i].name) << "-"<< 
    string(ips_details[i].ip_address) << "-"  << 
    string(ips_details[i].mac_address) << "-" << 
    ips_details[i].Flags << endl;
}

我无法将此代码进行编译,因为您缺少int_detailsget_int_detailsextract_ip。您能否包含这些定义(或用硬编码值而不是函数调用替换它们(,以便我可以将其编译和重新创建/解决问题?

我的怀疑是您没有为您的ip_details指针分配足够的空间,因此您最终会在分配的空间之外写作,然后您提到的第二个成员正在覆盖您在第一个成员中写的内容,因为第一个成员居住在未正确保留。

快速观察,您有一个为mac保留的17个字符数组,然后尝试将其打印为仅14个字符的字符串。我假设您不会在使用cout ... string(...)阅读之前像应该终止字符串那样终止字符串。string功能将读取,直到找到空末端或读取17个字符,以先到者为准。这就是为什么它读取的原因远远超出应有的原因,因此打印该字符串的末尾您会在该字符串的末尾获得三个未定义的字符。这三个是 akh 的原因将需要更多的逻辑/信息,但事实是,它是什么都没关系,它是未定义的,无效的终结者应在此之前结束字符串。

最新更新