【问题标题】:Initialization of Chars [duplicate]字符的初始化[重复]
【发布时间】:2014-06-18 04:06:54
【问题描述】:

我一直在想,为什么我不能这样写我的代码:

char myChar[50];
myChar = "This is a really cool char!";

或者至少是这样的:

char myChar[50];
myChar[0] = "This is a really cool char!";

对我来说,第二种方式更有意义,因为我会 在我希望它开始将字母移动到 数组。

有人知道为什么 C++ 不这样做吗?你能告诉我背后的原因吗 正确的做法?

提前谢谢大家!

【问题讨论】:

  • 在第二个代码示例中,您尝试将字符串文字分配给 char,这使得 有意义。
  • 一般来说,C++ 数组存在 C 数组的限制,如果你想要更高级的东西(比如赋值),请使用相应的 STL 类 - 在这种情况下为 std::string
  • @CaptainObvlious:在已经知道为什么它不起作用的情况下,当然。但是,断章取义,没有什么特别的理由表明该语言不能被设计成允许这样做。事实上,当您查看std::string(这是本机字符串应该 完成的方式)时,语法几乎完全相同:字节会自动为您复制。那么它又如何使“有意义”呢?

标签: c++ arrays char


【解决方案1】:

第一行:

char myChar[50];

...在堆栈上分配 50 个字符的数组。第二行:

myChar = "This is a really cool char!";

正在尝试将 const 静态字符串(存在于代码文本段的只读内存中)分配给数组开头的地址。 这是一个不兼容的 LVALUE/RVALUE 匹配/赋值。这种方法:

const char* myChar = "This is a really cool char";

会起作用,因为必须在初始化时分配指向字符串字面量的指针。有潜在的例外情况,例如将const char* 指针分配给字符串字面意思是这样的:

/*******************************************************************************
 * Preprocessor Directives
 ******************************************************************************/
#include <stdio.h>


/*******************************************************************************
 * Function Prototypes
 ******************************************************************************/
const char* returnErrorString(int iError);


/*******************************************************************************
 * Function Definitions
 ******************************************************************************/
int main(void) {
   int i;
   for (i=(-1); i<3; i++) {
      printf("i=%d - Error String:%s\n", returnErrorString(i));
   }
   return 0;
}

const char* returnErrorString(int iError) {
   const char* ret = NULL;
   switch (iError) {
      case 0:
         ret = "No error";
         break;
      case (-1):
         ret = "Invalid input";
         break;
      default:
         ret = "Unknown error";
         break;
   }
   return ret;
}

您可能会受益于阅读下面我的参考资料中的帖子。它将为您提供一些关于代码、变量、常量等如何被分解为最终二进制文件的不同部分的信息,以及为什么某些方法甚至没有意义。此外,阅读一些术语,如整数文字、字符串文字、左值、右值等,也是有益的。

祝你好运!

参考文献


  1. 声明字符串和分配字符串的区别,2014-05-01,&lt;https://stackoverflow.com/questions/16021454/difference-between-declared-string-and-allocated-string&gt;

【讨论】:

  • 非常感谢!这很有帮助!
  • @AbsoluteZ3r0 很高兴它有帮助。总是很高兴知道某人从 SO 中获得进步/学习的好处。干杯!
【解决方案2】:

您必须在数组声明中初始化字符数组。实际上没有理由不这样做,好像没有,你的数组将包含垃圾值,直到你初始化它。我建议你看看这个链接:

Char array declaration and initialization in C

另外,你正在分配一个大小为 50 的 char 数组,但只使用了 28 个元素,这在我看来是一种浪费......

尝试以下简单的字符串初始化:

char mychar[11] = "hello world";

或者……

char *mychar = "hello world";

我希望这会有所帮助...

【讨论】:

  • 谢谢,这是完美的。我一直在寻找这样的解释!
【解决方案3】:

如果您想从整体上考虑这一点,原因是myChar 不是字符串——它只是一个字符数组。因此"FooGHBar"char [50] 是完全不同的类型。在某种意义上相关,但实际上并不相关。

现在有些人可能会说,“但是"FooBar" 是一个字符串,而char [50] 实际上也只是一个字符串。”但这是假设myChar"FooBar" 相同,但事实并非如此。它还假设编译器理解char[50]char* 都是指向字符串的指针。编译器不明白这一点。那些与字符串无关的地方可能存储着任何形式的东西。

“但是myChar只是一个指针?”

这就是为什么人们认为分配应该是自然而然的事情的原因——但基本前提是错误的。 myChar不是指针。它是一个数组。引用数组的名称会在落下时衰减为指针,但数组不是指针。

【讨论】:

    猜你喜欢
    • 2016-11-20
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    • 2010-12-03
    • 2013-07-05
    • 2017-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多