2014-10-14 2 views
-2
struct x { 
    unsigned int y; 
    unsigned int *ptr; 
}; 

std::vector<struct x> z; 

Я хочу, чтобы получить доступ к целочисленный массив, на который указывает ptr. z[0].y будет правильно возвращать элемент y из первой структуры в векторе.Как напечатать заостренный на массив Целые внутри структуры Внутри вектора

Как напечатать массив, на который указывает ptr внутри первой структуры?

+2

В чем проблема с использованием 'z [0] .ptr [i]' где 'i' - это индекс, к которому вы хотите получить доступ? – Oguk

+0

Ptr хранит адрес другого выделенного массива. Он не указывает на кусок выделенной памяти. – user3526793

+0

Указывает на выделенный массив, но он не указывает на выделенную память? Это противоречит самому себе;). Вы имеете в виду, что ничто не было назначено на 'ptr'? Тогда вы должны сделать это сначала, прежде чем пытаться читать. Как насчет использования 'std :: vector ' вместо 'unsigned int *'? Пока вы не хотите, чтобы многие ваши структуры указывали на один и тот же базовый массив, это должно быть намного безопаснее, потому что вам не нужно заботиться о распределении/освобождении памяти. (Кроме того: ваш вопрос касался только печати (т. Е. * Чтения *) ptr, а не создания массива, на который он может ссылаться). – Oguk

ответ

0

z[0].ptr вернет ptr из первой структуры в векторе. Чтобы получить доступ к элементу массива, на который это указывает, используйте z[0].ptr[n].

0

Точно так же, как доступ z[0].y:

z[0].ptr; 

Однако вы должны знать размер массива, если вы хотите перебрать и распечатать его элементы. Возможно, вы хотите сохранить дополнительный unsigned int size; внутри своего struct.

Вы получаете доступ к элементам массива, как обычно:

for(unsigned int i=0;i<z[0].size;i++) 
    std::cout << z[0].ptr[i] << std::endl; 

Если ваш массив может изменить размер, и вы не хотите, чтобы сохранить дополнительную переменную, просто использовать std::vector, как вы сделали, чтобы сохранить ваши Структуры.

Не забудьте сначала создать массив, используя new[], а затем удалите его содержимое с помощью delete[], когда оно вам не понадобится. Попытка доступа к памяти, которая не принадлежит вам, приведет к undefined behaviour.

+0

Вещь unsigned int * ptr никогда не выделяется, она просто указывает на выделенный массив unsigned int. – user3526793

+0

@ user3526793 Что значит ptr никогда не выделяется? –

+0

@ user3526793 Я думаю, вы не понимаете концепцию выделения памяти. Если указатель указывает на выделенную память (независимо от того, когда и как она была выделена), сам указатель действителен, и вы можете получить к нему доступ, как обычный массив. Если это не указывает на некоторые данные, которые в какой-то момент были признаны недействительными с помощью 'delete []' или выхода из области видимости, если она не была назначена вручную. –

Смежные вопросы