我有一个简单的int*结构,我想用指针来显示元素。我想做这样的东西。
for(int i = 0; i<x*y; i++){
std::cout << parr->elems[i];
}
它显示奇怪的数字,比如126514360,它应该显示0
struct MyStruct {
size_t x;
size_t y;
int* elems;
};
MyStruct* createMyStruct(size_t nr, size_t nc, int e = 0){
int how_many = nr*nc;
int my_list[how_many];
for(int i=0; i<how_many; i++){
my_list[i] = e;
}
MyStruct obj;
obj.x=nr;
obj.y=nc;
obj.elems = my_list;
return &obj;
}
void getElemsFromMyStruct(const MyStruct* parr) {
int x = parr->x;
int y = parr->y;
for(int i = 0; i<x*y; i++){
std::cout << parr->elems[i];
}
}
int main() {
MyStruct* a = createMyStruct(2, 3, 1);
//it should show elems from MyStruct.elems
getElemsFromMyStruct(a);
return 0;
}
发布于 2018-06-04 01:58:18
函数createMyStruct
返回在堆栈上创建的局部变量的地址。一旦函数结束,堆栈就会展开,变量也会被销毁。
同样,通过obj.elems = my_list
将同一函数中的MyStruct
设置为存储本地数组的地址。当函数结束时,它也会被删除。
我建议使用C/C++在堆栈和堆上进行阅读。此外,请注意,这与Java/C#等托管语言有很大不同,在托管语言中,可以使用类似的方法。
发布于 2018-06-04 02:01:04
您需要在createMyStruct()
函数中创建MyStruct
需要使用新指针创建,这样它就不会被销毁。这样做会导致示例的输出为:100000
。
MyStruct* createMyStruct(size_t nr, size_t nc, int e = 0){
int how_many = nr * nc;
int my_list[how_many];
for(int i=0; i<how_many; i++){
my_list[i] = e;
}
MyStruct *obj = new MyStruct;
obj->x=nr;
obj->y=nc;
obj->elems = my_list;
return obj;
}
https://stackoverflow.com/questions/50669313
复制相似问题