-
Error with strcmp
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;
}
-
You probably just need to rest your eyes and come back after a break. It is a matter of the closing parenthesis being in the wrong place. It should have been:
Code:
if (strcmp(summary_list->summary_record->c_detail1, summary_record->c_detail1) == 0)