Hello,

The compiler is reporting the following error
Code:
warning: passing argument 2 of ‘strcmp’ makes pointer from integer without a cast [enabled by default]
with this strcmp statement (line 106).
Code:
if (strcmp(summary_list->summary_record->c_detail1, summary_record->c_detail1 == 0))
When the strcmp is executed a segmentation fault occurs, so I need to resolve the warning but I can't see what the issue is.

The strcmp statement is in function: rem

Here is the full code to demonstrate the issue
Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct summary_record
{
    char        c_detail1[15];
    char        c_detail2[100];
    float       f_value1;
    float       f_value2;
};
typedef struct summary_record summary_record_t;

struct summary
{
    struct summary_record  *summary_record;
    struct summary         *prev;
    struct summary         *next;
};
typedef struct summary summary_t;

summary_t *add_at(int pos, summary_t *summary_list, summary_record_t *summary_record)
{
    summary_t *node = malloc(sizeof(summary_t) * 1);
    if (node == NULL)
    {
        printf("Malloc failed in: add_at\n");
        getchar();
    }
    node->summary_record = malloc(sizeof(summary_record_t) * 1);
    if (node->summary_record == NULL)
    {
        printf("Malloc failed in: add_at: node->summary_record\n");
        getchar();
    }

    strcpy(node->summary_record->c_detail1, summary_record->c_detail1);
    strcpy(node->summary_record->c_detail2, summary_record->c_detail2);
    node->summary_record->f_value1 = summary_record->f_value1;
    node->summary_record->f_value2 = summary_record->f_value2;
    node->prev = NULL;
    node->next = NULL;

    // handle case where list is empty
    if (summary_list == NULL)
    {
        summary_list = node;
        return summary_list;
    }

    int idx = 0;

    summary_t *prev = NULL;
    summary_t *cur = summary_list;

    // walk through list until pos or end is reached
    while (cur != NULL && idx != pos)
    {
        ++idx;
        prev = cur;
        cur = cur->next;
    }

    // insertion point reached

    // beginning, includes list update
    if (idx == 0)
    {
        summary_list = node;
        node->next = cur;
        cur->prev = node;
        return summary_list;
    }

    // end
    if (cur == NULL)
    {
        prev->next = node;
        node->prev = prev;
        return summary_list;
    }

    // middle
    prev->next = node;
    node->prev = prev;
    node->next = cur;
    cur->prev = node;
    return summary_list;
}

summary_t *add_end(summary_t *summary_list, summary_record_t *summary_record)
{
    summary_list = add_at(-1, summary_list, summary_record);
    return summary_list;
}

summary_t *rem(summary_t *summary_list, summary_record_t *summary_record)
{
    // walk through list
    while (summary_list != NULL)
    {
        // Found record - detail1 matches
        if (strcmp(summary_list->summary_record->c_detail1, summary_record->c_detail1 == 0))
        {
            // handle first item
            if (summary_list->prev == NULL)
            {
                if (summary_list->next == NULL)
                {
                    // only item?
                    summary_list = NULL;
                }
                else
                {
                    // more items?
                    summary_list = summary_list->next;
                    summary_list->prev = NULL;
                }
                free(summary_list->summary_record);
                free(summary_list);
                return summary_list;
            }

            // handle last item
            if (summary_list->next == NULL)
            {
                summary_list->prev->next = NULL;
                free(summary_list->summary_record);
                free(summary_list);
                return summary_list;
            }

            // handle middle item
            if (summary_list->prev != NULL && summary_list->next != NULL)
            {
                summary_list->prev->next = summary_list->next;
                summary_list->next->prev = summary_list->prev;
                free(summary_list->summary_record);
                free(summary_list);
                return summary_list;
            }
        } // found record

        // Next record
        summary_list = summary_list->next;

    } // while (summary_list != NULL)
} // rem

void dump_fwd(summary_t *summary_list)
{
    printf("Forward:\n");

    while (summary_list != NULL)
    {
        printf("Detail 1: %s\n", summary_list->summary_record->c_detail1);
        printf("Detail 2: %s\n", summary_list->summary_record->c_detail2);
        printf("Value 1:  %f\n", summary_list->summary_record->f_value1);
        printf("Value 2:  %f\n", summary_list->summary_record->f_value2);
        printf("\n");
        summary_list = summary_list->next;
    }
    getchar();
}

int main()
{
    summary_t *summary_list = malloc(sizeof(summary_t) * 1);
    summary_list = NULL;

    summary_record_t *summary_record = malloc(sizeof(summary_record_t) * 1);

    strcpy(summary_record->c_detail1,"some detail");
    strcpy(summary_record->c_detail2,"more detail");
    summary_record->f_value1 = 100;
    summary_record->f_value2 = 200;
    summary_list = add_end(summary_list,summary_record);

    strcpy(summary_record->c_detail1,"next");
    strcpy(summary_record->c_detail2,"blah");
    summary_record->f_value1 = 50;
    summary_record->f_value2 = 100;
    summary_list = add_end(summary_list,summary_record);
    dump_fwd(summary_list);

    strcpy(summary_record->c_detail1,"next");
    strcpy(summary_record->c_detail2,"blah");
    summary_record->f_value1 = 50;
    summary_record->f_value2 = 100;
    summary_list = rem(summary_list,summary_record);
    dump_fwd(summary_list);

    return 0;
}