2012-09-25 62 views
0

p*p**p什么是内存分配(如果有的话)以及它们在何时写入char **p = NULL辨别指针和内存分配

+0

但我猜,当我写char * p = NULL时,如果这是一个局部变量,并且在全局变量区域中,则4个字节的内存(在32位可寻址系统中)被分配到堆栈中,如果这是全局变量。 –

回答

1

变量存储在堆栈上,如果不是static/global。这里没有堆内存分配。这只是(非有效的)内存地址。

+0

并且对于p和* p的记忆同样有效? –

+0

基本上,任何在函数中声明的变量都会自动分配到栈上,如果不是另有指定的话。如果你有'int p',它是整数存储在堆栈上。如果你有'int * p',它指向整数的无效指针,指向随机位置(如果不是在调试版本中),除非你手动指定应该指向的地方。 – keltar

4

p的大小取决于它的类型。 *p**p(和***p,**********p等)的大小是指针的大小:通常为4或8个字节,具体取决于您使用的是32位系统还是64位系统。

当您编写char **p = NULL时,您不会为char **p提供的内容分配额外内存。你只是用一个值来初始化变量在内存中的位置,而不是将它放在未初始化的位置。

至于其中它们是,它取决于上下文。如果这些是函数内的局部变量,那么当函数被调用时,它们将在堆栈上分配。如果它们是全局变量,它们将被赋予程序数据段中的位置。如果它们是struct的成员,那么它取决于您声明结构类型变量的位置。

0

当你编写char **p = NULL;时,p将会是一个局部变量(在大多数情况下,在堆栈上,如果它是在一个函数内部定义的话),或者一个全局变量(大多数情况下既不是堆栈也不是堆(从malloc()分配内存),如果它定义在所有函数之外)。

*p的位置未定义,因为您不能合法取消引用NULL指针。

这同样适用于**p,因为您首先需要删除p,这是非法的。

依此类推。