сомневается в двойном указателе в C - PullRequest
0 голосов
/ 22 июня 2009

следующий код успешно выполнен ...

typedef struct _s
{
  int *r;

}s;

void main()
{
   s *u;
   int y=1000;  
   u=malloc(sizeof(s)*8);
   u->r=malloc(sizeof(int)*8);
   u->r[5]=y;

   printf("%d\n",u->r[5]);
   getch();
}

но я пишу следующий код, как указано выше но дает ошибку .... я использую структуру ..... может, почему я знаю причину ....? если я использую двойной указатель, как (... e ** h ...) производит правильный вывод ... но причина в ...?

typedef struct _e
{
   int r;
}e;

typedef struct _s
{
  e *h;

}s;

void main()
{
   s *u;
   int y=1000;   
   u=malloc(sizeof(s)*8);

   u->h=(e*)malloc(sizeof(e)*10);
   u->h[1]=y;
   printf("%d\n",u->h[1]);   
   getch();
}

Ответы [ 4 ]

4 голосов
/ 22 июня 2009

Вы пытаетесь назначить целое число на структуру:

int y=1000;   
u->h[1]=y;

Возможно, вы хотели использовать u->h[1].r (а также в следующем операторе печати):

u->h[1].r=y;
printf("%d\n",u->h[1].r);   

Если h будет объявлено как e**, это не даст никаких ошибок, потому что u->h[1] имеет тип e* и int y может быть неявно преобразовано в указатель в присваивании. Но на самом деле это ничего не даст.

1 голос
/ 22 июня 2009

В строке

u->h[1]=y;   

левая часть - это структура, а не целое число. Написать

u->h[1].r=y;   

и вы назначаете y полю r структуры, что вы и собираетесь делать.

1 голос
/ 22 июня 2009
u->h[1]=y;

Это попытка присвоить int для структуры. Вместо этого должно быть

u->h[1].r=y;

То же самое касается printf ().

0 голосов
/ 22 июня 2009

Прежде всего, зачем ты это делаешь? Не имеет смысла иметь однобуквенные имена или структуры с одним элементом.

s - это тип, представляющий структуру, содержащую один указатель на e, который, в свою очередь, является типом, содержащим один int.

u - указатель на s, и, таким образом, u-> h [1] имеет тип e. Вы не можете назначить int для e. Единственная причина, по которой он работает с ** h, заключается в том, что вы присваиваете указатель типа int, что возможно, но почти всегда неправильно.

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