小编Joe*_*oel的帖子

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

在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万
查看次数

以某种方式使用py.test时,我可以使用python调试器进行调试吗?

我正在使用py.test对我的python程序进行单元测试.我希望用python调试器以正常的方式调试我的测试代码(我的意思是代码中的pdb.set_trace())但是我无法使它工作.

将pdb.set_trace()放入代码中不起作用(引发IOError:在捕获输出时从stdin读取).我也尝试使用选项--pdb运行py.test但是如果我想探索在断言之前发生的事情,那似乎并不起作用.当断言失败时它会中断,从该行继续前进意味着终止程序.

有没有人知道一种方法来调试,或者调试和py.test只是不想在一起?

python unit-testing pdb

64
推荐指数
5
解决办法
3万
查看次数

我可以访问地址零吗?

常量0用作C和C++中的空指针.但随着问题"指向一个特定的固定地址 "似乎有一些可能使用分配固定地址.在任何系统中,对于访问地址0的任何低级任务,是否有任何可能的需求?

如果有,那怎么解决0为空指针而全部?

如果没有,是什么让它确定没有这种需要?

c c++ memory pointers

53
推荐指数
8
解决办法
7905
查看次数

查找与文件某个部分相关的git提交

案例
通常我发现自己正盯着一些看起来不正确的旧代码.看起来已经删除了某些东西(例如它有一个没有任何价值的循环,或者它创建了一个变量但没有使用它),或者某些东西很难理解.在这些情况下,我真的需要查看文件该部分的历史记录.不是所有的文件,只是那个部分或功能.

理想解决方案
简单的命令就像

git log books.cpp:10
Run Code Online (Sandbox Code Playgroud)

查找文件books.cpp的第10行(可能还有周围环境)的历史可能要求太多魔术,但你有没有想过如何解决这段历史的想法?

我试过的
尝试使用blame,然后在给定的行提交之前检查提交 - 重复它直到我看够了.但这是非常繁琐的工作.

您是否觉得需要此功能?你有办法实现它吗?分享您的体验!

git

8
推荐指数
1
解决办法
382
查看次数

如何处理不能一起使用的选项(使用OptionParser)?

我的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社区:你如何处理这个问题?

python optparse

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

标签 统计

c ×2

c++ ×2

memory ×2

pointers ×2

python ×2

git ×1

optparse ×1

pdb ×1

unit-testing ×1