用单个 char* 填充向量,指向 C 中 char* 数组的基数

Posted

技术标签:

【中文标题】用单个 char* 填充向量,指向 C 中 char* 数组的基数【英文标题】:Filling vector with a single char*, pointing to the base of a char* array in C 【发布时间】:2020-10-23 15:17:12 【问题描述】:

假设我有一个char* 的基础char*[]。我知道数组中的每个char* 都是以null 结尾的,最后一个条目是NULL。

char* args[] = "foo", "bar", NULL;

如果我将其转换为char*,我应该得到"foo" 的起始地址。

char* p = (char*)args;

现在,我想用char* p 变量填充char* 的向量。这可能吗?

我的代码:

vector<char*> arguments;
bool null_terminated = true;
while(p!=NULL)

  if (null_terminated)
  
    arguments.push_back((char *) p);
    null_terminated = false;
  
  if ((*(char*)p) == '\0')
    null_terminated = true;
  p++;

但是,这似乎不起作用。有不同的解决方案吗?

【问题讨论】:

为什么不使用char** p "我应该得到"foo"的起始地址" 不,你不应该。现在p 指向"foo" (args[0]) 的指针,而不是"foo" @MikeCAT 哦,你的意思是我应该将参数转换为 char** 而不是 char* 没有。我的意思是p 的类型应该是char**,然后就不需要强制转换了。 那么我认为你应该简单地做for(char** p = args; *p != NULL; p++) arguments.push_back(*p);。这看起来像The XY Problem。为什么要使用char* p 【参考方案1】:

我认为使用reinterpret_cast 之类的东西可以使用char* p 填充向量,但这会很棘手、危险且无法保证。我不会推荐这个。

而不是这个,用args的非空元素填充向量,我认为你应该使用指针指向数组char** p的元素并使用它来遍历数组。

会是这样的:

for(char** p = args; *p != NULL; p++) 
    arguments.push_back(*p);

请注意,p 指向元素,取消引用的 *p 将是元素。

【讨论】:

以上是关于用单个 char* 填充向量,指向 C 中 char* 数组的基数的主要内容,如果未能解决你的问题,请参考以下文章

将字符串*分配给char * c ++ [关闭]

将 char* 推送到向量时出现问题,但在每次迭代后,它会将指向相同值缓冲区的指针添加到向量中 [已解决]

创建字符指针向量以指向字符串向量

如何检查指向C ++中有效地址的std :: next(x)?

用向量填充c ++中的简单动态数组[重复]

C 编程 - 释放一个用单引号填充的 char ** 和用双引号填充的区别 - valgrind