两个暗淡的数组,指向它的一部分和堆栈损坏

Two dim array, pointer to part of it and stack corruption

本文关键字:一部分 损坏 堆栈 数组 两个      更新时间:2023-10-16

为什么下一个代码给我围绕变量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(。