char数组的内存分配
假设你有 –
struct Person { char *name; int age; int height; int weight; };
如果你这样做 –
struct Person *who = malloc(sizeof(struct Person));
C如何知道为name变量分配多少内存,因为这可以容纳大量的数据/字符串? 我是C的新手并且对内存分配感到困惑。
它不会知道,你必须分别为它分配内存。
struct Person *who = malloc(sizeof(struct Person));
分配足够的内存来存储Person
类型的对象。
在Person
对象内部,成员name
占用的空间等于指向char
的指针的大小。
上面的malloc
只是分配了那么多的空间,为了能够对你必须分别为它分配内存的成员指针做任何有意义的事情。
#define MAX_NAME 124 who->name = malloc(sizeof(char) * MAX_NAME);
现在,成员name
指向堆上大小为124
字节的动态内存,可以进一步使用。
此外,在您的使用完成后,您将需要记住明确free
它,否则您将最终导致内存泄漏。
free(who->name); free(who);
不要假设存储name的指针的内存与存储name的数据的内存相同。 假设一个4字节的字大小,你有以下几点:
-
char * (4 bytes)
-
int (4 bytes)
-
int (4 bytes)
-
int (4 bytes)
-
================
-
total: 16 bytes
其中: sizeof(char*) + sizeof(int) + sizeof(int) + sizeof(int)
。 C知道大小,因为你已经告诉它结构定义中元素的大小。
我觉得你困惑的是以下几点:
char *
的内容将是一个内存位置(例如0x00ffbe532
),这是存储实际字符串的位置。 不要假设struct内容是连续的(因为指针)。 事实上,你可以非常肯定他们不会。
所以,重申一下,例如struct Person
(这只是一个例子,实际程序中的位置不一样。)
-
location : [contents]
-
0x0000 : [0x00ffbe532]
-
0x0004 : [10]
-
0x0008 : [3]
-
0x000C : [25]
-
0x00ffbe532 : [I am a string\0]
name
成员只是一个指针。 指针的大小随底层架构而变化,但现在通常为4或8个字节。
name
可以指向的数据(如果稍后分配)应该布置在与struct
完全不一致的区域中。
在语言级别, struct
不知道name
成员指向的内存; 你必须手动管理它。
它仅为指向char的指针分配内存。 您需要为内容单独分配。
还有其他选择:
如果您可以使用固定大小的最大长度,则可以执行以下操作:
struct Person { char name[PERSON_NAME_MAX_LENGTH+1]; int age; int height; int weight; };
并按照您的示例分配它。
或者你可以声明一个变量大小的结构 ,但我不建议这样,因为它很棘手,你不能每个结构有多个可变大小的数组:
struct Person { int age; int height; int weight; char name[]; /*this must go at the end*/ };
然后分配如下:
struct Person *who = malloc(sizeof(struct Person) + sizeof(char)*(name_length+1));
它没有。 你也必须这样做。
struct Person *who = malloc(sizeof(struct Person)); who->name = malloc(sizeof(char) * 16); /* for a 15+1 character array */
你有一个指向结构中名称字符数组的指针,即。 它会占用代表内存地址所需的那么多字节。
如果要实际使用该字段,则必须为其分配额外的内存。
它将为name
指针分配4个字节,但“真实”字符串没有空格。 如果你试着在那里写,你会出错; 你需要单独malloc
(和free
)。
使用string
(在C ++中)可以省去一些麻烦
对于指针,struct只为指针分配了足够的内存。 您必须为char *创建内存并将值赋给struct。 假设你在某处有char* name
:
struct Person *who = malloc(sizeof(struct Person)); who->name = malloc((strlen(name)+1) * sizeof(char)); strcpy(who->name, name)
根据我的经验,指针成员占用一个字(数据实际存在的地址)所以大小可能是16个字节(假设一个字是4个字节)
正如上面提到的那样,你需要单独为* name分配内存。女巫会根据你想要的大小释放内存
我认为你还应该为name属性分配内存