Назначение значения указателя на определенный индекс в C - PullRequest
1 голос
/ 09 марта 2019

Я пытаюсь понять этот код:

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);
}

, он все равно печатает адрес.Почему это так?

Ответы [ 2 ]

2 голосов
/ 09 марта 2019

Что здесь происходит: ptr[i].d[0] = (double)i;?

Это:

struct mys *ptr = malloc(iters *sizeof(struct mys));

выделяет память для массива структур, называемых ptr.

Эта строка кода:

ptr[i].d[0] = (double)i;

присваивает i первой ячейке массива d, i -ой структуры в массиве ptr.

i приводится к double, поскольку d - это массив значений типа double, а i объявляется как int.


, когдаiters равно 2, и я пытаюсь: for(int i = 0; i < iters; i++) { printf("%p\n", ptr[200].d); } он все еще печатает адрес.Это почему?Разве он не должен выходить за пределы диапазона, поскольку ptr - это только 2 структуры?

Это определенно выходит за пределы диапазона, поскольку массивы индексируются 0.

Однако эта попыткавызывает неопределенное поведение (UB), что означает, что вы не знаете, как будет вести себя код.Например, на вашем компьютере он печатает адрес, на моем компьютере это может вызвать ошибку сегментации и т. Д. ...

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

Так что это действительно только устанавливает первый элемент каждой структуры равным 0. Я прав?

Копирует индекс i, преобразованный в тип double, в первый элемент каждой структуры. В противном случае вы правы.

В отношении выражения ptr[200].d это то же самое, что и &(ptr[200]), поскольку массив d[] является единственным элементом объекта mys. Поскольку ширина double составляет восемь байтов, каждый объект mys занимает (8 байтов) (128) = 1 КБ. Следовательно, &(ptr[200]) == ptr + 200*1024. Последний является адресом 200 кБ после начала *ptr. Значение адреса зависит от того, хранится ли там что-либо значимое.

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