我一直在想,为什么我不能这样写我的代码:
char myChar[50];
myChar = "This is a really cool char!";
或至少像这样:
char myChar[50];
myChar[0] = "This is a really cool char!";
第二种方式更有意义,它应该对我有用,看到我愿意 在我希望它开始将字母移动到字母中的每个点的位置启动数组 阵列。
有谁知道为什么C ++不这样做?你能告诉我背后的原因吗? 正确的方法吗?
提前谢谢大家!
答案 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值等,这将是有益的。
祝你好运!<强>参考强>
<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}} 不是指针。这是一个数组。引用数组的名称会在一滴帽子处衰减成指针,但数组不是指针。