相关疑难解决方法(0)

为什么地址零用于空指针?

在C(或C++)中,指针是特殊的,如果它们的值为零:我建议在释放内存后将指针设置为零,因为这意味着再次释放指针并不危险; 当我调用malloc时,如果它无法获取内存,则返回一个值为零的指针; 我一直用if (p != 0)它来确保传递的指针是有效的,等等.

但是,由于内存寻址从0开始,因此有效地址不是0吗?如果是这样的话,0如何用于处理空指针?为什么不是负数而是null?


编辑:

一堆好的答案.我将总结在所表达的答案中所说的内容,因为我自己的思想解释了它,并希望如果我误解,社区将纠正我.

  • 就像编程中的其他一切一样,它是一种抽象.只是一个常量,与地址0并不真正相关.C++ 0x通过添加关键字来强调这一点nullptr.

  • 它甚至不是地址抽象,它是C标准指定的常量,只要它确保它永远不等于"真实"地址,编译器就可以将它转换为其他数字,如果0不是,则等于其他空指针用于平台的最佳价值.

  • 如果它不是抽象,早期就是这种情况,系统使用地址0,程序员不受限制.

  • 我承认,我的负面数字建议是一个狂热的头脑风暴.对地址使用有符号整数有点浪费,如果它意味着除了空指针(-1或其他)之外,值空间在产生有效地址的正整数和刚刚浪费的负数之间均匀分配.

  • 如果任何数字总是可以由数据类型表示,那么它就是0.(也可能是1.我想的是一位整数,如果是无符号则为0或1,或者只有符号的有符号位,或两位整数,将是[-2,1].但是你可以只得0为空,1是内存中唯一可访问的字节.)

还有一些东西在我的脑海里没有得到解决.Stack Overflow问题指向特定固定地址的指针告诉我,即使0表示空指针是抽象,其他指针值也不一定.这导致我发布另一个Stack Overflow问题,我是否可以访问地址零?.

c c++ memory pointers

119
推荐指数
6
解决办法
3万
查看次数

以下哪个会创建空指针?

标准说,取消引用空指针会导致未定义的行为.但是什么是"空指针"?在下面的代码中,我们称之为"空指针":

struct X
{
  static X* get() { return reinterpret_cast<X*>(1); }
  void f() { }
};

int main()
{
  X* x = 0;
  (*x).f(); // the null pointer?  (1)

  x = X::get();
  (*x).f(); // the null pointer?  (2)

  x = reinterpret_cast<X*>( X::get() - X::get() );
  (*x).f(); // the null pointer?  (3)

  (*(X*)0).f(); // I think that this the only null pointer here (4)
}
Run Code Online (Sandbox Code Playgroud)

我的想法是,只有在最后一种情况下才会取消引用空指针.我对吗?根据C++标准,编译时空指针和运行时之间是否存在差异?

c++ null-pointer dereference

14
推荐指数
3
解决办法
9907
查看次数

C中的内存起始位置

我正在研究给定进程的内存布局.我注意到每个进程的起始内存位置不是0.在这个网站上,TEXT从0x08048000开始.一个原因可以是使用NULL指针区分地址.我只是想知道是否还有其他好的理由?谢谢.

c memory memory-layout

7
推荐指数
1
解决办法
1518
查看次数

访问 C 结构数组

我正在尝试学习访问结构数组。以下代码可以编译,但执行时出现段错误(核心转储)。我做错了什么?

#include <stdio.h>                        
#include <string.h>

// data structure
struct book {
  int     book_id;                     // book id
  int     (*ptFunc) ( struct book  );  // addr of printBook function
  char    title[50];                   // book title
  char    author[50];                  // book author
};

struct book aBooks[10];

/*************************************************************************
 *                                  main                                 *
 *************************************************************************/

void printBook ( struct book aBooks[], int id ) {
  printf ( "book_id       : %d\n", aBooks[id].book_id );  // access to struct
  printf ( "func addr     : %p\n", aBooks[id].ptFunc  );  // pointer to funcion
  printf …
Run Code Online (Sandbox Code Playgroud)

c arrays segmentation-fault

-2
推荐指数
1
解决办法
91
查看次数