Не компилируется программа, работающая с указателями и адресами
Пишу программу, позволяющую убедиться, что '\0' является терминирующим символом при выводе массива символов через стандартный поток cout. Однако, программа не компилируется. Вот исходный её код:
# include <iostream>
using namespace std;
int main(){
char a[4] = {'a', 'b', 'c', 'd'}; // массив, занимающий 4 байта, то есть 1 int
int &addr = &a + 1; // взятие адреса массива a и увеличение его на 1 int
addr = {'e', 'f', 'g', '\0'}; // запись ещё одного массива сразу же после a
cout << a << endl; // ожидается "abcdefg", т.к. 'e' в памяти идёт сразу после 'd'
return 0;
}
Почему эта программа не работает? Заранее спасибо.
Ответы (1 шт):
Давайте построчно...
char a[4] = {'a', 'b', 'c', 'd'}; // массив, занимающий 4 байта, то есть 1 int
Без вопросов.
int &addr = &a + 1; // взятие адреса массива a и увеличение его на 1 int
Первое - объявлена ссылка на int, а не указатель, второе - от массива адрес не берется, a сам по себе указатель на первый свой элемент. Но даже если вы объявите указатель на int, и просто напишете a -
int *addr = a + 1;
то получится, что вы указателю addr пытаетесь присвоить указатель на char, что компилятор просто так позволить не может. Да и +1 сработает просто как указатель на следующий элемент массива, т.е. на 'b'.
Но допустим даже, что вы сделали так
char * addr = a + 4;
т.е. указываете за конец массива a. Но следующая строка
addr = {'e', 'f', 'g', '\0'}; // запись ещё одного массива сразу же после a
опять же бессмысленна как синтаксически - это не объявление массива addr, так что через {} работать нельзя. В лучшем случае нужно сделать strcpy(arrd,"efg").
Но это неверно и семантически - память за пределами вашего массива a вам не выделена. Там могут располагаться всякие важные вещи, а вы прямо туда пишете.
Так что надо заранее выделять место, типа
char a[8] = {'a', 'b', 'c', 'd'};
char * addr = a + 4;
strcpy(addr,"efg");
Вот так сработает...