2014-02-12 43 views
0

假設我有一個結構:爲C中的結構中的指針分配和分配內存?

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

我再宣佈一個指向bstruct指針:

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

我怎麼分配內存fooa並分配a點到字符串?

回答

2

這並不是說不同的,例如,分配內存的字符串hello

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

你爲什麼不使用foo-> a?另外,a是一個指針,但不應該是foo.a = &hello;? – Pig

+0

@ user3300198它應該是'foo-> a',這是我的錯誤,現在已經修復。'foo-> a = hello'可以工作,但這意味着你正在使'a'指向那個字符串,在這種情況下,你不需要爲'a'分配內存。這取決於你需要什麼。 –

+0

@ user3300198繼續:另一方面,'strcpy',將字符串的內容複製到'a',並且我認爲這是你想要的,因爲你在爲'a'分配內存。再次,這取決於你需要什麼。 –

0

'foo-> A'(運營商 - >),應使用

0

首先,你必須分配malloc爲foo提供的內存,那麼它將包含名爲「a」的內部指針的地址。當存儲地址爲「a」(而不是「指向」,但存儲指向地址的地址)時,可以在那裏存儲地址。

這樣: 1.結構的b *富= malloc的(...) 2. foo-> A = malloc的(...)

1

實際上,已經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,總是。
要分配/複製使用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);