2014-02-12 42 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);