【问题标题】:Initializing a char * const array with data that is not known at compile time使用编译时未知的数据初始化 char * const 数组
【发布时间】:2020-08-10 06:24:10
【问题描述】:

如何使用非文字条目初始化 char * const 数组?条目来自标准输入。我试过了

char * const args[2] = (char * const *)calloc(2,1025);
sscanf(command,"%s %s ",args[0],args[1]);
/*args will be used later*/

如果没有强制转换,则会得到“无效的初始化程序”,如果有强制转换,则会得到“强制转换指定数组类型”。如果我完全避免使用 calloc,那么 args 的两个条目最终都为空。看来无论我做什么,char * const 类型的数组在声明后都无法填充值。

编辑:这是我的下一次尝试

char **args = (char **)calloc(1025,3);
/*Section A start*/
strcpy(args[0],(char*)"the");
strcpy(args[1],(char*)"thethe");
/*Section A end*/
sscanf(command,"%s %s ",args[0],args[1]);

问题是代码块的难题如下。如果我不包括 A 部分,那么 sscanf 之后的 args[0]、args[1] 错误地为空(显然,sscanf 不适用于空变量)。如果我确实包含了 A 部分,我会在 A 部分得到一个段错误。所以无论我转向哪个方向,我似乎都感到困惑。也许有一个替代方案,一些 B 节给出了 args[0], args[1] 一次性值,以便当 sscanf 出现在场景中时它们可以处于非空状态。

【问题讨论】:

  • 你是对的,它是 const 的原因意味着它不应该被修改并且可能通过 char * const args[2] = { 'a', 'b' };
  • @OmidCompSCI 'a' 是一个字符,而"a" 可以衰减为指向字符的指针。
  • 好吧,虽然这里所说的一切都是真的,但我想知道你为什么要这样做?你的目标是什么?我猜有更好的方法来做你想做的事,但我需要了解最终目标是什么。
  • @FrankMerrow execvp 需要确切的类型 char * const[]。稍后在我的代码中,我将调用 execvp(args[0],args)。
  • @Displayname X 类型的 const 数组与指向 X 类型值的 const 的指针不同。

标签: c arrays char constants


【解决方案1】:

最后剩下的修复是用此处看到的 B 部分替换 A 部分:

char **args = (char **)calloc(1025,3);
/*Section B start*/
args[0] = (char*)malloc(1025);
args[1] = (char*)malloc(1025);
/*Section B end*/
sscanf(command,"%s %s ",args[0],args[1]);

【讨论】:

  • sizeof(char*) 没有出现在第一个calloc 中仍然令人怀疑。
  • 它应该像calloc 零初始化内存一样工作。但是您应该使用 calloc(3, sizeof(char*)) 代替,因为您只分配了一个由 3 个字符指针组成的数组。此外,除非您知道 command 不超过 1024,否则必须限制 sscanf 中的长度,例如 "%1024s %1024s ",以防止可能的缓冲区溢出。
猜你喜欢
  • 2011-04-18
  • 1970-01-01
  • 1970-01-01
  • 2016-11-21
  • 1970-01-01
  • 2017-08-11
  • 1970-01-01
  • 2012-11-17
  • 1970-01-01
相关资源
最近更新 更多