字符串指针上的strcpy会导致错误

时间:2016-08-01 12:11:08

标签: c++

我已经阅读了很多关于这个主题的内容,我很困惑。

以前在C文件中工作的内容,而不是在cpp文件上工作:

 char  *builtinFunctions[20];

然后我在strcpy函数上得到错误:

void Intepreter::setBuiltIns(char *builtins)
{
   strcpy(builtinFunctions, builtins); // no matching function call to strcpy
}

我可能不明白这里的基础知识,但为什么在C ++中这不起作用(我需要使用 = 吗?)

strcpy(char *, const char*) = thats the structure

如果我将builtinFunctions更改为它的工作指针。

修改 在编辑之前成为const的原因是我在这里阅读: Why is conversion from string constant to 'char*' valid in C but invalid in C++

char *builtinFunctions[20];会在以下情况下发出警告:

builtinFunctions[0]="me";

它确实如此。我可以通过删除const来修复它。

1 个答案:

答案 0 :(得分:3)

这是一个指向char的指针数组。

char  *builtinFunctions[20];

所以你打电话

strcpy(builtinFunctions, builtins);

被视为strcpy(char **, char*),而不是strcpy(char *dest, const char *src)。所以你得到第一个参数类型的不匹配。

修改

因此,假设builtinFunctions是您希望填充的“一个单词数组”,void Intepreter::setBuiltIns(char *builtins)意味着要做到这一点,它的第一个参数是指向新传入单词的指针。 (而且你是以C风格的方式做这件事。好吧,由你决定。)

需要考虑的一些事项。

  1. 如果声明数组type arrName[N];,则声明数组的名称 单独使用而没有索引被视为类型的变量 type *arrName。如果您最初键入char *,那么 builtinFunctions本身属于char**类型。这就是你的原因 strcpy失败,但是strcpy(builtinFunctions[someIndex], builtins); 作品。

  2. 在调用strcpy之前,您应该考虑,如果您有 目的地空间分配。 builtinFunctions[someIndex]是 输入char *。它指向哪里?它是一个有效的指针 分配空间,或未定义行为地狱的门户strcpy会很乐意带你去吗?