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

时间:2011-12-11 14:15:10

标签: c++ arrays pointers

为什么下一个代码会让我堆栈变量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
...

3 个答案:

答案 0 :(得分:6)

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;

答案 1 :(得分:3)

您正在声明一个单元素数组,然后访问它的第二个元素(索引1,第一个元素是索引0)。

答案 2 :(得分:3)

char *ch = x[1]; //error - index out of range

这是错的。你应该写:

char *ch = x[0]; //ok  - index within range

x被声明为char x[1][21],这意味着0是第一维的唯一有效索引。 1超出范围。