Два dim массива, указатель на его часть и повреждение стека - PullRequest
1 голос
/ 11 декабря 2011

Почему следующий код дает мне стек вокруг переменной 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 ]

6 голосов
/ 11 декабря 2011

char x[1][21]; - матрица 1 х 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;
3 голосов
/ 11 декабря 2011
char *ch = x[1]; //error - index out of range

Это неправильно. Вы должны написать:

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

как x объявлено как char x[1][21], что означает, что 0 является единственным действительным индексом для первого измерения. 1 выпадает из диапазона.

3 голосов
/ 11 декабря 2011

Вы объявляете массив из одного элемента и затем получаете доступ к его второму элементу (индекс 1, первый элемент - индекс 0).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...