测试Char数组中的nullptr (c++)

Testing nullptr in Char Array (C++)

本文关键字:c++ nullptr Char 数组 测试      更新时间:2023-10-16

这让我很困扰,但是我试图为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)总是一个,所以如果没有标识乘法,你的代码绝对没有理由不能移植。