C struct указатель итерации - PullRequest
3 голосов
/ 09 июля 2011

Я не ожидал, что смогу увеличить указатель на структуру в блоке структур памяти. Но это похоже на работу. Есть ли случаи, когда это не работает? Если я создаю «список» структур, то я всегда смогу увеличить указатель на них, и C определит, на сколько байтов нужно перейти?

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

struct User {
    int id;
    char name[32];
    float net_worth;
};
typedef struct User User;


int main(int argc, char** argv) {
    User* u1 = (User*)malloc(sizeof(User));
    u1->id = 1;
    strcpy(u1->name, "Mike");
    u1->net_worth = 43.45;
    User* u2 = (User*)malloc(sizeof(User));
    u2->id = 2;
    strcpy(u2->name, "Pablo");
    u2->net_worth = -2.00;
    User* u3 = (User*)malloc(sizeof(User));
    u3->id = 3;
    strcpy(u3->name, "Frederick");
    u3->net_worth = 7329213.45;

    User** users = (User**)malloc(sizeof(User)*10);
    *users = u1;
    printf("%s\n", ((User*)(*users))->name);
    *users++;
    *users = u2;
    printf("%s\n", ((User*)(*users))->name);
    *users++;
    *users = u3;
    printf("%s\n", ((User*)(*users))->name);


    return 0;

}

Ответы [ 5 ]

5 голосов
/ 09 июля 2011

Это очень много задумано. Предположим, у вас есть

User userArray[16];

Вы можете получить доступ ко второму пользователю через userArray[1] или *(userArray + 1), или получить указатель на первый элемент и увеличить его с помощью ++.

3 голосов
/ 09 июля 2011

Проще говоря: да.Вот почему указатели имеют тип.

1 голос
/ 09 июля 2011

Да, вот как это должно работать. Добавление 1 к указателю в массиве фактически приведет к переходу к следующему элементу (C корректирует адрес памяти на правильную величину, размер структуры).

Единственный раз, когда это не сработает, это когда вы заходите слишком далеко. Указатель действителен (для разыменования и арифметики указателей), только если он указывает на массив или (только для арифметики) на него. Итак:

int x[10];
int *px = &(x[9]);  // Points to last element, okay to dereference.
px++;               // Points one beyond, still okay for aritmetic.
px++;               // Don't use this for anything.

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

0 голосов
/ 09 июля 2011

и C выяснит, сколько байтов будет перемещено?

Да. Вот почему C накладывает ограничения, которые он делает на то, что вы можете поместить в структуру: каждый экземпляр структуры данного типа должен иметь одинаковый размер, и компилятор должен иметь возможность определить этот размер во время компиляции. , чтобы эта схема работала.

0 голосов
/ 09 июля 2011

Да.

(текст для заполнения 30-символьного сообщения)

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