передавая массив указателей struct как ссылку в C - PullRequest
0 голосов
/ 06 ноября 2010

Я хотел бы сделать что-то вроде:

struct mystruct {
   char *info;
};

// here is where I'm not sure how to
void do_something(struct mystruct **struc){
    int i;
    for (i = 0; i < 10; i++){
       *struc[i] = (struct mystruct *) malloc (sizeof (struct mystruct));
       *struc[i]->info = "foo";
    } 
}
int main(int argc, char *argv[]){
    struct mystruct **struc;

    struc = (struct mystruct **struc) malloc (sizeof(struct mystruct *struc) * 10);

    dosomething(&struc);
    // do something with struc and its new inserted values
    return 0;
}

Я не уверен, как передать его в качестве ссылки, чтобы я мог использовать его после dosomething()

Спасибо

Ответы [ 3 ]

2 голосов
/ 06 ноября 2010

Хорошо, вот моя исправленная версия. В частности ...

Строка 26: нет оснований для приведения результата malloc(3), он уже возвращает void *

Строка 28: не создавайте бессмысленного тройного косвенного указателя, передавая & struc, вы уже выделили для него место, поэтому трудно представить какую-либо возможную причину для его изменения. В конечном итоге вы хотите передать точное возвращаемое значение с malloc(3) на следующий уровень.

Строка 11: еще одно ненужное приведение, и мы действительно хотим изменить указатель строки на struct[i], т. Е. *struc[i] изменит то, на что один из тех 10 указателей, которым main() назначил точки, но они не еще не установлено. Это работа здесь.

И с этими изменениями это работает довольно хорошо ...

 1  #include <stdio.h>
 2  #include <stdlib.h>
 3  
 4  struct mystruct {
 5    char *info;
 6  };
 7  
 8  void do_something(struct mystruct ** struc) {
 9    int i;
10    for (i = 0; i < 10; i++) {
11      struc[i] = malloc(sizeof(struct mystruct));
12      struc[i]->info = "foo";
13    }
14  }
15  
16  void do_something_else(struct mystruct ** s) {
17    int i;
18  
19    for (i = 0; i < 10; ++i)
20      printf("%2d: %s\n", i, s[i]->info);
21  }
22  
23  int main(int argc, char *argv[]) {
24    struct mystruct **struc;
25  
26    struc = malloc(sizeof(struct mystruct *) * 10);
27  
28    do_something(struc);
29    do_something_else(struc);
30    return 0;
31  }
0 голосов
/ 06 ноября 2010

Не считайте malloc, поскольку он пуст: *:

http://faq.cprogramming.com/cgi-bin/smartfaq.cgi?answer=1047673478&id=1043284351
0 голосов
/ 06 ноября 2010

Вместо dosomething(&struc); используйте dosomething(struc);.У вас есть struct mystruct **, и именно этого ожидает функция.

Вместо

*struc[i] = (struct mystruct *) malloc (sizeof (struct mystruct));

Использование

struc[i] = (struct mystruct *) malloc (sizeof (struct mystruct));

struc - это struct mystruct **, поэтому struc[i] ожидает struct mystruct *.

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