【问题标题】:strcpy: Use a char** variable in union as an argumentstrcpy:在 union 中使用 char** 变量作为参数
【发布时间】:2013-10-09 22:45:18
【问题描述】:

您好,我正在尝试将字符串复制到“word”变量中。 strcpy 需要 char* 类型,而我的“word”变量是 char** 类型。 我该如何实现? 我尝试了以下,但它不起作用。

struct command
{
  enum command_type type;
  char *input;
  char *output;
  union
  {
    struct command *command[2];
    char **word;
  } u;
};


main(){
...
char* charPtr = "abc";
struct command* cmdPtr;
strcpy(cmdPtr->u.word,charPtr);
...
}

【问题讨论】:

  • 您首先分配一些内存,因为其中的未定义行为很猖獗。
  • 首先,指向char 的指针不是字符串。如果有的话,它可能是一个字符串数组。其次,在您的代码 sn-p 中,您实际上并未初始化结构指针,因此它指向某个未定义的位置。当您使cmdPtr 指向某个有效位置时,您需要初始化结构中的指针in,包括数组中的指针。
  • 你只是想让程序编译,还是想也能运行?
  • @DavidHeffernan LOLz,这是一个真棒的问题。

标签: c string pointers struct strcpy


【解决方案1】:
struct command
{
    ...
    union
    {
        ...
        char **word;          // <-- requires memory to be associated explicitly 
    } u;
};
...
char* charPtr = "abc";
struct command* cmdPtr;           // <-- uninitialized variable
strcpy(cmdPtr->u.word,charPtr);   // <-- undefined behavior

cmdPtr 未初始化,这意味着取消引用此指针会调用 未定义的行为。即使您要为此struct 分配内存,您也必须为word 成员分配内存,否则strcpy 会尝试将字符串复制到无效内存,再次产生未定义的行为。

此外,您的main 的返回值未定义,word 被声明为char**,而strcpy 需要char* 类型的第一个参数。例如你可以这样做:

struct command cmd;
char myBuffer[255];
char* pBuffer = &myBuffer[0];
cmd.u.word = &pBuffer;
strcpy(*cmd.u.word, "abc");
printf("%s", *cmd.u.word);

或者不要让word指向本地指针:

cmd.u.word = malloc(sizeof(char*));
*cmd.u.word = &myBuffer[0];

...但是一旦你开始动态分配东西,也要小心正确地释放/释放它。

【讨论】:

  • 谢谢 LihO。是否可以使用 malloc 代替 myBuffer[255]?
猜你喜欢
  • 2019-11-04
  • 2018-08-28
  • 1970-01-01
  • 2020-03-04
  • 2014-02-03
  • 2021-05-27
  • 1970-01-01
  • 2020-01-21
  • 1970-01-01
相关资源
最近更新 更多