如何检查从 C++ 中的函数返回的空数组

How to check an empty array returned from a function in C++

本文关键字:函数 返回 数组 C++ 何检查 检查      更新时间:2023-10-16

我被要求编写一个接受字符数组、从零开始的位置和长度的函数。 它应该返回一个包含长度字符 (len) 的字符数组,从输入数组的起始字符开始

#include<iostream>
#include<vector>
#include<iterator> 
using namespace std;
char* lengthChar(char c[],int array_len, int start, int len)
{
char* v = new char[len];
if(start < 0 || len > array_len || (start + len - 1) >= array_len){
return NULL;
}
if((start + len) == start) 
{
return v;
}
copy(&c[start], &c[len+start], &v[0]);
return v;
}

我的问题是当我调用我的函数时

char* r = lengthChar(t,3, 1, 0);

通常基于我的实现,它应该返回一个指向空数组的指针。但是,我似乎无法验证这一点。当我做if(!r[0])时,它没有检测到它。我什至做到了

char s[] = {};
char* tt = &s[0];
if(r[0] == *tt)

还是没有。奇怪的是,当我coutr[0] 的值时,什么都没有打印。所以我不知道什么是真正的回报。如何验证它是否为空?

不要使用if(!r[0])来检查是否返回了NULL。 您想使用if(!r)if(r == NULL)直接与NULL进行比较。 这将告诉您字符串是否为空。 在返回NULL时执行if(!r[0])是未定义的行为,因此在尝试访问地址指向的内容之前,您肯定希望确保地址有效。


需要注意的另一件事是,在返回NULL的情况下,您的函数存在内存泄漏。 您需要在决定是否要返回NULLchar* v = new char[len];移动到。 您可以在 if 语句中调用delete [] v;,但这会使代码更加脆弱。

这里有一些事情发生。首先,我会替换它

if((start+len) == start)

用只是

if(len == 0) // if(!len) works too

还要注意的是,你不需要获取索引的地址,所以

&c[start] is the same thing as c + start

我会阅读 http://www.cplusplus.com/reference/algorithm/copy/以确保您了解正在传递的值是一个迭代器。

但其次,您的 char* v = new char[len] 语句正在调用未定义的行为。当您致电时

new char[len];

你只是告诉编译器你想给一个新的字符数组留出空间。请记住,std::cout 是一个函数。它将检测一个字符数组作为 c 字符串。这意味着 char 数组需要以空值终止。如果不是,您实际上只是在调用未定义的行为,因为您正在读取已分配但未初始化的位置的内存。

当您致电时

if(!r[0])

r[0] 在技术上是初始化的,所以它不是一个 nullptr,但它没有任何数据,所以它将在未定义的行为下计算为 true。

现在,如果你想让它更具体,我会用零填充数组

char* v = new char[len];
memset(v, 0, len);

现在你的字符是一个真正的"空"数组。

我认为这只是对"空"数组实际含义的误解。

最后,不要听那些说只使用 std::vector 的人。他们是绝对正确的,这是更好的实践,但在你拿出标准库的真正力量之前,最好了解这些类是如何工作的。只是说。