我的代码有问题我无法将字符串值分配给结构中的char *。有人能告诉我我的代码有什么问题吗?为什么?
#include <iostream>
using namespace std;
typedef struct{
char* name;
char* city;
int age;
} person;
void main()
{
person * user;
user = (person*)malloc(sizeof(person*));
cout << "Please fill in the user info.." << endl << "Name: ";
cin >> user->name;
cout << "Age: ";
cin >> user->age;
cout << "City";
cin >> user->city;
cout << "The user info is:" << endl << "Name: " << user->name << endl << "Age: " << user->age << endl << "City: " << user->city << endl;
system("pause");
}
非常感谢。
答案 0 :(得分:3)
你的代码是C和C ++风格的可怕组合,正如Mike的评论所说,选择一种语言并正确使用它。
#include <iostream>
#include <string>
using namespace std;
struct person {
string name;
string city;
int age;
};
int main()
{
person user;
cout << "Please fill in the user info.." << endl << "Name: ";
cin >> user.name;
cout << "Age: ";
cin >> user.age;
cout << "City";
cin >> user.city;
cout << "The user info is:\n" << "Name: " << user.name << "\nAge: " << user.age << "\nCity: " << user.city << endl;
system("pause");
}
当你不需要时,不要动态分配(然后没有购买错误内存量的风险,也没有没有为字符串分配内存的风险,这两者都是你在原计划中犯的错误。)
main
必须返回int
而不是void
typedef struct {...} x;
,只需说struct x {...};
答案 1 :(得分:2)
你用两种不同的语言标记了这个问题,似乎是在两者的可怕混合中进行编码。你应该选择一种语言并坚持下去。
如果这是C ++,那么使用标准库:
#include <string>
#include <iostream>
struct person {
std::string name;
std::string city;
int age;
};
int main() { // not void
person user;
// ...
std::cin >> user.name;
// ...
}
如果它意味着是C,那么你需要为字符串分配内存。从堆中分配它们:
person user;
user.name = malloc(MAX_NAME_SIZE);
user.city = malloc(MAX_CITY_SIZE);
或将它们嵌入结构中:
typedef struct {
char name[MAX_NAME_SIZE];
char city[MAX_NAME_SIZE];
int name;
} person;
并在从输入读取时注意不要溢出这些固定大小的缓冲区。
如果你真的想因某种原因使用malloc
作为结构本身,那么为结构分配足够的东西,而不只是指针:
user = malloc(sizeof(person));
答案 2 :(得分:0)
malloc(sizeof(person));
这将创建用于保存2个char *和1个int。
的内存您还需要为错过的struct中的char * s分配内存。
答案 3 :(得分:0)
我不知道c++
,但如果您选择坚持c
,则user->name
未分配内存,user->city
。您需要使用具有适当大小的malloc()
来为指针变量分配内存,然后使用它们来存储值。
另外,
user = (person*)malloc(sizeof(person*));
应该是
user = malloc(sizeof(*user));
然后,void main()
应更改为int main()
,并需要添加return 0
。将退出状态发送回shell是一种更好的做法。
注意:通过查看
的用法#include <iostream>
using namespace std;
它看起来更像c++
,但IMO,逻辑应该是相同的。