我使用指针已经有一段时间了,我想快速检查一下如何初始化一个整数指针?
a) int *tmpPtr = 0;
b) int *tmpPtr = null;
c) int a = 0;
int *tmpPtr = &a;
修改
到目前为止,感谢您的所有答案。有趣的是,如果我进行初始化 指针如下,然后mem :: copy操作正常。
int tmp = 0;
int *tmpPtr = &tmp;
Mem::Copy((void*)tmpPtr, basepointer(), sizeof(int));
但是,如果我这样做:
int *tmpPtr = 0;
Mem::Copy((void*)tmpPtr, basepointer(), sizeof(int));
然后我在mem :: copy ...
期间遇到了崩溃怪异!
答案 0 :(得分:37)
简单的问题很好,我认为已经确定SO适用于所有级别,而不仅仅是精英。
C中没有null
(除非您自己定义)。初始化为空指针可以通过以下两种方式之一完成:
int *p = 0;
int *p = NULL;
如果您在此之后取消引用p
,则可能会出现访问冲突(我认为根据标准,它是未定义的行为,所以实际上,任何事情都可能发生,包括完全毁灭宇宙 - 它甚至可以继续运行良好,但我不会依赖它。)
要获得指向实数的指针,只需使用:
int a = 7;
int *p = &a;
使用address-of运算符。
重新编辑,它根本不奇怪,你只需要想象它。让我们假设所有变量都是从内存位置100开始创建的,整数和指针的长度都是4个字节。将您的两种情况分解为最简单的形式:
int x = 2;
int *px = 0; int *px = &x;
+-----+ +-----+
px(100): | 0 | x(100) | 2 |
+-----+ +-----+
px(104) | 100 |
+-----+
然后执行命令
*px = 7;
试图更改px
指向的变量。
在左侧,您将尝试将值7写入内存位置0.这是一件坏事;很少有系统允许你这样做而不会崩溃,更少的系统会允许它完全没有任何不利影响(某些版本的HP-UX实际上工作正常)。
在右侧是应该发生的事情。从px
获取的值为100,因此值7将写入该内存位置,并按预期更改x
。
我经常发现图片(甚至原始的ASCII艺术图片,因为我不是鲁本斯或波提切利)有助于澄清这些概念。希望它能为你清理一下。
答案 1 :(得分:6)
在编辑中回复您的问题:
执行此操作时:
int tmp = 0;
int *tmpPtr = &tmp;
Mem::Copy((void*)tmpPtr, basepointer(), sizeof(int));
tmpPtr指向变量tmp
的地址,它位于stack。请注意,tmpPtr指向的“安全区域”是tmp
的大小(在某些机器中为4,在其他机器中为2)。如果要将大于sizeof(int)的字节复制到tmpPtr,则可能会导致堆栈崩溃。
执行此操作时:
int *tmpPtr = 0;
Mem::Copy((void*)tmpPtr, basepointer(), sizeof(int));
tmpPtr的值为0,因此您将获得segment fault.,这是操作系统提供的内存保护机制。例如,您不能写任何小于4K的virtual address。
答案 2 :(得分:1)
你可以用任何方式做到这一点,除非它是NULL而不是null。我更喜欢int * p = 0; over int * p = NULL;
为了消除我感觉到的一些混淆,设置int * p = 0或设置MyObject * p = 0;导致同样的事情....一个空指针,如果你尝试取消引用它,通常会崩溃你的程序,虽然从技术上讲它是未定义的行为。您在C中的示例与其他示例不同,因为您实际上将指针设置为指向设置为0的整数。
int *pNull = 0; int c = *pNull; // Undefined behavior. Most likely crashing your program! int a = 0; int *pInt = &a; int x = *pInt; // x equals 0 a = 10; int y = *pInt; // y equals 10
答案 3 :(得分:1)
初始化指针,指针指向空指针常量。值为0的任何常量表达式都用作空指针常量。在C NULL 宏按惯例使用。
答案 4 :(得分:1)
我只是刷新了我的指针知识,偶然发现了这一点。
int *tmpPtr = 0;
我觉得这样更容易想到:
int *tmpPtr ;
tmpPtr = 0 ;
我相信'以上两行相当于那一行。
所以基本上要取消引用的地址设置为0或NULL
。
答案 5 :(得分:0)
C中没有null
个关键字(至少在ANSI C99中)。你可以使用a)或c)。
在c)中你不会用null初始化指针,你将用局部变量的地址初始化它。
答案 6 :(得分:0)
该行
int *tmpPtr = 0;
将指针值初始化为0,因此tmpPtr指向“无处”;即,不是有效的存储位置。您必须首先为指针指定有效的内存位置,就像在上一个代码段中一样。