簡體   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