繁体   English   中英

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

[英]assign and allocate memory for a pointer inside a struct in C?

假设我有一个结构:

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

然后,我声明一个指向bstruct的指针:

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

如何为fooa分配内存并分配a指向字符串?

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

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

实际上, 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);

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

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

因此:1. struct b * foo = malloc(...)2. foo-> a = malloc(...)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM