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

标签 c

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

我在 Internet 上搜索过,但我的教科书对此一无所知。

所有的例子都来自这样的人

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));

或任何出路?

最佳答案

您似乎对指针以及事物在内存中的最终位置有些困惑。结构的字段是结构内存的一部分。在您的例子中,该结构由一个 char 指针和一个 int 组成。一旦拥有结构的实例,就不需要单独分配它们,因为它们已经是结构的一部分。

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

注意 name 还没有指向任何有趣的东西。让我们改变一下:

t->name = malloc(100);

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

也可以在不使用 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 - malloc 将内存分配给非指针类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23908041/

相关文章:

c - 解析用 C 编写的代码并提供 API 的库

C http O_NONBLOCK 模式问题?

int 和 argv 的比较

c - 将结构变量初始化为 NULL,但调用时它不为 null

c - fork() 如何处理像 stdout 这样的缓冲流?

c - 如何在C中读取目标文件?

c - C-使用portaudio和回调函数同时进行音频输入和输出

C:奇怪的条件 printf 行为

c - 在 Raspberry 中使用 C 语言的时钟

c++ - C++中的文件读取问题