malloc为非指针类型分配内存

3

如何为非指针类型分配内存?

我在互联网和教科书上搜索了很久,但都没有找到相关的内容。

所有的示例都是基于指针类型的。

char *test;
test = malloc (STRING_SIZE * sizeof (char));

在指针形式下实现,但是如果一个结构体甚至不需要指针类型就可以完成以下工作

struct _test_t {
  char *name;
  int flag;        //  <-- Here
};

这是不推荐使用的吗?我所能做的只是声明为指针。

...
int *flag;
...

然后像往常一样分配?
struct _test_t *t;
t->flag = malloc (sizeof (int));

或者有其他出路吗?

2
为什么你想要这样做?如果你为你的结构体分配了内存,那么int已经有了它的内存... - Theolodis
尝试 t->flag = (int) malloc(sizeof(int)); - nikhil mehta
1
@nikhilmehta,sizeof int 可能不足以容纳地址,这取决于平台。 - Rohan
2
你到底想做什么? - this
2个回答

2
您似乎对指针和内存中的位置有些困惑。结构体的字段是结构体的一部分内存。在您的情况下,结构体由一个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的功能是为您保留一些内存供您使用,并返回一个指向该内存的指针。它需要返回它已经分配的内存的地址,否则您就不知道它在哪里。而指针实际上只是一个地址值。

您可以使用mallocint分配空间,但您将得到一个指向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语言没有这个特性,因此您总是需要使用指针。

检查编译后,添加了有关C++引用的一些信息 :) - Medo42
“t”现在被分配到堆栈上了。我认为为“t”分配的内存位于堆中,而变量本身“t”则分配在栈上。 - Sankalp
在你引用的例子中,t 是一个连续的内存块的名称,其内容被解释为指针 (t.name) 和整数 (t.flag)。该内存位于堆栈中。t 的任何部分都不位于堆中。当您访问 t.name 时,将从堆栈中读取指针的值。t.name 的值恰好是堆中的内存地址,但我认为这不是你想要表达的意思。 - Medo42

0

malloc 用于分配那些编译时大小未知的对象的内存。这就是为什么它返回一个指针,因为它是地址的C表示(这里是在堆上分配的内存区域的地址)。

对于另一种类型使用 malloc 没有任何意义,因为它们的大小已知(除了模板,但那是 C++)。您的 _test_t 结构体(resp 结构体 _test_t *t)在声明时分别在堆栈或堆上分配,无需手动分配每个成员。


实际上并不是这样;*struct _test_t t; - this

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接