Не компилируется программа, работающая с указателями и адресами

Пишу программу, позволяющую убедиться, что '\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 шт):

Автор решения: Harry

Давайте построчно...

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");

Вот так сработает...

→ Ссылка