С вашего вопроса я не могу быть уверен в вашем уровне понимания, но похоже, что вы не знакомы с механикой указателей, поэтому я попытаюсь дать краткое объяснение.
Ваш параметр void * app_key - это целое число, в котором хранится местоположение в памяти блока неизвестного типа (void).
Ваш поток char * также является целым числом, он сохраняет местоположение в памяти блока типа char (либо одного символа, либо первого символа в непрерывном блоке).
Ваша строка кода char *stream = (char *)app_key
копирует целочисленное значение app_key (то есть адрес в памяти, на который ссылается app_key), и сохраняет его также в потоке.
На этом этапе как app_key, так и поток хранят одно и то же местоположение в памяти - адрес первого символа в вашей 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
}
Поскольку вы работаете со строками, вы также можете использовать функции зЬгсра() (потенциально сопряженных с STRLEN). Все эти функции предполагают, что вы используете строку с завершающим NULL (т. Е. Строка представляет собой последовательность char
s, с окончательным номером \0
в конце, чтобы указать конец.
Как это называется? –
Не могли бы вы пожалуйста, опишите, что должен делать код? – stacker