如何检查从 C++ 中的函数返回的空数组
How to check an empty array returned from a function in C++
我被要求编写一个接受字符数组、从零开始的位置和长度的函数。 它应该返回一个包含长度字符 (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)
还是没有。奇怪的是,当我cout
r[0] 的值时,什么都没有打印。所以我不知道什么是真正的回报。如何验证它是否为空?
不要使用if(!r[0])
来检查是否返回了NULL
。 您想使用if(!r)
或if(r == NULL)
直接与NULL
进行比较。 这将告诉您字符串是否为空。 在返回NULL
时执行if(!r[0])
是未定义的行为,因此在尝试访问地址指向的内容之前,您肯定希望确保地址有效。
需要注意的另一件事是,在返回NULL
的情况下,您的函数存在内存泄漏。 您需要在决定是否要返回NULL
后char* 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 的人。他们是绝对正确的,这是更好的实践,但在你拿出标准库的真正力量之前,最好了解这些类是如何工作的。只是说。
- 从函数返回const char*数组
- 检查函数返回类型是否与STL容器类型值相同
- 从 c 或 cpp 系列子函数返回到主函数
- 从函数返回任意简单类型的数据
- 警告:在函数返回类型 [-Wignore 限定符] 时忽略类型限定符
- 从 C++ 中的函数返回数组地址问题
- VirtDisk.h QueryChangesVirtualDisk() 函数返回 RangeCount 为 0
- 为什么glGetSubroutineIndex为不同的函数返回相同的值?
- 在 c++ 中将函数返回类型指定为模板参数
- 从封装在对象中的函数 C++ 返回时为空的列表
- 为什么向量内部的指针在从函数返回时会发生变化?
- 函数返回的 rvalue 引用(表达式)是 xvalue - 但没有标识?
- 程序中的布尔函数返回输入的范围无论如何都是无效的
- 寿命延长从函数返回引用
- 程序不向函数返回值
- 字符串函数返回奇怪的值
- 类的大问题,以及从空函数c++返回
- 为什么在尝试测量函数返回所需的时间时,我的运行时编号是错误的?
- C++二叉搜索树模板从函数返回节点
- NVCC 错误:string_view.h:constexpr 函数返回是非常量