您似乎对指针和内存中的位置有些困惑。结构体的字段是结构体的一部分内存。在您的情况下,结构体由一个
char
指针和一个
int
组成。一旦您拥有结构体的实例,就不需要单独分配它们,因为它们已经是结构体的一部分了。
struct _test_t *t = malloc(sizeof(struct _test_t));
t->flag = 123;
t->name = NULL;
请注意,
name
目前还没有指向任何有趣的内容。让我们改变一下:
t->name = malloc(100)
请注意指针名称与其指向的内存之间的区别。只有指针本身是结构体的一部分。
还可以通过在堆栈上分配来创建结构体的实例,而不使用malloc:
struct _test_t t;
t.flag = 123;
t.name = malloc(100);
t
现在在堆栈上分配,并且当您离开声明它的范围时,它将自动被释放。但是,name
仍然指向堆上的内存,该内存不会随着结构体一起被释放,因此一旦不再需要它,您必须手动释放它。
编辑:您提到要为非指针分配内存。但这对我来说没有多大意义。malloc的功能是为您保留一些内存供您使用,并返回一个指向该内存的指针。它需要返回它已经分配的内存的地址,否则您就不知道它在哪里。而指针实际上只是一个地址值。
您可以使用malloc
为int
分配空间,但您将得到一个指向int
的指针,您必须使用它来访问实际的int
:
int *i = malloc(sizeof(int));
*i = 123;
在C中,如果不通过指针进行访问,是无法直接引用那个int值的,这可能并非你想要的。而在C++中,你可以使用引用来直接引用int值:
int *i = (int*)malloc(sizeof(int));
*i = 123;
int &j = *i;
cout << j << endl;
这将打印出 "123",表明
j
直接引用整数值。然而,C语言没有这个特性,因此您总是需要使用指针。
int
可能不足以容纳地址,这取决于平台。 - Rohan