如何正确地为字符串“数组”动态分配内存
Posted
技术标签:
【中文标题】如何正确地为字符串“数组”动态分配内存【英文标题】:How can I properly dynamically allocate memory for an "array" of strings 【发布时间】:2020-04-13 21:19:33 【问题描述】:所以,我只是在搞乱一些代码,询问用户他们想雇用多少人员。输入他们想要的数字后,我启动了 3 个指针。我关注的指针是字符串指针“employee_Names”。初始化后,我尝试根据用户对指针“employee_Names”的输入动态分配所需的适当内存量。
我认为我的语法很适合这部分,但是当我尝试将信息实际存储在分配的内存中时,我的问题就出现了。如代码所示,我尝试直接将employee_Names[0] 设置为一个名称,但这会给我带来错误。
personnel = requested_service() - 1;
string *employee_Names;
int *employee_Ages;
char *employee_Company;
employee_Names = (string*)malloc(personnel);
employee_Names[0] = "Bahn";
printf("Employee number 1 is: %s", employee_Names[0]);
我真的很想得到一些启发。如果我需要更具体地了解某个领域,或者是否需要查看更多代码,请告诉我。
【问题讨论】:
在 C++ 中,“动态字符串数组”拼写为std::vector<std::string>
。尽管在您的示例中,您可能想要定义一个类Employee
,然后使用std::vector<Employee>
std::string
是一个需要适当构造的复杂对象。 malloc
提供内存但不调用构造函数。如果没有调用string
s 构造函数之一,您实际上就没有string
。你有一块内存伪装成string
,它几乎是一个定时炸弹。用这个未初始化的内存做任何string
ish 都会导致程序崩溃,而程序崩溃是最好的情况。
【参考方案1】:
问题是你使用了malloc()
。您为personnel
bytes 的数量分配内存,而不是 strings 的数量。而且您根本不会在该内存中构造任何 string
对象。
如果可以避免的话,根本不要在 C++ 中使用malloc()
。请改用new
和new[]
,例如:
#include <string>
#include <cstdio>
personnel = ...;
std::string *employee_Names;
...
employee_Names = new std::string[personnel];
employee_Names[0] = "Bahn";
...
std::printf("Employee number 1 is: %s", employee_Names[0].c_str());
...
delete[] employee_Names;
也就是说,您确实应该直接使用std::vector
而不是new[]
。另外,请使用std::cout
而不是printf()
:
#include <iostream>
#include <vector>
#include <string>
personnel = ...;
std::vector<std::string> employee_Names(personnel);
...
employee_Names[0] = "Bahn";
...
std::cout << "Employee number 1 is: " << employee_Names[0];
最后,给定变量名称,考虑使用class
或struct
将员工的详细信息组合在一起:
#include <iostream>
#include <vector>
#include <string>
struct Employee
std::string Name;
int Age;
char Company;
;
...
personnel = ...;
std::vector<Employee> employees(personnel);
employees[0].Name = "Bahn";
...
std::cout << "Employee number 1 is: " << employees[0].Name;
【讨论】:
以上是关于如何正确地为字符串“数组”动态分配内存的主要内容,如果未能解决你的问题,请参考以下文章