在结构c ++中使用数组

时间:2010-12-11 23:11:04

标签: c++ arrays

我有这样的结构:

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

但是,当我尝试使用它时

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

我从eclipse中得到一个criptic错误,说int [0]与int [2]不兼容;

我做错了什么?

谢谢!

7 个答案:

答案 0 :(得分:4)

如果您使用的是C ++,请不要使用静态数组,malloc甚至new 。使用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;
};

答案 1 :(得分:1)

我认为你应该在知道它的大小时将myMemory声明为int *然后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!

答案 2 :(得分:1)

关于向量的所有这些答案或其他任何混淆:)使用动态分配的指针打开了内存管理问题,使用向量打开了性能问题以及使数据类型成为非POD并且还阻止了memcpy()工作

正确的答案是使用

Array<int,2>

其中Array是一个模板,C ++委员会没有费心放入C ++ 99,但是在C ++ 0x中(尽管我不确定这个名字)。这是一个内联(无内存管理或性能问题)的第一类数组,它是C数组的包装器。我想Boost已经有了一些东西。

答案 3 :(得分:0)

int x[]通常被理解为int * x

在这种情况下,它不是,所以如果你想要一个不确定位数的整数向量,请将你的声明改为:

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

您应该将初始化更改为:

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

答案 4 :(得分:0)

在C ++中,数组定义几乎等于指针常量,这意味着它们的地址不能更改,而它们指向的值可以更改。也就是说,您不能通过赋值运算符将数组的元素复制到另一个数组中。您必须逐个遍历数组并复制元素并自行检查边界条件。

答案 5 :(得分: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;
};

顺便说一下,最好保留对宏的大写标识符的使用,以减少名称与宏碰撞的可能性,而不是让人们阅读代码聋(它在喊叫)。

干杯&amp;第h。,

答案 6 :(得分:0)

您不能使数组(使用[]定义)指向另一个数组。因为数组标识符是一个const指针。您可以更改指针指向的值,但不能更改指针本身。将“int array []”视为“int * const array”。

你唯一能做的就是在初始化期间。

//确定

int array [] = {1,2,3};

//不行

int array [];

array = [1,2,3]; //这不好。