Вам нужно изменить вашу функцию initialize()
, чтобы получить указатель на ваш буфер и передать адрес указателя. Хотя он получает буфер, который вы передаете, вы не можете изменить то, на что указывает buff
. Просто имейте в виду, что в этом случае у вас будет утечка памяти, и вы не сможете распечатать содержимое в виде строки, так как оно не завершено нулем.
void initialize(char **buffer)
{
*buffer = malloc(sizeof(char));
**buffer='a';
}
int main(void) {
char *buff;
buff = malloc(sizeof(char));
*buff = 'b';
initialize(&buff);
puts("Contents of buffer are: ");
printf("%c\n", *buff);
return 0;
}
Ответы на комментарии ниже:
Я не понимаю, почему указатель на указатель все еще нужен ... это как ссылка в C ++?
Когда я читал ваш код, я подумал, что вы хотите изменить новый буфер, на который указывает переменная buff
(в main()
). Я подумал об этом, когда увидел, что вы выделяете новый буфер в вашей функции initialize()
. Чтобы иметь возможность изменить значение переменной из другого места (или функции), вам потребуется адрес этой переменной. Поскольку изначально это был символьный указатель char *
, вам понадобился бы указатель на этот символьный указатель char **
. И да, это похоже на ссылку в C ++, только более многословно.
Чтобы я мог изменить значение переданной переменной?
Если вы намеревались просто изменить содержимое буфера, который был передан, Krtek покрывает это. Все, что вам нужно было сделать, это исключить новое выделение буфера и изменить то, на что указывал буфер.
void initialize(char *buffer)
{
/* *buffer = malloc(sizeof(char)); */ /* do not need this */
/* modify the buffer that was passed in */
*buffer='a';
}
Относительно проблемы утечки памяти
На самом деле, утечка памяти была вызвана выделением нового буфера без освобождения ранее выделенной памяти. Вы фактически имели это:
char *buff = malloc(sizeof(char)); /* allocate some memory */
buff = malloc(sizeof(char)); /* oops, memory leak */
Вы имеете в виду использование put с ненулевой строкой? Поэтому вы используете printf ("% c \ n", * buff)? принудительное завершение строки \ n?
Это была другая проблема здесь. puts()
принимает строку с нулевым символом в конце и выводит ее на стандартный вывод, за которым следует новая строка. Это не будет утечка памяти для печати потенциально мусорного текста, это просто ... что-то еще. Ваш буфер содержит пространство только для одного символа (без нулевого терминатора). Поэтому не следует использовать puts()
для печати содержимого буфера. Вы должны печатать только этот единственный символ. Использование printf()
с '\n'
должно было привести к тому же выходному поведению, что и puts()
.