我有这样的结构:
struct process {int PID;int myMemory[];};
但是,当我尝试使用它时
process p;
int memory[2];
p.myMemory = memory;
我从eclipse中得到一个criptic错误,说int [0]与int [2]不兼容;
我做错了什么?
谢谢!
答案 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]; //这不好。