c++ - 在 struct C++ 中使用 char* 或 char []

标签 c++ string struct

我正在创建一个名为 studentstruct。为了存储名称,仅在 struct 中声明 char 指针而不是具有预定义大小的 char 数组有什么问题吗?然后我可以将字符串文字分配给主代码中的 char 指针。

struct student
{
    int ID;
    char* name;
};

最佳答案

这实际上取决于您的用例。如上所述,您应该在 C++ 中使用 std::string。但是如果你使用的是 C 风格的字符串,那么这取决于你的用法。

使用定义大小的 char[] 可以避免由于空指针和其他指针相关错误(如内存泄漏、悬空指针等)引起的错误,但您可能无法优化内存使用.例如,您可以定义

#define MAX_SIZE 100
struct student
{
    int ID;
    char name[MAX_SIZE];
};

然后

#define STUDENT_COUNT 50
struct student many_students[STUDENT_COUNT];

但学生姓名的长度会有所不同,在许多情况下远小于 MAX_SIZE。因为这里会浪费很多内存。 或者在某些情况下它可能大于 MAX_SIZE。您可能必须在此处截断名称以避免内存损坏。

在我们定义使用 char* 的其他情况下,内存不会被浪费,因为我们只分配所需的数量,但我们必须注意内存的分配和释放。

struct student
{
    int ID;
    char *name;
};

然后在存储名称时我们需要做这样的事情:

struct student many_student[STUDENT_COUNT];
int i;
for( i=0; i<STUDENT_COUNT; i++) {
    // some code to get student name
    many_student[i].name = (char*)malloc(name_length+1 * sizeof(char));
    // Now we can store name
}

// Later when name is no longer required free it
free(many_student[some_valid_index_to_free].name);
// also set it to NULL, to avoid dangling pointers
many_student[some_valid_index_to_free].name = NULL;

此外,如果您再次为 name 分配内存,您应该释放之前分配的内存以避免内存泄漏。还要考虑的另一件事是在使用前对指针进行 NULL 检查,即,您应该始终检查为

if(many_students[valid_index].name!=NULL) {
    // do stuff
}

虽然您可以创建宏来执行此操作,但这些都是指针的基本开销。

使用指针的另一个优点是,如果有很多相似的名字,那么你可以将多个指针指向同一个名字并节省内存,但在数组中你将拥有单独的内存,例如,

// IF we have a predefined global name array
char *GLOBAL_NAMES[] = {"NAME_1", "NAME_2", "NAME_3", "NAME_4", ... , "NAME_N"};


// using pointers, just need to assign name to correct pointer in array
many_student[valid_index_1].name = GLOBAL_NAMES[INDEX_NAME_1];
many_student[valid_index_2].name = GLOBAL_NAMES[INDEX_NAME_1];

// In case of array we would have had to copy.

虽然这可能不是你的情况,但只是说指针可能有助于避免额外的使用。

希望对你有帮助:)

关于c++ - 在 struct C++ 中使用 char* 或 char [],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29793072/

相关文章:

c - 链表的结构数据类型问题

c++ - 插入小部件的 QGridLayout 问题

android - 如何找出 Android 上的 TextView 中文本换行的行数?

regex - 用于句子中介词的 Python 正则表达式

c++ - Intel Mac 上的总线错误,为什么?

c - 如何将结构初始化为空?

在 CPP 文件中实现并在另一个类中使用的 C++ 结构

c++ - 如何连接 Boost 序列化和 iostream 以将对象序列化和 gzip 到字符串?

c++ - 将 gcc 4.8.2 编译为静态可执行文件

c++ - 用指针理解 const_iterator?