我创建了一个指针数组。 我想知道如何prp =可操作地将数据添加到指针数组中。 我尝试了下面的代码,很遗憾,这给了我一个内存错误,我不知道为什么。
class dataClass {
int data;
public:
void setdata(int d) {data = d;}
int getdata() const {return data;}
};
int main() {
dataClass** ptr = new dataClass*s[5];
int num = 9;
ptr[0] -> setdata(num);
return 0;
}
答案 0 :(得分:0)
您只需为指针分配内存(而不为对象分配内存),因此ptr [0]指向未指定的地址,并且会出现段错误。 您需要添加以下内容:
for(int i = 0; i < 5; i++) {
ptr[i] = new dataClass;
}
答案 1 :(得分:0)
使用 pointer-to-pointer-to-type 时,必须为所需数量的指针分配存储空间,然后为每个类分配存储空间,然后再为每个类分配存储空间分配给每个指针。
例如,在尝试提问时使用5
指针,您首先需要分配指针,例如
#define NPTRS 5
...
dataClass** ptrs = new dataClass *[NPTRS];
现在您已为5
指针分配了存储空间,以键入dataClass
,并将初始指针的地址分配给ptrs
(为清楚起见,我添加了复数形式)
现在已分配了指针的存储,但是分配的每个指针尚未指向dataClass
的有效存储,它们只是指针。在使用指针引用该类的实例之前,必须为每个类实例分配存储,然后将新的内存块的地址分配给每个指针,例如
for (int i = 0; i < NPTRS; i++) {
ptrs[i] = new dataClass;
ptrs[i]->setdata (i+1);
}
(上面为每个类实例分配了存储空间,将结果分配给ptrs[i]
,然后将data
的值设置为i+1
)
将其完全放在一起,您可以执行以下操作:
#include <iostream>
#include <cstdlib>
#define NPTRS 5
class dataClass {
int data;
public:
void setdata(int d) {data = d;}
int getdata() const {return data;}
};
int main() {
dataClass** ptrs = new dataClass *[NPTRS];
for (int i = 0; i < NPTRS; i++) {
ptrs[i] = new dataClass;
ptrs[i]->setdata (i+1);
}
for (int i = 0; i < NPTRS; i++)
std::cout << "ptrs[" << i <<"]->getdata() : "
<< ptrs[i]->getdata() << '\n';
return 0;
}
(注意:不要忘记您负责跟踪分配的内容,并在不再需要分配时调用delete
释放每个分配)
使用/输出示例
$ ./bin/dblptr2class
ptrs[0]->getdata() : 1
ptrs[1]->getdata() : 2
ptrs[2]->getdata() : 3
ptrs[3]->getdata() : 4
ptrs[4]->getdata() : 5
正如其他人所提到的那样,像vector
这样的C ++容器出错的可能性较小,并使您的工作容易得多。不过,您应该知道如何处理new/delete
以及容器的使用。
仔细检查一下,如果还有其他问题,请告诉我。
答案 2 :(得分:0)
您可以先创建一个对象数组 (构造函数将被自动调用)。
之后,创建一个指向您的指针的指针:
#include <stdio.h>
class dataClass {
int data;
public:
dataClass(){
printf(" new instance \n");
}
void setdata(int d) {
data = d;
printf(" setdata \n");
}
int getdata() const {return data;}
};
int main() {
dataClass* ptr = new dataClass[5];
dataClass** pptr = &ptr;
int num = 9;
pptr[0]->setdata(num);
return 0;
}
结果:
新实例
新实例
新实例
新实例
新实例
setdata