Инициализация другого массива в каждой итерации цикла в C - PullRequest
0 голосов
/ 14 марта 2019

Я пытался задать вопрос, в котором мне нужно было запрашивать ввод у пользователя и много раз сохранять его в массиве (поэтому я использовал цикл).Однако, хотя я объявлял и инициализировал новый массив char в каждой итерации и сохранял его в массиве char *, все массивы char (в данном случае я пытался использовать их как строки), хранящиеся в массиве char *, по-видимому, одинаковыадрес памяти, даже если я объявляю новый каждый раз!Как это происходит?

Большое спасибо !!

Ниже приведен упрощенный фрагмент кода, демонстрирующий поведение, о котором я говорю.При запуске все выходные данные были равны 9. Упрашивание ввода упрощается до вставки значений, связанных с индексом, в массив

int main(int argc, char** argv){

    char* batsman[10];
    for(int i = 0; i < 10; i++){
        char newString[2];
        newString[0] = i + 48;
        newString[1] = '\0';
        batsman[i] = newString;
    }

    for(int i = 0; i < 10; i++){
        printf("%s\n",batsman[i]);
    }
    return 0;
}

Ответы [ 3 ]

0 голосов
/ 14 марта 2019

Нет причин думать, что этого не произойдет.

Вы создаете объект (массив), а затем он выходит из области видимости (когда цикл заканчивается).Теперь его место в памяти свободно для чего-то другого.

Как это происходит (чистый шанс), ваш следующий объект (другой массив) получил тот же адрес.В следующий раз все может быть иначе.Неважно!

Когда вы переезжаете в дом, вам все равно, кто в него переходит?Может быть, он лежит пустым в течение нескольких лет.Возможно, он лежит пустым, пока не будет снесен, чтобы освободить место для ряда магазинов.Может быть, его сразу подхватила прекрасная семья, которая перекрасила его и превратила в дворец смеха. Но тебя там уже нет , так что в любом случае это не могло иметь для тебя никакого значения.Вы ушли.Вы переехали в другой дом.

Не обращайте на это внимания.Ваша программа не работает, потому что вы храните висячие указатели на переменные, которые выходят из области видимости.Не делай этого.Вместо этого используйте std::vector<std::string>.

Обратитесь к своей книге за дополнительной информацией о сложностях "сырых" массивов в стиле C.

0 голосов
/ 14 марта 2019

Проблема возникает потому, что вы не используете выделение памяти. Вы храните в указателях с битой символы, определенные внутри цикла. Компилятор использует одну и ту же ячейку памяти в каждом цикле (в данном случае это можно изменить), поэтому, когда вы изменяете значение внутри цикла, вы делаете это для каждого числа, так как каждый указатель указывает одну и ту же ячейку памяти.

Чтобы решить эту проблему, вам нужно использовать динамическое распределение памяти с malloc и free из стандартной библиотеки c.

0 голосов
/ 14 марта 2019

Компилятор свободен в выборе места для размещения массива. Поскольку newString является локальным для цикла, наиболее эффективно просто хранить его в том же месте. Имейте в виду, это не всегда так.

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