这让我很困扰,但是我正在尝试进行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)始终是一个,因此绝对没有理由不使用该标识乘法就无法移植您的代码。

关于c++ - 在Char Array(C++)中测试nullptr,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40427506/

10-16 15:06