malloc将内存分配给非指针类型

时间:2014-05-28 09:41:10

标签: c

如何将内存分配给非指针的类型?

我在互联网上搜索过,然后我的教科书对此一无所知。

所有的例子都来自那些

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 个答案:

答案 0 :(得分:1)

你似乎对指针有些困惑,而且事情最终会在内存中出现。结构的字段是结构内存的一部分。在您的情况下,结构由char指针和int组成。一旦你拥有了struct的实例,你就不需要单独分配它们了,因为它们已经是struct的一部分。

struct _test_t *t = malloc(sizeof(struct _test_t));
t->flag = 123;
t->name = NULL;

请注意,name并未指出任何有趣的内容。让我们改变一下:

t->name = malloc(100);

请注意指针 name与其指向的内存之间的区别。只有指针本身才是结构的一部分。

也可以通过在堆栈上分配它来创建struct的实例而不使用malloc:

struct _test_t t;
t.flag = 123;
t.name = malloc(100);

t现在已在堆栈上分配,并且当您离开声明它的范围时将自动再次释放。但是,name仍然指向堆上的内存获取结构,因此您不必再需要手动释放它。

编辑:您提到要将内存分配给非指针的内容。尽管如此,这对我来说并没有多大意义。 malloc的功能是为您的使用保留一些内存,并将指针返回到该内存。它需要返回已分配的内存地址,否则你不会知道它在哪里。指针实际上只是一个地址值。

您可以使用intmalloc分配空间,但是您将获得指向int的指针,您必须使用该指针来访问实际的int:< / p>

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;

这将打印&#34; 123&#34;,表明j直接引用整数值。但是,C没有该功能,因此您将始终必须使用指针。

答案 1 :(得分:0)

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

将malloc用于其他类型没有任何意义,因为它们的大小是已知的(除了模板,但它是C ++)。你的_test_t结构(resp struct _test_t * t)被分配了。在声明堆栈或堆时,无需手动分配每个成员。