41 / 26 / 17
Регистрация: 11.11.2019
Сообщений: 92
1

Отсутствие изменений в динамическом массиве после её передачи в функцию

05.04.2020, 23:05. Показов 1322. Ответов 4

Author24 — интернет-сервис помощи студентам
Цель: Создать динамический массив. Передать его в функцию. Изменить его размер внутри функции. Вернуть его из функции, но уже изменённым. Изменить его вне функции.
Проблема: я не могу понять по какой причине у меня, когда я передаю указатель массива в функцию, массив после выхода из функции не меняется, что бы я там с ним не делал. И причём после этого я никак не могу воздействовать внешне на этот массив, в плане, изменения размера.
Код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
void Size(char* word, size_t* size) {
 
    do {
        scanf("%d", &size[0]);
        size[0] += 2;
        word = (char*)realloc(word, size[0]);
 
        if (word == NULL) {
            fprintf(stderr, "Your size is wrong\t Try again\n");
        }
    } while (word == NULL);
}
int main()
{
    size_t size[1];
    char*word = (char*)malloc(1);
    fprintf(stdout, "Choose maximum size of your for first numbers: ");
    Size(word, size);//Не происходит изменений
    getchar();
    word = (char*)realloc(word, size[0] + 2);//Выдаёт ошибку
    fprintf(stdout, "Type a first number: ");
    fgets(word, size[0], stdin);
free(word);
    
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.04.2020, 23:05
Ответы с готовыми решениями:

В одномерном динамическом массиве после каждого четного элемента добавить 0
Добрый день. Есть такая задача в одномерном динамическом массиве после каждого четного элемента...

В целочисленном динамическом массиве после каждого четного числа вставить максимальный элемент массива
Нужно написать функцию massiv, которая в целочисленном динамическом массиве после каждого четного...

Доступ по индексу после передачи дека в функцию
Здравствуйте. template<class P> void Input(deque<P> *MyD, P s) { int i = 0; int size =...

Что происходит с массивом после передачи в функцию?
Привет! почему после передачи массива в метод, sizeof() выдает другой результат?? #include...

4
Вездепух
Эксперт CЭксперт С++
11689 / 6368 / 1723
Регистрация: 18.10.2014
Сообщений: 16,051
05.04.2020, 23:25 2
Лучший ответ Сообщение было отмечено 3alog как решение

Решение

Распространенные ошибки

Добавлено через 15 минут
Хотя вот это

Цитата Сообщение от 3alog Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
void Size(char* word, size_t* size) {
do {
        scanf("%d", &size[0]);
        size[0] += 2;
        word = (char*)realloc(word, size[0]);
if (word == NULL) {
            fprintf(stderr, "Your size is wrong\t Try again\n");
        }
    } while (word == NULL);
}
это соверешенно неправильно. Если realloc вернет NULL, то старую память вы потеряете, то есть произойдет утечка памяти. Вот так

C++
1
word = (char*)realloc(word, size[0]);
делать неправильно. Правильнее

C++
1
char *new_word = (char*)realloc(word, size[0]);
и только в случае успешного выделения памяти уже

C++
1
word = new_word;
1
41 / 26 / 17
Регистрация: 11.11.2019
Сообщений: 92
06.04.2020, 12:29  [ТС] 3
TheCalligrapher
Но ведь если я сделаю так
C++
1
word = new_word;
тогда у меня word будет зависеть от new_word. И если я захочу освободить память от new_word, тогда у меня и word тоже должен очиститься. Или я не прав?
А если и прав, тогда, мне кажется, strdup может стать выходом из этого.
0
Вездепух
Эксперт CЭксперт С++
11689 / 6368 / 1723
Регистрация: 18.10.2014
Сообщений: 16,051
06.04.2020, 12:33 4
Не понимаю вопроса. new_word - это временная локальная переменная. Не надо через нее ничего освобождать. Если перевыделение памяти прошло успешно, то просто делаем word = new_word и забываем про new_word навсегда.
0
41 / 26 / 17
Регистрация: 11.11.2019
Сообщений: 92
06.04.2020, 12:45  [ТС] 5
TheCalligrapher,
Всё, осознал. Спасибо большое!
0
06.04.2020, 12:45
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.04.2020, 12:45
Помогаю со студенческими работами здесь

Используя функцию, составить программу, которая считает количество изменений знака в массиве чисел. y=f(x). В С++
Используя функцию, составить программу, которая считает количество изменений знака в массиве чисел....

Почему после передачи в функцию массива, выводятся случайные числа, если использовать *(uk++) во второй раз?
Интересует такой вопрос: почему после передачи в функцию массива выводятся случайные числа из...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru