c指向指针或将列表传递给函数的指针

时间:2010-06-08 20:59:50

标签: c pointers

我是c编程的新手。谁能告诉我有什么问题 以下程序?


typedef struct Person_s
{
  int age;
  char name[40];
} Person_t;


int process_list(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;
}

3 个答案:

答案 0 :(得分:3)

您的问题是您将指针设置为指向NULL(0),然后取消引用它们。您不能取消引用NULL。想要的更像是这样:

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...

&是“address-of”运算符,它返回指向变量地址的指针。所以这会传递一个指向countp_list的指针,然后你的函数会用它来设置那些你想要做的变量。

答案 1 :(得分:1)

你应该在main:

Person_t *p_list=0;
...
process_list(count, &p_list);

写入的代码将0传递给process_list,然后你有:

*0 = (Person_t *)malloc(...);

这会导致0被取消引用,并且您的代码将崩溃。

答案 2 :(得分:0)

输入函数时p_list的值为0.如果取消引用0,则会出现总线错误。

if(!((*p_list) = (Person_t *) malloc(sizeof(Person_t))))

(90%的C问题是由解除引用空指针引起的,就像90%的Java问题是由错误配置的类路径引起的。: - )