Почему я не могу использовать realloc для указателя на массив в функции? - PullRequest
0 голосов
/ 11 июня 2019

Я хочу иметь возможность передать строку в функцию, которая принимает массив символов, которые образуют строку, и заменяет ее на другую предоставленную строку.Проблема в том, что я получаю сообщение об ошибке, сообщающее, что перераспределяемый указатель (с использованием realloc) не был выделен (с помощью malloc).

Я убедился, что используемый в функции указатель такой же, какодин используется в основной подпрограмме, как показано в инструкциях печати указателя.Я пытался не передавать адрес строки массива char, но только сам по себе.Ничего из этого не сработало.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void change(char **old_string, char *new_string);

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

    if (argc == 2) {
        char *string;
        string = malloc((strlen(argv[1]) + 1) * sizeof(char)); // + 1 for \0
        string = argv[1];
        printf("Pointer outside Function: %p\n", string);
        printf("String Before: %s\n", string);
        change(&string, "New String");     
        printf("String After: %s\n", string);
    } else {
        printf("Please enter a string to have changed.\n");
    }
    return 0;
}

void change(char **old_string, char *new_string) {
    printf("Pointer in Function: %p\n", *old_string);
    *old_string = realloc(*old_string, (strlen(new_string) + 1) * sizeof(char)); // + 1 for \0
    strcpy(*old_string, new_string);
}

Текущие результаты при запуске:

Указатель снаружи Функция: 0x7ffeed590c88 String Before: тест Указатель в функции: 0x7ffeed590c88 a.out (20309,0x111496d40) malloc: * ошибка для объекта 0x7ffeed590c88: указатель, являющийся realloc'd, не был выделен a.out (20309,0x111496d40) malloc: * установить точку останова в malloc_error_break для отладки прерывания прерывания: 6

Чтодолжно произойти:

Для функции должны быть предоставлены две строки.Первый аргумент - это указатель на символы, а второй - строковый литерал.Указатель на предоставленные символы должен использоваться в основной процедуре.

Ответы [ 2 ]

3 голосов
/ 11 июня 2019

Вы выделили пространство и присвоили string для указания на него:

        string = malloc((strlen(argv[1]) + 1) * sizeof(char)); // + 1 for \0

Затем вы заменили этот указатель на копию указателя, сохраненную в argv[1]:

        string = argv[1];

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

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

        strcpy(string, argv[1]);
3 голосов
/ 11 июня 2019

Этот код:

string = argv[1];

устанавливает указатель string char так, чтобы он указывал на то же место, куда указывает argv[1].

Вместо этого вы должны сделать:

strcpy(string, argv[1]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...