c Pointer to pointer, or passing list to functions
I am new to c programming. Could anyone please tell me what's wrong with the following program?
typedef struct Person_s
{
int age;
char name[40];
} Person_t;
int process_li开发者_开发知识库st(int *countReturned, Person_t **p_list)
{
Person_t *rowPtr=0;
//the actual program will fethc data from DB
int count =1;
if(!((*p_list) = (Person_t *) malloc(sizeof(Person_t))))
{
return -1;
}
rowPtr = *p_list;
rowPtr[count-1].age =19;
strcpy(rowPtr[count-1].name,"Prince Dastan");
*countReturned = count;
return 0;
}
int main(int argc, char *argv[])
{
Person_t *tmpPerson=0;
Person_t **p_list=0;
int *count=0;
int i;
process_list(count,p_list);
tmpPerson = *p_list;
for(i=0; i< *count; i++)
{
printf("Name: %s , age: %d\n",tmpPerson->name,tmpPerson->age);
tmpPerson++;
}
//free(tmpPerson);
return 0;
}
Your problem is that you're setting the pointers to point to NULL (0), then dereferencing them. You are not allowed to dereference NULL. Want you want is more like this:
int main(int argc, char *argv[])
{
Person_t tmpPerson;
Person_t *p_list=0;
int count;
int i;
process_list(&count, &p_list);
tmpPerson = *p_list;
// and so on...
The &
is the "address-of" operator, which returns a pointer to the variable's address. So this passes a pointer to count
and p_list
, which your function then uses to set those variables, which appears to be what you want to do.
You should have in main:
Person_t *p_list=0;
...
process_list(count, &p_list);
The code as written passes in 0 to process_list, and then you have:
*0 = (Person_t *)malloc(...);
This causes 0 to be dereferenced, and your code will crash.
The value of p_list
as you enter the function is 0. If you dereference 0 you get a Bus Error.
if(!((*p_list) = (Person_t *) malloc(sizeof(Person_t))))
(90% of C problems are caused by dereferencing a null pointer, just like 90% of Java problems are caused by a misconfigured classpath. :-)
精彩评论