在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问题,我是否可以访问地址零?.
我正在使用py.test对我的python程序进行单元测试.我希望用python调试器以正常的方式调试我的测试代码(我的意思是代码中的pdb.set_trace())但是我无法使它工作.
将pdb.set_trace()放入代码中不起作用(引发IOError:在捕获输出时从stdin读取).我也尝试使用选项--pdb运行py.test但是如果我想探索在断言之前发生的事情,那似乎并不起作用.当断言失败时它会中断,从该行继续前进意味着终止程序.
有没有人知道一种方法来调试,或者调试和py.test只是不想在一起?
常量0用作C和C++中的空指针.但随着问题"指向一个特定的固定地址 "似乎有一些可能使用分配固定地址.在任何系统中,对于访问地址0的任何低级任务,是否有任何可能的需求?
如果有,那怎么解决0为空指针而全部?
如果没有,是什么让它确定没有这种需要?
案例
通常我发现自己正盯着一些看起来不正确的旧代码.看起来已经删除了某些东西(例如它有一个没有任何价值的循环,或者它创建了一个变量但没有使用它),或者某些东西很难理解.在这些情况下,我真的需要查看文件该部分的历史记录.不是所有的文件,只是那个部分或功能.
理想解决方案
简单的命令就像
git log books.cpp:10
Run Code Online (Sandbox Code Playgroud)
查找文件books.cpp的第10行(可能还有周围环境)的历史可能要求太多魔术,但你有没有想过如何解决这段历史的想法?
我试过的
尝试使用blame,然后在给定的行提交之前检查提交 - 重复它直到我看够了.但这是非常繁琐的工作.
您是否觉得需要此功能?你有办法实现它吗?分享您的体验!
我的Python脚本(对于todo列表)是从命令行启动的,如下所示:
todo [options] <command> [command-options]
Run Code Online (Sandbox Code Playgroud)
例如,某些选项不能一起使用
todo add --pos=3 --end "Ask Stackoverflow"
Run Code Online (Sandbox Code Playgroud)
将指定列表的第三个位置和结尾.同样
todo list --brief --informative
Run Code Online (Sandbox Code Playgroud)
会使我的计划混淆是简短或内容丰富.由于我希望拥有相当强大的选项控制功能,因此像这样的情况将是一堆,未来肯定会出现新的情况.如果用户传递了错误的选项组合,我想提供一条信息性消息,最好还有optparse提供的使用帮助.目前我用if-else语句处理这个问题,我发现它真的很丑陋而且很差.我的梦想是在我的代码中有这样的东西:
parser.set_not_allowed(combination=["--pos", "--end"],
message="--pos and --end can not be used together")
Run Code Online (Sandbox Code Playgroud)
并且OptionParser在解析选项时会使用它.
因为据我所知这不存在,我问SO社区:你如何处理这个问题?