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);
    }