我想在循环中初始化结构并更新到数组.我正在使用以下代码.
#include <iostream>
struct Record {
char *name;
};
struct Response {
Record *records[];
};
int main()
{
Response *response = new Response;
for(int i=0; i<4; i++) {
Record *record= new Record();
char x[20];sprintf(x, "%d", i);
record->name = (char*)x;
response->records[i] = record;
std::cout << "Inserting: " << x << "\n";
//Not sure if I have to delete.
delete record;
}
for(int i=0; i<4; i++) {
std::cout << "Fetching: " << response->records[i]->name << "\n";
}
}
Run Code Online (Sandbox Code Playgroud)
奇怪的是,打印数组中的所有项目都打印相同的值.关于什么可能出错的任何想法,评论或想法?
样本输出:
Inserting: 0
Inserting: 1
Inserting: 2
Inserting: 3
Fetching: 3
Fetching: 3
Fetching:
Fetching: 3
Run Code Online (Sandbox Code Playgroud)
您将指向本地变量的指针存储在删除它们后访问的对象中.
即使Response::records尺寸合适,这两个因素也会使代码无效.
习惯用C++会使用std::string和std::vector<Record>,但是如果你真的想要C风格的字符串和数组,这应该可行:
struct Record {
char name[20];
};
struct Response {
Record records[4];
};
int main()
{
Response response;
for(int i = 0; i < 4; i++) {
Record record;
sprintf(record.name, "%d", i);
response.records[i] = record;
std::cout << "Inserting: " << record.name << "\n";
}
for(int i = 0; i < 4; i++) {
std::cout << "Fetching: " << response.records[i].name << "\n";
}
}
Run Code Online (Sandbox Code Playgroud)