p
,*p
和**p
有哪些内存分配(如果有的话)以及我写char **p = NULL
时的内存分配情况?
答案 0 :(得分:4)
p
的大小取决于其类型。 *p
和**p
(以及***p
,**********p
等)的大小是指针的大小:通常为4或8个字节,具体取决于您是否是使用32位或64位系统。
当你写char **p = NULL
时,你不会分配超出char **p
给你的额外内存。你只是用一个值初始化变量在内存中的位置,而不是让它没有初始化。
至于其中,它取决于上下文。如果它们是函数中的局部变量,则在调用函数时它们将被分配在堆栈中。如果它们是全局变量,它们将被赋予程序数据段中的位置。如果它们是struct
的成员,那么它取决于您声明结构类型变量的位置。
答案 1 :(得分:1)
变量存储在堆栈中,如果不是静态/全局的话。这里没有堆内存分配。它只是(无效)内存地址。
答案 2 :(得分:0)
当您编写char **p = NULL;
时,p
将成为局部变量(在大多数情况下,在堆栈中,如果它在函数内定义)或全局变量(在大多数情况下,既不在堆栈上也不在堆中(从malloc()
分配内存的地方),如果它在所有函数之外定义的话。)
*p
的位置未定义,因为您无法合法取消引用NULL指针。
同样适用于**p
,因为您首先需要解散p
,这是非法的。
等等。