假設我有一個結構:爲C中的結構中的指針分配和分配內存?
struct b {
unsigned short num;
unsigned short size;
unsigned char *a;
};
我再宣佈一個指向b
的struct
指針:
struct b *foo=malloc(sizeof(struct b));
我怎麼分配內存foo
的a
並分配a
點到字符串?
假設我有一個結構:爲C中的結構中的指針分配和分配內存?
struct b {
unsigned short num;
unsigned short size;
unsigned char *a;
};
我再宣佈一個指向b
的struct
指針:
struct b *foo=malloc(sizeof(struct b));
我怎麼分配內存foo
的a
並分配a
點到字符串?
這並不是說不同的,例如,分配內存的字符串hello
:
char *hello = "hello";
foo->a = malloc(strlen(hello) + 1);
strcpy(foo->a, hello);
'foo-> A'(運營商 - >),應使用
首先,你必須分配malloc爲foo提供的內存,那麼它將包含名爲「a」的內部指針的地址。當存儲地址爲「a」(而不是「指向」,但存儲指向地址的地址)時,可以在那裏存儲地址。
這樣: 1.結構的b *富= malloc的(...) 2. foo-> A = malloc的(...)
實際上,已經struct b *foo = malloc(sizeof *foo);
分配足夠的空間來容納一個字符指針,所以這取決於你想要做什麼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,總是。
要分配/複製使用strcat
,strcpy
,memcpy
,strncat
,sprintf
一個字符串,等等
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?另外,a是一個指針,但不應該是foo.a = &hello;? – Pig
@ user3300198它應該是'foo-> a',這是我的錯誤,現在已經修復。'foo-> a = hello'可以工作,但這意味着你正在使'a'指向那個字符串,在這種情況下,你不需要爲'a'分配內存。這取決於你需要什麼。 –
@ user3300198繼續:另一方面,'strcpy',將字符串的內容複製到'a',並且我認爲這是你想要的,因爲你在爲'a'分配內存。再次,這取決於你需要什麼。 –