Из вашего вопроса я не могу быть уверен в вашем уровне понимания, но похоже, что вы не знакомы с механикой указателей, поэтому я постараюсь дать быстрое объяснение.
ВашПараметр void * app_key - это целое число, которое хранит местоположение в памяти блока неизвестного (void) типа.
Ваш поток char * также является целым числом, он хранит местоположение в памяти блока типа char(либо один символ, либо первый символ в непрерывном блоке).
Ваша строка кода char *stream = (char *)app_key
копирует целочисленное значение app_key (то есть адрес в памяти, на который ссылается app_key) и сохраняетон также находится в потоке.
На этом этапе и app_key, и stream хранят одно и то же место в памяти - адрес первого символа в вашем app_key (при условии, что в качестве параметра передана строка).
Однако поймите, что единственное, что было скопировано, это целочисленный адрес памяти вашего app_key.До сих пор есть только одна копия.
То, что вы хотели сделать, это создать новую копию строки app_key, которая была сохранена в другом месте в памяти (возможно, когда функциявозвращается, и исходная строка уничтожается, у вас все еще есть копия).
Чтобы сделать это, вам нужно сделать следующее:
1: allocate memory space sufficient to hold the new copy
2: copy all of the characters from the original to the copy
Есть много способов сделать это в зависимости отна то, что ваши потребности.Вот один из них:
static int
write_stream (const void *buffer, size_t size, void *app_key)
{
//create a memory buffer large enough to hold size_t size chars.
char *stream = (char *)malloc(sizeof(char) * size);
//copy size_t size chars from location at app_key to location at stream
memcpy(stream, app_key, sizeof(char) * size);
//rest of your function
}
Поскольку вы работаете со строками, вы также можете использовать функцию strcpy () (возможно, в паре с strlen).Все эти функции предполагают, что вы используете строку с нулевым символом в конце (то есть строка представляет собой последовательность char
s, с конечным \0
в конце, указывающим конец.