为什么在结构体中声明char数组时无法进行初始化?

2026-04-28 03:522阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计440个文字,预计阅读时间需要2分钟。

为什么在结构体中声明char数组时无法进行初始化?

ctypedef struct book { int a; int b; char cb[100];} book;

为什么在结构体中声明char数组时无法进行初始化?

book makeBook(int a1, int b1, const char *cb1) { book b; b.a=a1; b.b=b1; // 由于没有strcpy函数,需要手动复制字符串 for (int i=0; cb1[i] !='\0'; i++) { b.cb[i]=cb1[i]; } b.cb[100 - 1]='\0'; // 确保字符串以null字符结尾 return b;}

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构建时会出错.

标签:char

本文共计440个文字,预计阅读时间需要2分钟。

为什么在结构体中声明char数组时无法进行初始化?

ctypedef struct book { int a; int b; char cb[100];} book;

为什么在结构体中声明char数组时无法进行初始化?

book makeBook(int a1, int b1, const char *cb1) { book b; b.a=a1; b.b=b1; // 由于没有strcpy函数,需要手动复制字符串 for (int i=0; cb1[i] !='\0'; i++) { b.cb[i]=cb1[i]; } b.cb[100 - 1]='\0'; // 确保字符串以null字符结尾 return b;}

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构建时会出错.

标签:char