我用指针已经有一段时间了,我想快速检查一下如何初始化一个整数指针?
a) int *tmpPtr = 0;
b) int *tmpPtr = null;
c) int a = 0;
int *tmpPtr = &a;
Run Code Online (Sandbox Code Playgroud)
编辑
到目前为止,感谢您的所有答案.有趣的是,如果我按如下方式对指针进行初始化,则mem :: copy操作正常.
int tmp = 0;
int *tmpPtr = &tmp;
Mem::Copy((void*)tmpPtr, basepointer(), sizeof(int));
Run Code Online (Sandbox Code Playgroud)
但是,如果我这样做:
int *tmpPtr = 0;
Mem::Copy((void*)tmpPtr, basepointer(), sizeof(int));
Run Code Online (Sandbox Code Playgroud)
然后我在mem :: copy期间遇到崩溃...
奇怪的!
pax*_*blo 37
简单的问题很好,我认为已经确定SO应该适用于所有级别,而不仅仅是精英.
null在C中没有(除非你自己定义).初始化为空指针可以通过以下两种方式之一完成:
int *p = 0;
int *p = NULL;
Run Code Online (Sandbox Code Playgroud)
如果你p在那之后取消引用,你很可能会遇到访问冲突(我认为根据标准它是未定义的行为,所以真的,任何事情都可能发生,直到并包括宇宙的完全毁灭 - 它甚至可能继续运行很好,但我不会依赖它).
要获得指向实数的指针,只需使用:
int a = 7;
int *p = &a;
Run Code Online (Sandbox Code Playgroud)
使用address-of运算符.
重新编辑,它根本不奇怪,你只需要想象它.让我们假设所有变量都是从内存位置100开始创建的,整数和指针的长度都是4个字节.将您的两种情况分解为最简单的形式:
int x = 2;
int *px = 0; int *px = &x;
+-----+ +-----+
px(100): | 0 | x(100) | 2 |
+-----+ +-----+
px(104) | 100 |
+-----+
Run Code Online (Sandbox Code Playgroud)
然后执行命令
*px = 7;
Run Code Online (Sandbox Code Playgroud)
试图改变指向的变量px.
在左侧,您将尝试将值7写入内存位置0.这是一件坏事; 很少有系统允许你在没有崩溃的情况下做到这一点,更少的系统将允许它没有任何不利影响(某些版本的HP-UX实际上工作正常).
在右边是应该发生的事情.拾取的值为px100,因此值7将写入该内存位置,x并按预期更改.
我经常发现图片(甚至原始的ASCII艺术图片,因为我不是鲁本斯或波提切利)有助于澄清这些概念.希望它能为你清理一下.
在编辑中回复您的问题:
当你这样做:
int tmp = 0;
int *tmpPtr = &tmp;
Mem::Copy((void*)tmpPtr, basepointer(), sizeof(int));
Run Code Online (Sandbox Code Playgroud)tmpPtr指向变量的地址,tmp它在堆栈中.请注意,tmpPtr指向的"安全区域"是tmp(在某些机器中为4,在其他机器中为2)的大小.如果要将大于sizeof(int)的字节复制到tmpPtr,则存在崩溃堆栈的风险.
当你这样做:
int *tmpPtr = 0;
Mem::Copy((void*)tmpPtr, basepointer(), sizeof(int));
Run Code Online (Sandbox Code Playgroud)tmpPtr的值为0,因此您将获得段故障.,这是操作系统提供的内存保护机制.例如,您不能写任何小于4K的虚拟地址.
您可以使用这些方法中的任何一种来执行此操作,但它是 NULL 而不是 null。我更喜欢 int *p = 0; 在 int *p = NULL 上;
为了消除我感觉的一些混乱,设置 int *p = 0 或设置 MyObject *p = 0; 导致同样的事情......如果您尝试取消引用它,空指针通常会使您的程序崩溃,尽管从技术上讲它是未定义的行为。C 中的示例与其他示例不同,因为您实际上将指针设置为指向设置为 0 的整数。
int *pNull = 0; int c = *pNull; // 未定义的行为。最有可能使你的程序崩溃! 整数a = 0; int *pInt = &a; int x = *pInt; // x 等于 0 a = 10; int y = *pInt; // y 等于 10