C++ 如何计算char**变量中char*的数量?
如何确定动态分配的C++ 如何计算char**变量中char*的数量?,c++,C++,如何确定动态分配的字符**中的元素数 例如: #include <iostream> #include <vector> #include "cstring" using namespace std; // here we create a 6 element char** char **func() { std::vector<std::string> vec = {"A", "Dynamically", "Allocated", "List",
字符**
中的元素数
例如:
#include <iostream>
#include <vector>
#include "cstring"
using namespace std;
// here we create a 6 element char**
char **func() {
std::vector<std::string> vec = {"A", "Dynamically", "Allocated", "List", "of", "Strings"};
char **arr = (char **) malloc((vec.size() + 1) * sizeof(char *));
for (int i = 0; i < vec.size(); i++) {
arr[i] = (char *) malloc(strlen(vec[i].c_str()) + sizeof(char));
strcpy(arr[i], vec[i].c_str());
}
}
// here is a failed attempt at writing a functions for counting elements in char**
int get_num_elements_in_char_star_star(char **c) {
// infinite while loop!
while(c){
// ??
cout << c << endl;
c++;
}
}
int main() {
char **c = func();
int x = get_num_elements_in_char_star_star(c);
cout << x << endl;
return 0;
};
但是我希望通过自动确定c
如何确定动态分配的字符**中的元素数
char**
变量中没有char*
对象char**
指向一个char*
对象(如果为空或悬空,则无)。这个char*
是否在一个数组中,以及这个数组有多大,不能仅从char**
变量来确定
有两种确定数组大小的典型方法:分别存储大小(或存储指向结束的指针)或选择特定值来表示数组的结束。后一种方法通常用于以null结尾的字符串
关于您的用例的更多信息:由于您似乎只创建一次结构,然后一次性销毁它,因此有一种更优化的分配方法:在一个大的块中分配所有行一次;然后将指针数组分配到每行的开头。这需要固定数量的分配,而不是相对于行数的线性分配 这还有一个额外的好处,即销毁函数不需要知道数组的大小。但是,对这些信息的需求并没有完全消除,因为您可能还希望在某个时候访问这些元素
p.S.
func
声明返回char**
,但它无法返回任何内容。程序的行为未定义
在C++中不要使用<代码> MalOC 。听起来像是一个。您试图解决的高级问题是什么?可能-我有一个
char**
需要free
ing,所以我需要知道有多少元素需要迭代char**
并释放每个char*
。如果不可能,我的退步是手动传入int size
,但我更希望函数自动确定char**
中的元素数。您正在解释您尝试的解决方案--您试图解决什么问题?这就是XY链接所指的。您是否需要将该char**
传递给接受char**
的函数,比如exec
函数族?可能char**
是作业的错误工具(目前尚不清楚)。为什么不是一个std::vector
?好的,我编辑了这个问题,试图解释X
。当你填充**arr
时,添加一个null的最后元素,这将指示数组的结尾,字符*字符串以null结尾。通过快速查看您的代码,您已经分配了额外的插槽(vec.size()+1)
,但是您没有对其进行初始化。指示由字符**
指向的字符指针数组结束的最常见方法是使用空指针。此方法用于main
@Peter>的每次调用。有趣的是,main
使用这两种方法。长度也单独存储在main
(通常称为argc
)的第一个参数中。是的,但我认为这是显而易见的;-)。
void free_c_char_star_star(char **c, int size) {
if (!c)
return;
for (int i = 0; i < size; i++) {
if(c[i]){
free(c[i]);
}
}
free(c);
}