Chars的初始化

时间:2014-05-01 16:18:13

标签: c++ arrays char

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

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

或至少像这样:

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

第二种方式更有意义,它应该对我有用,看到我愿意 在我希望它开始将字母移动到字母中的每个点的位置启动数组 阵列。

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

提前谢谢大家!

3 个答案:

答案 0 :(得分:1)

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

Char array declaration and initialization in C

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

尝试以下方法进行简单的字符串初始化:

char mychar[11] = "hello world";

或者...

char *mychar = "hello world";

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

答案 1 :(得分:1)

第一行:

char myChar[50];

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

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

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

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

可以工作,因为指定一个字符串文字的指针必须在初始化时完成。有一些潜在的例外,比如为{strong指定一个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;
}

您可以通过阅读以下参考文献中的帖子获益。它将为您提供有关如何将代码,变量,常量等分解为最终二进制文件的不同段的一些信息,以及为什么某些方法甚至没有意义。此外,阅读一些术语,例如整数文字,字符串文字,l值,r值等,这将是有益的。

祝你好运!

<强>参考


  1. 声明字符串与已分配字符串之间的区别,已访问2014-05-01,<https://stackoverflow.com/questions/16021454/difference-between-declared-string-and-allocated-string>

答案 2 :(得分:1)

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

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

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

这就是人们认为作业应该是自然的原因 - 但基本前提是错误的。 {{1}} 不是指针。这是一个数组。引用数组的名称会在一滴帽子处衰减成指针,但数组不是指针。