当前位置 : 主页 > 编程语言 > c++ >

c – 为什么我不能初始化结构中的char数组?

来源:互联网 收集:自由互联 发布时间:2021-06-23
typedef struct book { int a; int b; char cb[100]; book(int a1, int b1, char* cb1) { a = a1; b = b1; cb = cb1; }} book; 为什么我不能将cb初始化为cb1以及如何在没有strcpy的情况下执行此操作? Why can’t I initialise
typedef struct book {

   int a;
   int b;
   char cb[100];

   book(int a1, int b1, char* cb1) {
       a = a1;
       b = b1;
       cb = cb1;
   }

} book;

为什么我不能将cb初始化为cb1以及如何在没有strcpy的情况下执行此操作?

Why can’t I initialise cb to cb1 and how to do it without strcpy?

cb1的类型为char *,但cb是一个C风格的数组,a.k.a.正式作为数组类型的对象(这个特别是char [100]). Objects of array type cannot be modified(即使它们是左值).如果您只希望浅拷贝而不是像您所说的那样strcpy(),那么您可以将cb定义为char *而不是char [100]:

typedef struct book {

   // ...
   char* cb;

   book(int a1, int b1, char* cb1) {
       // ...
       cb = cb1;
   }

} book;

但在大多数情况下,我不建议这样做,因为它会导致这个原始指针的不稳定管理.这被标记为[C],任何不使用std :: string的原因?

注意:虽然你没有标记这个[C 11]或更高版本,但是当你尝试使用上面的结构时,进一步的原因是不使用这样的原始指针或C风格的数组,可能是这样的:

int main() {
    book b(4, 2, "Hello");
    return 0;
}

一个非常标准的编译器,如Clang会立即让你知道1:

ISO C++11 does not allow conversion from string literal to ‘char *‘.

这种从字符串文字(the type of which is const char[])到char *的隐式转换即使在C 03和现在的completely removed since C++11.中也已弃用

1默认情况下,这至少会是一个警告,例如使用-pedantic-errors构建时会出错.

网友评论