如何正确地为字符串“数组”动态分配内存

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 提供内存但不调用构造函数。如果没有调用strings 构造函数之一,您实际上就没有string。你有一块内存伪装成string,它几乎是一个定时炸弹。用这个未初始化的内存做任何stringish 都会导致程序崩溃,而程序崩溃是最好的情况。 【参考方案1】:

问题是你使用了malloc()。您为personnel bytes 的数量分配内存,而不是 strings 的数量。而且您根本不会在该内存中构造任何 string 对象。

如果可以避免的话,根本不要在 C++ 中使用malloc()。请改用newnew[],例如:

#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];

最后,给定变量名称,考虑使用classstruct 将员工的详细信息组合在一起:

#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;

【讨论】:

以上是关于如何正确地为字符串“数组”动态分配内存的主要内容,如果未能解决你的问题,请参考以下文章

通过动态分配创建数组后,在C中通过realloc改变内存大小时出现问题

如何使用 malloc 为 C 中的结构创建动态内存分配?

动态分配内存

char数组的动态内存分配

如何从函数返回动态分配的指针数组?

指针数组的动态内存分配