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];有三个指针的存储空间,字符存储在其他地方。