2015-05-27 31 views
3

是否允许动态分配内存这样的静态变量:我们可以动态地为C中的静态变量分配内存吗?

#include <stdio.h> 
#include <stdlib.h> 

struct person 
{ 
    int age; 
    int number; 
}; 

static struct person* person_p = NULL; 

int main() 
{ 
    person_p = (struct person*)malloc(10 * sizeof(struct person)); 
} 

建上面的代码,但它确实允许动态分配内存的静态变量?

+1

更重要的是你为什么这样做?你知道函数接受参数!当你的程序增长时,你不会感到困惑! –

+1

你的意思是只有指针是静态的? – ratzip

+0

指针本身是静态的,但是通过指针分配的内存既不知道也不关心它。 –

回答

4

是的,它是有效的和允许的。 (除非您使用指针作为占位符)您可以(并且需要)在使用指针之前和之后动态分配内存和指针之间的内存。

相反,请记录,你do not cast通过指针它

+0

为什么如果它是const,它是无效的? – ratzip

+0

@ratzip你不能改变'const'。 :-) –

+1

'const'-ness在这里是无关的,可能只是混淆了这个问题。 –

0

我不明白为什么不。即使静态意味着只能有一个对象实例,但仍需要该对象的空间。请记住,任何malloc'd需要free'd,所以你会想在你的main()函数结束时做到这一点。

+0

这是C代码。 你的意思是“所以这个结构可能更适合于在包装函数或类中可以跟踪它的销毁。” – ratzip

+0

啊是的 - 你是对的。在这种情况下,你会想在main()函数的结尾释放你的结构。 –

+0

那么,'静态'并不意味着你只能有一个对象的实例。这*是一个定义,它定义了一个对象(或者说变量,因为我们在说C)。 – Gauthier

0

内存不是“拥有”的malloc()返回值和家庭C.。你可以做以下的事情:

  • 动态分配内存
  • 做一个指针指向该内存

它并没有真正意义地说“动态分配内存指针”。任何指针都可以指向任何对象(受到对齐和别名限制的限制),指针的存储持续时间是什么也没有区别。

+0

是的,谢谢你澄清它 – ratzip

0

请注意,它是指针,它是静态的,而不是它指向的内存。

static意味着两个不相关的事情:

  1. 给静态内存分配(内存在节目的开始分配,只有在程序结束释放)
  2. 给内部链接(不允许其他编译单元 - 模块 - 访问标识符这里的变量,可以是一个函数)

在代码中,1静态内存分配是无关紧要的,因为变量是全球反正这样已经拥有它。

然后,2.内部连接也不重要,因为你试图做的是在模块内部。

换句话说,person_p与您模块中的常用全局变量完全相同,您可以随心所欲地做任何事情。

它只是由这行代码定义的指针,因此您可以在其他位置动态分配内存,并根据需要将内存地址分配给person_p

相关问题