Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么在为一维数组重新分配指向字符的指针时显示错误,而二维数组工作正常?_C++ - Fatal编程技术网

C++ 为什么在为一维数组重新分配指向字符的指针时显示错误,而二维数组工作正常?

C++ 为什么在为一维数组重新分配指向字符的指针时显示错误,而二维数组工作正常?,c++,C++,看到这个问题,我完全混淆了一维和二维阵列 Example: char *ar[3] = { 'a', 'b' }; ar[1] = 'f'; // shows error that i could not assign char *games[3] = { "roadrash", "nfs", "angrybirds" }; games[0] = "hitman"; // works fine

看到这个问题,我完全混淆了一维和二维阵列

Example:


   char *ar[3] = { 'a', 'b' };
    ar[1] = 'f';     // shows error that i could not assign
    char *games[3] = {
        "roadrash",
        "nfs",
        "angrybirds"
    };
    games[0] = "hitman";   // works fine

代码中没有二维数组。它是指向
char*
的一维指针数组

该代码的所有行都是错误的

char *ar[3] = { 'a', 'b' };
char*
const char
是不兼容的类型。如果您想要声明一个包含3个字符的数组,那么

char ar[3] = { 'a', 'b' };
ar[1] = 'f';   // ar is now "af\0"
不能使用字符串文本初始化非常量
char*
。数组
games
指针在
char

char *games[3] = {
应该是

const char *games[3] = {
说得对。如果指针对象的类型不是
const char
,则初始化和后续赋值

games[0] = "hitman";
不正确,因为您无法将字符串分配给
char
处的指针,而只能分配给
const char
处的指针。字符串文字表示常量缓冲区,在这种情况下,是指针更改值并指向编译器预先分配的不同字符串。如果需要可变字符串,则需要分配足够大的缓冲区,以便将字符串复制到其中,例如

char *  games[3];
const char*  hitman = "hitman";
games[0] = new char[strlen(hitman)+1];
strcpy(games[0], hitman);
坦白说,如果我们谈论标准C++,那就是垃圾代码。强烈建议您使用标准字符串组件来操作字符串

// #include <string> assumed
// does all allocation inside of constructor
std::string  games[3] = {
    "roadrash",
    "nfs",
    "angrybirds"
};
// reallocated and copies storage as per to operator=
games[0] = "hitman";
/#包括
//在构造函数内部执行所有分配吗
std::弦乐游戏[3]={
“交通事故”,
“nfs”,
“愤怒的小鸟”
};
//根据向运营商重新分配和复制存储=
游戏[0]=“杀手”;

char*ar[3]={'a','b'};您应该会收到一条错误消息,如果没有,我强烈建议您更改编译器设置,直到看到错误消息为止。这将避免您浪费时间处理试图运行错误代码的后果。也许您的意思是
char ar[3]
(在这种情况下,您不会在下面的作业中得到错误)这个答案开始时是正确的,但是
games[0]=“hitman;”
在更改为
const char*
之后是正确的
games[0]
是一个指针,它可以指向const char数组
“杀手”
。不需要复制字符串,更不用说手动分配内存了。另外,您建议的代码包含缓冲区溢出(完全不这样做可以避免)。感谢大家的回答…..我仍然不清楚指向1D和2D数组的字符的指针是如何这样行为的..但这并没有显示任何错误,即char*ar[3]={“a”,“b”};ar[1]=“f”@M.M是的,因为我从90年代开始就没有写过这样的东西,我的手机在和我作战,我的坏:P@Rahul,代码中没有2D数组。它是指向char*的一维指针数组。可以指向某些字符序列。2D数组将有两个索引,例如
char ar[10][3]
;并且是30个字符的单调存储。char*ar[3];有三个指针的存储空间,字符存储在其他地方。