- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在创建一个名为 student
的 struct
。为了存储名称,仅在 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/
我有一个数组 items[] items[] 中的每一项都是一个结构体。 item 有键 id、date、value(即 item.id、item.date、item.value) 我想使用 Stru
我想存储 100 名员工。 RollNo,姓名,工资,时间(各种数据,我无法在这里解释,但你可以看下面的代码片段来理解 main() { struct day { int hour
这个问题在这里已经有了答案: storage size of ‘names’ isn’t known (3 个答案) 关闭 5 年前。 我正在尝试蓝牙编程,遇到了这个我不明白的问题。基本上,当我使用
这是一个奇怪的事情: 我有一个结构,它包含指向相同类型结构的指针和指向其他类型结构的指针,以及一些其他值。 struct animal { struct animal * father;
我有一个结构定义如下(名称不同) struct str1 { int field1; struct str2; } 我在一个函数中有一个*str1。我想要一个指向 str2 的指针。 所以
DISK_DETECTION_INFO is defined as有什么原因吗? typedef struct _DISK_DETECTION_INFO { DWORD Size
我正在尝试打包一个字符串和一个字符串的长度。 fmt = '
我在创建结构时遇到问题。 我的结构: public struct Device: Codable { let data: DeviceData let meta: Meta? } pu
struct Item { var name:String? var type:String? var value:Int? var tag:Int? } ... ..
// NewReaderSize returns a new Reader whose buffer has at least the specified 43 // size. If the ar
这个问题在这里已经有了答案: Sorting a vector of custom objects (14 个答案) 关闭 3 年前。 在下面的 C++ 片段中, 如何基于 TwoInts 结构中的
#include struct Header { unsigned long long int alignment; }; int main(void) { struct Heade
我有一个目前看起来像这样的结构(缩写为仅显示基本部分): typedef struct { uint32_t baudrate; ... some other internally u
对此没有太多解释,这就是我所拥有的: public struct PACKET_HEADER { public string computerIp; publi
我有以下代码: struct MyStruct{ data: &'a str, } fn get(S: &'a MyStruct) -> &'a str{ S.data } fn se
struct S1 { char c; int i; }; struct S3 { char c1; struct S1 s; double c2; }; 我正
我有一个名为 Parameter 的协议(protocol): protocol Parameter { var name: String { get } var unit: Unit
有 2 个 struct 定义 A 和 A。我知道 struct A 可以包含指向 struct A 的 POINTER 但我不明白为什么 struct A 不能包含struct A(不是指针) 最佳
我有以下代码: struct MyStruct{ data: &'a str, } fn get(S: &'a MyStruct) -> &'a str{ S.data } fn se
为了说明这一点,这里有一个小的不可变结构和一个更新它的函数: (struct timeseries (variable observations) #:transparent) (define (ad
我是一名优秀的程序员,十分优秀!