2010-12-11 3 views
0

У меня есть STRUC вроде этого:использование массива в структуре C++

struct process {int PID;int myMemory[];};

Однако, когда я пытаюсь использовать его

process p; 
int memory[2]; 
p.myMemory = memory; 

Я получаю criptic ошибку от затмения говоря ИНТ [0 ] несовместим с int [2];

что я делаю неправильно?

Спасибо!

ответ

4

Не используйте статические массивы, malloc, или даже new, если вы используете C++. Используйте std::vector, который обеспечит правильное управление памятью.

#include <vector> 
struct Process { 
    int pid; 
    std::vector<int> myMemory; 
}; 

Process p; 
p.reserve(2); // allocates enough space on the heap to store 2 ints 
p.myMemory.push_back(4815); // add an index-zero element of 4815 
p.myMemory.push_back(162342); // add an index-one element of 162342 

Я мог бы также предлагают создать конструктор, так что pid изначально не имеет неопределенное значение:

struct Process { 
    Process() : pid(-1), myMemory() { 
    } 
    int pid; 
    std::vector<int> myMemory; 
}; 
+0

Кто проголосовал за это? Начиная с Java, вы можете не знать о STL-классах и насколько они важны. Очень важно консультировать тех, кто знаком с C++, что стандартные библиотеки шаблонов чрезвычайно полезны. Единственная причина, по которой вы должны вручную управлять массивом на основе кучи, - это упражнение для домашней работы. –

1

Я думаю, что вы должны объявить myMemory как int * then malloc(), когда знаете размер его. После этого его можно использовать как обычный массив. Int [0], по-видимому, означает «массив без заданного размера».


Пример:

int *a;  // suppose you'd like to have an array with user specified length 

// get dimension (int d) 

a = (int *) malloc(d * sizeof(int)); 

// now you can forget a is a pointer: 
a[0] = 5; 
a[2] = 1; 

free((void *) a);  // don't forget this! 
+0

Я получаю int *, но не malloc(). можете ли вы отправить пример? Я программист на Java, поэтому я не совсем знаком ... – kralco626

+0

Не используйте malloc в 'C++'. –

+0

@ kralco626: посмотри мое редактирование. @Seth Johnson: на самом деле я программист на C. ;) – BlackBear

0

int x[] обычно понимается как int * x.

В этом случае, это не так, поэтому если вы хотите вектор целых чисел неопределенного числа позиций, изменить декларацию:

struct process {int PID;int * myMemory;}; 

Вы должны изменить свою инициализацию:

int memory[2]; 
p.myMemory = new int[ 10 ]; 
+0

Я получаю ошибку с помощью строки 'p.myMemory = new int [2]' int [0] и int [2] не являются совместимыми типами. – kralco626

+0

Ммм ... Понимаю. Затем измените объявление на int * myMemory. Очевидно, что компилятор принимает вектор нулевых позиций вместо указателя. Это странно, но, вероятно, связано с размером структуры. Я отредактирую свой ответ. – Baltasarq

0

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

0

Синтаксис ...

struct process {int PID;int myMemory[];}; 

... не действует C++, но он может быть принят некоторыми компиляторами в качестве расширения языка. В частности, насколько я помню, g ++ принимает его. Он поддерживает C "struct hack", который не нужен в C++.

В C++, если вы хотите переменную массив длины в структуры, использовать std::vector или какой-либо другой массив типа класса, как

#include <vector> 

struct Process 
{ 
    int    pid; 
    std::vector<int> memory; 
}; 

Кстати, это хорошая идея, чтобы зарезервировать использование прописных ИДЕНТИФИКАТОРОВ для макросов, чтобы уменьшить вероятность совпадений имен с макросами и не заставить людей читать код глухим (это кричит).

Приветствия & НТН.,

+0

@downvoter: пожалуйста, опишите причину вашего downvote, чтобы другие могли понять, почему это глупо. –

+0

Я не проголосовавший, но вы смущены тем, что происходит с хакером структуры: struct hack является специальным правилом, которое делает C anon stuct typedef именем тега структуры, поэтому имеет внешнюю связь. – Yttrill

+0

@Yttril: просто положите, вы ошибаетесь. даже в стандарте C99 используется термин «struct hack» со значением, которое я использовал: в индексе стандарта C99 вы найдете «struct hack: см. элемент гибкого массива». это не термин, который имеет контекстно-зависимые значения. но спасибо за комментарий. это помогает мне понять разум нисходящего - или его отсутствие. господи. он или она даже не запустили его. –

0

Вы не можете сделать массив (определяется с помощью []), чтобы указать на другой массив. Поскольку идентификатор массива является указателем const. Вы можете изменить значение, указанное указателем, но вы не можете изменить сам указатель. Подумайте о «int array []» как «int * const array».

Единственный раз, когда вы можете это сделать во время инициализации.

// ОК

INT массив [] = {1, 2, 3};

// НЕ ОК

int array [];

array = [1, 2, 3]; // Это нехорошо.

1

Все эти ответы об объекте или о чем-то путают :) с использованием динамически выделенного указателя открывает проблему управления памятью, использование вектора открывает проблему с производительностью, а также делает тип данных не-POD, а также предотвращает memcpy () за работой.

Правильный ответ заключается в использовании

Array<int,2> 

где массив представляет собой шаблон комитет C++ не стал ставить в C++ 99, но который находится в C++ 0x (хотя я не уверен в имени). Это встроенный (без управления памятью или производительности) первый класс, который является оболочкой вокруг массива C. Думаю, у Boost уже есть что-то.

+0

Я не думаю, что OP знает длину 'memory' * a priori *. В противном случае он бы выбрал 'int myMemory [2]' в своем объявлении структуры. –

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