@ITeration_Test

Как работает заполнение одномерного массива по типу двумерного, если данные по идеи никак не меняются(добавляются или изменяются)?

Не понятно, что происходит с массивом в это в время, если эти символы как-то же записались в 1 байт данных - при том , что размер массива не меняется никак !?!....

#include <iostream>

char mas[1]; // как я понял, размер не важен...

int main()
{
    for(int y = 0; y < 5; ++y)
        for(int x = 0; x < 20; ++x)
            mas[y * 1 + x] = '0';  // число на которое умножает : 1 или 8 - от этого тоже никакого смысла !?!


    for(int y = 0; y < 5; ++y){
        for(int x = 0; x < 20; ++x){
                std::cout << mas[y * 1 + x];
                //printf("|%d",y*1+x);
        }
        printf("\n");
    }

    std::cout << sizeof(mas);
    return 0;
}
  • Вопрос задан
  • 153 просмотра
Решения вопроса 1
@dima20155
you don't choose c++. It chooses you
Вам стоит почитать об указателях.
Размер массива очень даже важен.
Вы создаёте массив, а затем пишите данные по указателю на массив с некоторым смещением. Фактически ничто не мешает вам писать что угодно и куда удобно (в пределах памяти, доступной вашей программе) и ничего вам за это не будет. В данном случае вы нагло пишите данные по указателю (который указывает на данные в области .data). данная область памяти значительно больше 1 байта и все, что вы туда записали будет храниться в ней. Проблема заключается в том, что массив имеет длину лишь 1 байт, а значит вы пишите в память, которая не принадлежит данной переменной/массиву, а принадлежит какой-то другой переменной и тем самым изменяете значение этой переменной.

Заведите вторую переменную, скажем, mas2 чуть большего размера (главная, чтобы линковщик положил ее после mas.) И заполните ее каким-то полезными данными, а затем выполните свой код заполнения двумерного массива и распечатайте оба массива.

Также можете попробовать создать массив в динамической памяти размером 1 байт, а потом заполнить своим кодом двумерный массив размера так 100х100 и получить классический SEGFAULT от операционной системы.

К сожалению, уместить в 1 байт целый массив нельзя, а может оно и к лучшему.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы