Я пытаюсь понять этот код:
struct mys {
double d[128];
};
void my_func(int iters) {
int i;
struct mys *ptr = malloc(iters *sizeof(struct mys));
for(i = 0; i < iters; i++) {
ptr[i].d[0] = (double)i;
}
free(ptr);
}
Что я знаю:
mys
имеет размер 8 * 128
(размер double
равен 8
, это массив 128
удваивается)
*ptr
имеет размер iters * (8 * 128)
Что здесь происходит:
ptr[i].d[0] = (double)i;
?
Что я знаю:
// ptr->d is the address of the first part of d
// same as (*ptr).d
// BECAUSE d IS A STRUCT
// ptr->d[i] is the actual value. so, 0.0000
// same as (*ptr).d[i]
Заранее спасибо.
ptr[i]
- это значение по индексу i
, поэтому начинается с 0.0000
.d
не инициализируется, это просто имя члена struct
.Как мы можем просто d
здесь?
Что я думаю:
*ptr
является кратным (iters
) структурами.
Итак, ptr[0]
этопервый struct
, ptr[1]
- второй struct
и т. д.
ptr[i].d
доступ к массиву i
th структуры d
.
ptr[i].d[0]
доступ к первомуиндекс массива d.Таким образом, строка выше устанавливает это число на double(i)
.
Так что это действительно только устанавливает первый элемент каждой структуры равным 0
.Я прав?
Но когда iters
равен 2
, и я пытаюсь:
for(int i = 0; i < iters; i++) {
printf("%p\n", ptr[200].d);
}
, он все равно печатает адрес.Почему это так?