p
,*p
和**p
什么是内存分配(如果有的话)以及它们在何时写入char **p = NULL
?辨别指针和内存分配
回答
变量存储在堆栈上,如果不是static/global。这里没有堆内存分配。这只是(非有效的)内存地址。
并且对于p和* p的记忆同样有效? –
基本上,任何在函数中声明的变量都会自动分配到栈上,如果不是另有指定的话。如果你有'int p',它是整数存储在堆栈上。如果你有'int * p',它指向整数的无效指针,指向随机位置(如果不是在调试版本中),除非你手动指定应该指向的地方。 – keltar
p
的大小取决于它的类型。 *p
和**p
(和***p
,**********p
等)的大小是指针的大小:通常为4或8个字节,具体取决于您使用的是32位系统还是64位系统。
当您编写char **p = NULL
时,您不会为char **p
提供的内容分配额外内存。你只是用一个值来初始化变量在内存中的位置,而不是将它放在未初始化的位置。
至于其中它们是,它取决于上下文。如果这些是函数内的局部变量,那么当函数被调用时,它们将在堆栈上分配。如果它们是全局变量,它们将被赋予程序数据段中的位置。如果它们是struct
的成员,那么它取决于您声明结构类型变量的位置。
当你编写char **p = NULL;
时,p
将会是一个局部变量(在大多数情况下,在堆栈上,如果它是在一个函数内部定义的话),或者一个全局变量(大多数情况下既不是堆栈也不是堆(从malloc()
分配内存),如果它定义在所有函数之外)。
*p
的位置未定义,因为您不能合法取消引用NULL指针。
这同样适用于**p
,因为您首先需要删除p
,这是非法的。
依此类推。
- 1. 内存分配指针指向数组和指针指针
- 2. Ç - 指针内存分配
- 3. 双指针内存分配
- 4. Mips动态内存分配和指针
- 5. 内存分配(指针和堆栈)
- 6. 指针和C内存分配
- 7. 指针和动态内存分配
- 8. 内存分配和NULL指针
- 9. 三重指针和内存分配
- 10. 空指针,内存分配和Valgrind的
- 11. C中的内存分配和指针
- 12. 多分配和零指针分配内存概念
- 13. 如何在内存中分配一个指针内的指针?
- 14. 内存分配函数内指针指针
- 15. c指向指针内存分配的指针
- 16. 为三指针分配内存
- 17. 分配'this'指针的内存
- 18. python指针内存重新分配
- 19. 指针数组的C++内存分配
- 20. C++中的指针内存分配
- 21. 分配内存的指针结构
- 22. 将内存分配给双指针?
- 23. 指针内存分配问题
- 24. 分配内存到char指针
- 25. 指针阵列的内存分配
- 26. 对象指针的C++内存分配
- 27. 矢量指针内存分配矢量
- 28. cuda统一内存和指针别名
- 29. 指向C中的结构和内存分配的指针
- 30. 释放分配给指针的内存vs释放分配给指针指向的内存
但我猜,当我写char * p = NULL时,如果这是一个局部变量,并且在全局变量区域中,则4个字节的内存(在32位可寻址系统中)被分配到堆栈中,如果这是全局变量。 –