char数组的内存分配

时间:2012-01-31 14:29:26

标签: c memory-management

假设你有 -

struct Person {
    char *name;
    int age;
    int height;
    int weight; 
 };

如果你这样做 -

struct Person *who = malloc(sizeof(struct Person));

C如何知道为 name 变量分配多少内存,因为这可以容纳大量数据/字符串?我是C的新手并且对内存分配感到困惑。

10 个答案:

答案 0 :(得分:4)

它不会知道,你必须分别为它分配内存。

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

答案 1 :(得分:4)

不要假设存储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]

答案 2 :(得分:2)

name成员只是一个指针。指针的大小随底层架构而变化,但现在通常为4或8个字节。

name可以指向的数据(如果稍后分配)应该放在一个与struct完全不一致的区域。

在语言级别,structname成员指向的内存一无所知;你必须手动管理它。

答案 3 :(得分:2)

它只为指向char的指针分配内存。您需要为内容单独分配。

还有其他选择:

如果您可以使用固定大小的最大长度,则可以执行以下操作:

struct Person {
    char name[PERSON_NAME_MAX_LENGTH+1];
    int age;
    int height;
    int weight; 
 };

并按照你的例子分配它。

或者您可以声明variable sized struct,但我不建议这样做,因为它很棘手,每个结构不能有多个可变大小的数组:

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

答案 4 :(得分:0)

没有。你也必须这样做。

struct Person *who = malloc(sizeof(struct Person));
who->name = malloc(sizeof(char) * 16); /* for a 15+1 character array */

答案 5 :(得分:0)

你的结构中有一个指向名字字符数组的指针,即。它会占用代表内存地址所需的那么多字节。

如果您想实际使用该字段,则必须为其分配额外的内存。

答案 6 :(得分:0)

它将为name指针分配4个字节,但“真实”字符串没有空格。如果你试着在那里写,你将会出错;你需要单独malloc(和free)。

使用string(在C ++中)可以省去一些麻烦

答案 7 :(得分:0)

对于指针,struct只为指针分配了足够的内存。您必须为char *创建内存并将值赋给struct。假设你某处有char* name

struct Person *who = malloc(sizeof(struct Person));
who->name = malloc((strlen(name)+1) * sizeof(char));
strcpy(who->name, name)

答案 8 :(得分:0)

指针成员在我的经验中占据一个字(数据实际存在的地址)所以大小可能是16个字节(假设一个字是4个字节)

正如上面提到的那样,你需要单独为* name分配内存。女巫将为你想要的大小释放内存

答案 9 :(得分:-2)

我认为您还应该为名称属性

分配内存