如何正确使用nullptr
How to use nullptr properly?
目前,我正在阅读Byarne Stroustrup的" C 之旅"。重要的是:在"指针,数组和参考"上,他举了一个有关使用nullptr
这样的示例:
int count_x(char* p, char x)
// count the number of occurrences of x in p[]
// p is assumed to point to a zero-terminated array of char (or to nothing)
{
if (p == nullptr) return 0;
int count = 0;
for (; p != nullptr; ++p)
if (*p == x)
++count;
return count;
}
在我的主我的主要内容:
int main(){
char* str = "Good morning!";
char c = 'o';
std::cout << count_x(str, c) << std::endl;
return 0;
}
当我运行程序崩溃时,我会在line
上获得异常if (*p == x)
如果我将循环更改为这样:
for (; *p; p++)
if (*p == x)
++count;
现在一切正常!我正在使用MSVC 14.0。
- 我在
ideone
上运行的相同代码我没有例外,但是结果始终是0
,应该是3
:
https://ideone.com/x9bevx
p != nullptr
和 *p
执行非常不同的检查。
前者检查指针本身包含一个非编号地址。虽然后者检查指向的地址是否包含一个不是0的东西。一个在循环中显然是合适的,其中检查了缓冲区的内容,而另一个则没有。
。您的segfault是因为您永远不会停止阅读缓冲区(有效的指针在增加时不太可能产生NULL)。因此,您最终会访问超出缓冲区限制的方式。
请记住,您正在使用C语言功能。
您的问题在您的for
循环中。指针达到字符数组的最后一个元素指向数组的末端,而不是nullptr
。
想象您有一个字符数组,例如const char *a ="world"
和ptr
指向
+-----+ +---+---+---+---+---+---+
ptr :| *======> | w | o | r | l | d | |
+-----+ +---+---+---+---+---+---+
ptr 指向的最后一个元素是' '
,在您的for
中,您应该更改代码如下:
for (; *p != 0; p++) {
if (*p == x)
++count;
}
输出:3
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- CMake-按正确顺序将项目与C运行时对象文件链接
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 用于访问容器<T>数据成员的正确 API
- 如何使用Luacneneneba API正确读取字符串和表参数
- 如何使用用户输入在C++中正确填充2D数组
- node-gyp 在 macOS 上未正确链接库
- C++从另一个类访问公共静态向量的正确方法是什么
- 如何在 C 中正确使用 libiconv 使其不会报告"Arg list too long"?
- 如何在自删除后将对象设置为nullptr
- 为什么我的for循环不能正确获取argv
- 如何取消对nullptr的屏蔽,返回正确的对象
- AES加密到解密未正确输出
- RapidXML 节点在 try catch 块中具有正确的值,但它在块外为 nullptr
- nullptr = 节点分配不正确
- 如何正确使用nullptr
- C++17标准对在nullptr上调用delete有何规定
- 将“nullptr”分配给“bool”类型.哪个编译器是正确的
- "Read Access Violation: This was nullptr" 以为我分配正确...?
- 当使用const std::string&作为方法参数类型时,处理nullptr const char*的正确方法是什么?