为什么不能在结构中初始化char数组?

时间:2018-09-07 05:40:11

标签: c++ string struct

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的情况下怎么办?

3 个答案:

答案 0 :(得分:4)

  

为什么我不能将cb初始化为cb1,并且在没有strcpy的情况下怎么办?

cb1的类型为char*,但是cb是C样式的数组,也就是形式为数组类型的对象(具体来说是一个char[100])。 Objects of array type cannot be modified(即使它们是 lvalue s)。如果您只想浅拷贝,而不是像您所说的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不允许从字符串文字转换为'char *'。

字符串文字the type of which is const char[])到char*的隐式转换甚至在C ++ 03中也已弃用,现在completely removed since C++11.

1 默认情况下,这至少将是一个警告,并且在例如使用-pedantic-errors构建时将是一个错误。

答案 1 :(得分:1)

您在问为什么不能在char[]中初始化struct

您的问题的答案是因为:

数组是C语言中的``二等公民'';这种偏见的一个结果是,您无法将其分配给他们。数组在C和C ++中不是可修改的lvalue

C和C ++都是不同的编程语言。在C ++中应避免使用普通的旧C样式数组,因为C ++语言提供了便利且更好的替代方法。

由于此问题已被标记为C ++问题,惯用的解决方案是在C ++中使用std::string

因此,如果您执行以下操作会更好:

#include <string>

struct book {

   int a;
   int b;
   std::string cb;

   book(int a1, int b1, std::string cb1) {
       a = a1;
       b = b1;
       cb = cb1;
   }

} book;

答案 2 :(得分:1)

您的帖子被标记为[C ++],但未使用现代习语。这是允许简单初始化的版本。通过使用std::string,可以避免复杂的初始化。

请注意,您也不必重命名参数。

使用std::string

#include <iostream>
#include <string>

class book {
public:
   int a;
   int b;
   std::string cb;

   book(int a, int b, const char* cb)
    : a(a),
      b(b),
      cb(cb)
    {
    }
};

int main()
{
    using namespace std;
    const book test(5, 17, "Woot!");
    cout << "Hello " << test.cb << endl; 

    return 0;
}

输出

$main
Hello Woot!