遇到一次struct*
数组忘记初始化的bug,记录一下。
原代码
下面是有问题的代码:
struct Res{
int n;
int *c,*id;
Res(){
n=0;c=id=nullptr;
}
};
void task(struct Res *res){
int n=10;
int *c = new int[n];
int *id = new int[n];
for(int i=0;i<n;i++){
c[i]=i;
id[i]=2*i;
}
res->n = n;
res->c = c;
res->id = id;
}
int main()
{
struct Res **r = new Res*[10];//并没有初始化
task(r[0]);
cout<<"n="<<r[0]->n<<"\n";
for(int i=0;i<r[0]->n;i++)
cout<<r[0]->c[i]<<" ";
cout<<"\n";
for (int i = 0; i < r[0]->n; i++)
cout << r[0]->id[i] << " ";
cout << "\n";
for(int i=0;i<10;i++){
delete[] r[i]->c;
delete[] r[i]->id;
}
delete[] r;
return 0;
}
问题
new Res*[10]
创建的是指针,并没有创建struct,因此没有执行struct初始化
解决
方法一:创建struct*数组后初始化
struct Res{
int n;
int *c,*id;
Res(){
n=0;c=id=nullptr;
}
};
void task(struct Res *res){
int n=10;
int *c = new int[n];
int *id = new int[n];
for(int i=0;i<n;i++){
c[i]=i;
id[i]=2*i;
}
res->n = n;
res->c = c;
res->id = id;
}
int main()
{
struct Res **r = new Res*[10];//struct*数组
for(int i=0;i<10;i++)r[i] = new Res(); // Initialize
task(r[0]);
cout<<"n="<<r[0]->n<<"\n";
for(int i=0;i<r[0]->n;i++)
cout<<r[0]->c[i]<<" ";
cout<<"\n";
for (int i = 0; i < r[0]->n; i++)
cout << r[0]->id[i] << " ";
cout << "\n";
for(int i=0;i<10;i++){
delete[] r[i]->c;
delete[] r[i]->id;
delete r[i]; // Deallocate each r[i] after deleting c and id
}
delete[] r;
return 0;
}
方法二: 不要使用二重指针
struct Res{
int n;
int *c, *id;
Res(){
n = 0;
c = nullptr;
id = nullptr;
}
};
void task(struct Res *res){
int n = 10;
int *c = new int[n];
int *id = new int[n];
for (int i = 0; i < n; i++)
{
c[i] = i;
id[i] = 2 * i;
}
res->n = n;
res->c = c;
res->id = id;
}
int main(){
struct Res *r = new Res[10];//init struct
task(&r[0]);
cout << "n=" << r[0].n << "\n";
for(int i = 0; i < r[0].n; i++){
cout << r[0].c[i] << " ";
}
cout << "\n";
for (int i = 0; i < r[0].n; i++){
cout << r[0].id[i] << " ";
}
cout << "\n";
for(int i = 0; i < 10; i++){
delete[] r[i].c;
delete[] r[i].id;
}
delete[] r;
return 0;
}