gpt4 book ai didi

c - 静态变量 - C

转载 作者:太空宇宙 更新时间:2023-11-04 07:28:35 25 4
gpt4 key购买 nike

我正在编写一个程序,该程序共享一个全局声明的指向缓冲区的指针,程序中的所有函数都可以使用该指针。但是在某些情况下缓冲区不是必需的,因此指针将保留为 NULL,直到通过评估其 NULL 状态对其进行初始分配为止。我还需要一个全局声明的整数来防止缓冲区溢出并在必要时重新分配。仅仅因为我正在编写这个程序来练习,所以我希望在分配缓冲区时静态声明缓冲区大小整数。例如,此代码段将为缓冲区分配初始内存大小。

static char *buffer //(Globaly Declared) I know that the static part is implied I just want to put emphasis on it.

while(program has arguments to do)//Not actual code. I put this here to give an idea of where the statement is located
{
//None relavant code here..


if(buffer is necessary)//Not actual code. I put this here to give an idea of where the statement is located
{
if(buffer == NULL)
{
static unsigned int initial_value = 64;
static unsigned int *buffer_size = &inital_value;

if( (buffer = malloc(sizeof(char)*inital_value+1)) == NULL)
{
perror("MALLOC ERROR");
return 1;
}
}
}
}

我有几个关于它是如何工作的(如果是的话)以及静态内存通常如何工作的问题。

  • 我知道静态变量的生命周期是整个程序执行时间,但除非它们是全局声明的,否则它们的范围也是有限的。所以我的假设是需要一个指针来跟踪静态内存位置,但指针是否也需要是静态的?

  • 什么时候静态分配内存?当 if 语句为真时或程序启动时将简单地分配变量(如全局变量)

  • 是否为我处理了变量的释放?如果指针只是静态声明但它指向的内存实际上是动态分配的(例如我的缓冲区(静态字符*缓冲区)),我该怎么办?

  • 此外,这些问题听起来像是一个愚蠢的问题,但整数指针声明的无符号部分是否必要,我需要写 (inital_value+1) 还是我可以只写 inital_value+1(我认为这不重要这里因为 sizeof(char) 是一个,所以分配大小可以重写为 1*64+1) 并且终止 NULL 字节需要与数组的其余部分具有相同的类型(大小)。

最佳答案

指针是静态分配的,但它指向的内存是动态分配的,仅当您的 if 条件成立时。

“变量”(指针)的释放是为你处理的,但它指向的内存的释放不是为你处理的。您将需要释放任何您malloc的东西。

你是对的,你可以写 (initial_value+1) 或 initial_value + 1。终止 NULL 字节确实需要与数组的其余部分具有相同的大小(字节/字符)。在 C 中,所有数组元素的大小都相同。您可能会发现 (initial_value+1) 更好地反射(reflect)了这一点。

关于c - 静态变量 - C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16018312/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com