两个暗淡的数组,指向它的一部分和堆栈损坏
Two dim array, pointer to part of it and stack corruption
为什么下一个代码给我围绕变量x的堆栈已损坏?
char x[1][21];
char *ch = x[1];
strcpy(ch,"12345678901234567890");
for (int i = 0; i < 20; i++)
cout << i << ": " << &x[1][i] << " " << x[1][i] << endl;
输出:
0: 12345678901234567890 1
1: 2345678901234567890 2
...
char x[1][21];
是一个 1 x 21 的矩阵。
char *ch = x[1];
行正在访问第二行。所以这已经超出了界限。
尝试将其更改为:
char x[2][21];
char *ch = x[1];
strcpy(ch,"12345678901234567890");
for (int i = 0; i < 20; i++)
cout << i << ": " << &x[1][i] << " " << x[1][i] << endl;
或
char x[1][21];
char *ch = x[0];
strcpy(ch,"12345678901234567890");
for (int i = 0; i < 20; i++)
cout << i << ": " << &x[0][i] << " " << x[0][i] << endl;
char *ch = x[1]; //error - index out of range
这是错误的。你应该写:
char *ch = x[0]; //ok - index within range
因为x
被声明为char x[1][21]
这意味着0
是第一维的唯一有效索引。 1
超出范围。
您声明了一个单元素数组,然后访问它的第二个元素(索引 1,第一个元素是索引 0(。
相关文章:
- 为什么会发生堆损坏
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 平均图像时图像损坏
- 如何针对特定情况调试和修复此双自由内存损坏问题
- C++:如何使函数只返回作为列表一部分的字符串
- std::sort()函数无法对向量的一部分进行排序
- 为什么C中的通用链表中存储的数据已损坏
- gdb错误:Backtrace已停止:上一帧与此帧相同(堆栈已损坏?)
- C++双重释放或损坏(out)
- 捕获标准输出以压缩并使用 CTRL-C 中断会给出损坏的 zip 文件
- 使用全局声明的向量时,C++双重释放错误/损坏
- 变量周围的堆栈'...'已损坏
- 将类型声明为类型模板参数的模板参数的一部分是否合法?
- 运行时检查失败 #2 变量"A"周围的堆栈已损坏
- 反转整数的一部分(一半)的函数
- 选择基于另一个垫子的非零像素的cv::Mat的一部分?
- C 指针和对象作为不同类的一部分
- 检测到堆损坏:在正常块 c++ 动态 2D 数组之后
- 函数的返回类型是损坏名称的一部分吗?
- 两个暗淡的数组,指向它的一部分和堆栈损坏