简单的指针初始化

时间:2009-09-02 12:21:16

标签: c++ pointers

我使用指针已经有一段时间了,我想快速检查一下如何初始化一个整数指针?

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 ...

期间遇到了崩溃

怪异!

7 个答案:

答案 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指向“无处”;即,不是有效的存储位置。您必须首先为指针指定有效的内存位置,就像在上一个代码段中一样。