为C中的结构内部的指针分配和分配内存?

时间:2014-02-12 06:14:55

标签: c pointers memory struct

假设我有一个结构:

struct b {
    unsigned short  num;
    unsigned short  size;
    unsigned char  *a;
};

然后我声明一个指向struct b的指针:

struct b *foo=malloc(sizeof(struct b));

如何为foo的{​​{1}}分配内存并指定a指向字符串?

4 个答案:

答案 0 :(得分:3)

例如,为字符串hello分配内存并没有那么不同:

char *hello = "hello";
foo->a = malloc(strlen(hello) + 1);
strcpy(foo->a, hello);

答案 1 :(得分:1)

实际上,struct b *foo = malloc(sizeof *foo);已经分配了足够的空间来容纳一个char指针,所以它取决于你想用foo->a做什么(ps:因为foo是一个指针,你需要使用间接操作者)。

如果foo->a(或*(foo).a)可以是常量字符串,则可以执行此操作:

struct b *foo = malloc(sizeof *foo);
foo->a = "A constant string";

请注意,因为这是(某种程度上)等同于:

const char *const_str = "this is read-only";

您无法更改有关字符a的任何内容。成员a在只读内存中分配了一个字符串常量的地址。简而言之:

foo->a = "constant";
printf("%c%c%c\n", foo->a[0], foo->a[2], foo->a[4]);//prints cnt 
foo->a[0] = 'C';//WRONG!

如果您希望能够更改字符串,请使用:

foo->a = malloc(50 * sizeof *(foo->a)));

此处sizeof是可选的,因为char的大小始终保证为1。 要分配/复制字符串,请使用strcatstrcpymemcpystrncatsprintf

strcpy(foo->a, "constant");
printf("%c%c%c\n", foo->a[0], foo->a[2], foo->a[4]);//still prints cnt 
foo->a[0] = 'r';
printf("%c%c%c\n", foo->a[0], foo->a[2], foo->a[4]);//still prints rnt 

现在你可以将字符串a更改为,但结果是,当你完成它时,你也必须释放这个内存:

//wrong:
free(foo);//works, but won't free the memory allocated for foo->a
//better:
free(foo->a);
free(foo);

答案 2 :(得分:0)

'foo-> a'(运算符 - >)应该使用

答案 3 :(得分:0)

首先你必须通过malloc为foo分配内存,然后它将包含名为“a”的内部指针的地址。当你有“a”的内存地址(不是“指向”但存储指向地址的地址)时,你可以在那里存储地址。

所以: 1. struct b * foo = malloc(...) 2. foo-> a = malloc(...)