测试Char数组中的nullptr (c++)
Testing nullptr in Char Array (C++)
这让我很困扰,但是我试图为c++编程语言练习做一个练习,问题是简单地找到一个char[]数组的大小和长度,我做到了,但是当我试图验证它是一个有效的指针时,它遇到了问题:
void size_length(const char* p, int& size, int& length)
{
//I don't know why, but this causes all entries to return 0
if (!p) size = 0; length = 0; return;
//Copy the pointer, as I want the original intact
const char* cp = p;
while (*cp++) ++size; ++length;
++size; //Null character
size *= sizeof(char); //For portability
}
int main()
{
char* str{ new char[15]{"A short string"} };
int s{ 0 }, l{ 0 };
size_length(str, s, l);
cout << "Size: " << s << endl << "Length: " << l << endl;
}
在size_length()的第二行中,当我尝试验证我有一个合法的指针时,例如如果我传递了一个自由存储nullptr,它会导致所有尝试注册为无效并返回0,0(我在一行中放置了几个语句以节省空间)。我尝试了语句的变体,传递了许多不同的东西,但它都返回0,0。但是,如果我删除这一行,程序就可以正常工作!
如果有人能告诉我这是我做错了和/或为什么我不应该在显然这个特定的情况下测试nullptr(我试图通过测试有效性来做正确的的事情),我会很感激。
首先,您应该注意:
if (!p) size = 0; length = 0; return;
等价于:
if (!p)
size = 0;
length = 0;
return;
换句话说,它将length
归零并返回 !
如果你的目的是使这三个语句都是条件语句,你需要:
if (!p) { size = 0; length = 0; return; }
等于:
if (!p) {
size = 0;
length = 0;
return;
}
同上:
while (*cp++) ++size; ++length;
,在循环结束后,一旦, ++length
当前执行。
并且,作为题外话,我喜欢你的声明"为了可移植性":-)根据定义,sizeof(char)
总是一个,所以如果没有标识乘法,你的代码绝对没有理由不能移植。
相关文章:
- 如何在自删除后将对象设置为nullptr
- 如何取消对nullptr的屏蔽,返回正确的对象
- C++ - "!pointer"和"pointer == nullptr"的区别?
- 将指针设置为"nullptr"并不能防止双重删除?
- 创建具有 new in 函数和"this is nullptr"异常的对象
- 为什么我的节点在我设置后被设置为 nullptr = 新节点?
- C++默认情况下,指针类型数组的元素是否保证初始化为 nullptr?
- 在 nullptr 上调用无状态类的非静态成员函数是否合法?
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 哈希映射使用 nullptr c++ 初始化节点的动态数组
- wx通用目录控制错误"wxTheFileIconsTable was nullptr"
- 当设置为 const 变量时使用 nullptr
- 为什么"weak.lock()"返回"nullptr" "auto weak=std::make_shared<int>(42);"的定义?
- 检查类方法中是否(此 == nullptr)
- C++98,但叮叮当当地说使用nullptr?
- 为什么调试器引发"read access violation. this was nullptr"异常?
- 检查模板中 nullptr 的函数指针,了解任何类型的可调用对象
- 检查nullptr是否100%保护内存布局不受segfault影响
- 向unordered_map添加unique_ptr时'this was nullptr'
- 使用 nullptr 作为 std::unordered_map 的键有什么后果吗?