c Указатель на указатель или передача списка в функции - PullRequest
0 голосов
/ 09 июня 2010

Я новичок в программировании. Может кто-нибудь, пожалуйста, скажите мне, что не так с следующая программа?


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 ]

3 голосов
/ 09 июня 2010

Ваша проблема в том, что вы устанавливаете указатели на 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", который возвращает указатель на адрес переменной.Таким образом, он передает указатель на count и p_list, которые ваша функция затем использует для установки этих переменных, что, по-видимому, является тем, что вы хотите сделать.

1 голос
/ 09 июня 2010

Вы должны иметь в основном:

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

Код, как написано, передается в 0 к process_list, и тогда у вас есть:

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

Это приводит к разыменованию 0, и ваш код падает.

0 голосов
/ 09 июня 2010

Значение p_list при вводе функции равно 0. Если вы разыменуете 0, вы получаете ошибку шины.

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

(90% проблем C вызваны разыменованием нулевого указателяточно так же, как 90% проблем Java вызваны неверно настроенным classpath .: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...