假设我有一个结构:为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'分配内存。再次,这取决于你需要什么。 –