Хорошо, вот моя исправленная версия. В частности ...
Строка 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 }