c вопрос о структуре - PullRequest
       1

c вопрос о структуре

0 голосов
/ 09 марта 2011
#include <stdio.h>
struct audiocd {
    char title[256];
    int trackNo;
    char type;
    char publisher[256];
};
int main() {
    struct audiocd* cdptr;
    struct audiocd cdarray[4];
    cdptr = cdarray;

    printf("%d\n", &(cdarray[2]));
    printf("%d\n", cdptr);
}

Что такое cdarray[2] & cdptr?

РЕДАКТИРОВАТЬ: Спасибо, но если printf("%d\n", &cdarray) равно 4291520, можно ли отследить printf("%d\n", &(cdarray[2])) & printf("%d\n", cdptr)?

Ответы [ 3 ]

4 голосов
/ 09 марта 2011

Общий эффект от программы - просто неопределенное поведение.Он передает адреса в printf, но использует преобразование %d, которое ожидает int.Несоответствие приводит к неопределенному поведению.

В типичном случае, когда int и указатель имеют одинаковый размер, он напечатает адрес в cdptr и адрес cdarray[2].

Если вы хотите распечатать эти адреса, очевидным способом будет что-то вроде:

printf("%p", (void *)&cdarray[2]); // (void *)cdarray+2
printf("%p", (void *)cdptr);

Что касается того, что эти выражения "являются", это адреса - адреса началамассив и третий элемент массива соответственно.

0 голосов
/ 09 марта 2011

спасибо, но если printf ("% d \ n", & cdarray) равен 4291520, возможно ли отследить printf ("% d \ n", & (cdarray [2])) & printf ("% d \ n ", cdptr).

Если я правильно понял ваш вопрос, я думаю, вы хотите вывести значения & (cdarray [2]) и & (cdptr) из значения cdarray.

Поскольку вы назначили cdarray для cdptr, cdptr сохранит начальный адрес массива.Теперь & (cdarray [2]) просто

cdarray + 2*sizeof(struct audiocd)

Кроме того, как обсуждалось выше,% p следует использовать для печати адресов памяти вместо% d.

0 голосов
/ 09 марта 2011

Вот как вы должны печатать (% u вместо% d для печати адреса указателей)

#include <stdio.h>
struct audiocd {
   char title[256];
   int trackNo;
   char type;
   char publisher[256];
};
int main() {
   struct audiocd* cdptr;
   struct audiocd cdarray[4];
   cdptr = cdarray;

   printf("%u\n", (cdarray[2]));
   printf("%u\n", cdptr);
}

Кстати, ваш код просто печатает адрес памяти 1-го и 3-го элемента массива структурыAudioCD.

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