Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我们能在C语言中为静态变量动态分配内存吗?_C_Dynamic Memory Allocation_Static Variables - Fatal编程技术网

我们能在C语言中为静态变量动态分配内存吗?

我们能在C语言中为静态变量动态分配内存吗?,c,dynamic-memory-allocation,static-variables,C,Dynamic Memory Allocation,Static Variables,是否允许为静态变量动态分配内存,如下所示: #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)); } #包括 #

是否允许为静态变量动态分配内存,如下所示:

#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));
}
#包括
#包括
结构人
{
智力年龄;
整数;
};
静态结构person*person\u p=NULL;
int main()
{
person_p=(结构人*)malloc(10*sizeof(结构人));
}

上面的代码已经编译好了,但是它真的可以为静态变量动态分配内存吗?

我不明白为什么不能。即使静态意味着对象只能有一个实例,您仍然需要该对象的空间。但是请记住,任何
malloc
'd都需要是
免费的
'd,因此您需要在
main()
函数的末尾执行此操作。

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

相反,请注意,您可以在C中输入
malloc()
和family的返回值。

内存不是由指向它的指针“拥有”的。您可以执行以下操作:

  • 动态分配内存
  • 将指针指向该内存
说“为指针动态分配内存”是没有意义的

任何指针都可以指向任何对象(受对齐和别名限制),指针的存储持续时间没有区别。

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

static
表示两个不相关的东西:

  • 给出静态内存分配(在程序开始时分配的内存,仅在程序结束时释放)
  • 提供内部链接(不允许其他编译单元(模块)访问标识符。此处为变量,可以是函数)
  • 在代码中,1。静态内存分配是不相关的,因为变量无论如何都是全局的,因此已经有了它

    然后,2。内部链接也不重要,因为您要做的是在模块内部

    换言之,
    person\u p
    与模块中常见的全局变量完全相同,您可以根据需要执行任何操作


    这行代码只定义了指针,因此您可以在其他位置动态分配内存,并根据需要将内存地址分配给
    person\p

    更重要的是,您为什么要这样做?你知道函数接受参数!当您的程序增长时,您不想感到困惑!你所说的只有指针是静态的是什么意思?指针本身是静态的,但是你通过指针分配的内存既不知道也不关心这一点。1)在C中,不要强制转换malloc()(和函数族)的返回值2)始终检查malloc()(和函数族)的返回值(!=NULL)确保操作成功。“static”修饰符表示指针仅在当前文件中可见。这是一个链接时间属性。除此之外,它与任何其他“全局”变量类似。这是C代码。你的意思是“所以这个结构可能更适合于在一个包装函数或类中跟踪它的破坏。”啊,是的,你是对的。在这种情况下,您需要在main()函数的末尾释放您的结构。这是一个定义,它定义了一个对象(或者更确切地说是变量,因为我们说的是C)。为什么如果它是常量,它是无效的?@ratzip您不能更改
    const
    :-)
    const
    -ness在这里是不相关的,可能只是混淆了问题。@PaulR先生,我想提出
    const
    ,因为OP已经为静态变量编写了动态分配,所以我认为这会解决问题。如果我错了,请纠正我谢谢你花时间澄清答案。