声明为指针的每个变量都必须分配内存吗?
Posted
技术标签:
【中文标题】声明为指针的每个变量都必须分配内存吗?【英文标题】:Do every variable declared as pointer have to allocate memory? 【发布时间】:2014-01-01 01:21:48 【问题描述】:嗯,我是 C 新手。我想知道我的标题。
假设我声明指针如下,
char *chptr1;
char **chptr2;
int *i;
int **ii;
struct somestruct *structvar1;
struct somestruct **structvar2;
那么,
-
在将数据存储到其中之前,是否需要为每个变量分配内存?
当我不需要为它们分配内存时,是否有任何特殊情况?为此,我知道一个
char
指针,
strdup()
自己分配内存,我们不用太在意。
欢迎提出任何进一步的建议。
【问题讨论】:
还是需要关心strdup
[必须是free
d]
【参考方案1】:
首先需要了解的是,指针是用于存储内存地址或其他变量地址的变量。当您声明一个指针时,您正在为该指针分配内存,而不是为该指针指向的数据分配内存。 例如,
char *ptr; //Here you allocated memory for pointer variable.
ptr = malloc(sizeof(char)); // allocated memory for the data pointed by ptr
然后在使用内存后调用free()
free(ptr); // DE-allocates memory pointed by ptr and not variable ptr.
【讨论】:
【参考方案2】:指针指向事物。你让他们指向什么取决于你。
您可以让它们保持未初始化状态并且不使用它们:int * q;
这有点傻。
您可以让它们指向存在的东西:int x; int * q = &x;
你可以在其中存储动态分配内存的地址:int * q = malloc(29);
【讨论】:
+1 表示简单的答案,但最后一个例子看起来真的不像你应该在现实世界中使用的任何东西。int * q = malloc(sizeof(*q));
或 int * q = malloc(sizeof(int));
之类的东西似乎更合适。【参考方案3】:
我认为在 C 语言中,变量是一个带有内存的指针。纯指针没有内存。所以如果我们要存储一个数据,我们需要给指针一个内存。 当然,分配内存的方法有很多。
第一:
uint32_t x;
uint32_t *p = &x;
uint32_t array[10];
uint32_t *q = array;// equals to int *q = &array[0];
第二:
#define NUM_MACRO ((uint32_t) 10)
//we must free after we using. Or, perhaps we we will get a segment fault.
uint32_t *p = malloc(size(uint32_t) * NUM_MACRO);
【讨论】:
【参考方案4】:在将数据存储到其中之前,是否需要为每个变量分配内存?
这取决于用例。
假设您有一个可以输入用户名的程序,但如果没有输入用户名,则会显示硬编码值“默认用户”。现在你想传递这个名字。如果用户输入了一个名称,您可能已经为其分配了一些空间,并传递了该指针。如果没有给出用户名,则您指向的是您已经预定义的硬编码值,您不需要为其分配内存。
char const *Default = "Default User"
char *username = NULL;
username = getUser(); // here the name is allocated dynamically if it is present.
if(username == NULL)
username = Default;
在上述情况下,“默认用户”字符串的空间已被编译器保留在可执行文件中,因此您无需为其分配额外的内存,除非您想对其进行操作。
另一种情况可能是当您对低级设备进行编程时,您有一个指向该设备提供的硬件缓冲区的指针。在这种情况下,您也不会分配内存,但您仍会使用该缓冲区的指针,该缓冲区可能位于固定地址上。所以你会像这样使用指针(在 C64 上更改屏幕边框颜色的示例):
char *BorderColor = 0xd020;
*BorderColor = 0;
【讨论】:
以上是关于声明为指针的每个变量都必须分配内存吗?的主要内容,如果未能解决你的问题,请参考以下文章
C 语言二级指针作为输入 ( 自定义二级指针内存 | 为 二级指针 分配内存 - 存放 一维指针 | 为每个 一级指针 分配内存 | 释放二维指针内存 )
指针变量声明了后其默认值是啥呢,啥时候它的值才为“null”空呢?
C 语言结构体 ( 结构体中嵌套一级指针 | 分配内存时先 为结构体分配内存 然后再为指针分配内存 | 释放内存时先释放 指针成员内存 然后再释放结构头内存 )