在C语言中合并内存和处理指针算法

在C语言中合并内存和处理指针算法,c,pointers,memory,memory-management,C,Pointers,Memory,Memory Management,在下面的代码中,我不知道为什么我从不输入if。对我来说,这是有道理的,它进入了if: void Mem_Coalesce(){ list_t* temp; temp = freep; if(free_node_count == 2){ //will finish printf("Addr of temp is %llx\n\n", (long long unsigned) temp);

在下面的代码中,我不知道为什么我从不输入if。对我来说,这是有道理的,它进入了if:

void Mem_Coalesce(){


    list_t* temp;
    temp = freep;
        if(free_node_count == 2){
        //will finish
             printf("Addr of temp is  %llx\n\n", (long long unsigned) temp);
                 printf("Size of Temp is  %d\n\n", temp->size);
             printf("Addr of end of temp free node space is  %llx\n\n", (long long unsigned) ((char*)temp + temp->size));
             printf("Addr of start temp->next  is  %llx\n\n", (long long unsigned) temp->next);
        if( ((char*)temp + (temp->size)) == (char*)(temp->next)){
                printf("Entered the if statement\n");
                        temp->size += (temp->next)->size;
                temp->next = NULL;
        }


    }else {

        while(temp->next != NULL  ){

            if( ((char*)temp + (temp->size)) == (char*)(temp->next)){

                temp->size += (temp->next)->size;
                                printf("coalesced size is %d temp->size \n", temp->size);
                temp->next = (temp->next)->next;
                ((temp->next)->next)->prev = temp;
            }
            temp=temp->next;

        }

    }



}
结果是

Addr of temp is  7f9c1e89b070

Size of Temp is  200

Addr of end of temp free node space is  7f9c1e89b138

Addr of start temp->next  is  7f9c1e89b278

正如您所看到的,它从不进入if语句。另外,请告诉我是否有其他更有效的内存合并算法。

您正在以十进制打印
temp->size

printf("Size of Temp is  %d\n\n", temp->size);
                         ^^
以十六进制打印指针值时:

printf("Addr of temp is  %llx\n\n", (long long unsigned) temp);
                         ^^^^ 

200
十进制是十六进制的
C8
,并且
0xC8
+
0x70
=
0x138
。因此,当您将
0xC8
添加到
0x7f9c1e89b070
时,结果是
0x7f9c1e89b138
,它不等于
0x7f9c1e89b278
,因此您不需要输入if语句。

@paulgrifiths
freep
是指向我的空闲语句开头的指针list@MonaJalal你为什么认为你应该参加这个国际单项体育联合会?您是否在添加节点的过程中调试代码,并检查代码的最后一部分是否做了正确的事情?我应该如何更正这一行<代码>如果((char*)temp+(temp->size))==(char*)(temp->next))我知道类型不一致,但我认为条件是有意义的,对吗?@MonaJalal我已经看过代码好几次了,只是没有足够的信息来确定如何使代码按预期工作。如果代码的其余部分按预期工作,那么您可能需要提出一个新的问题并制定一个新的问题。