В функции
void write_char(char* c){
c = (char*)malloc(11*(sizeof(char)));
c = "some string";
}
параметр c
является локальной переменной функции.Изменение его в функции не влияет на исходный аргумент, поскольку он передается по значению.То есть функция имеет дело с копией исходного аргумента.
Вы должны передать аргумент по ссылке через указатель на него.
Также функция имеет утечку памяти, потому что сначала указательбыл назначен адрес выделенной памяти, а затем переназначен с адресом первого символа строкового литерала "some string"
.
Если вы хотите создать копию строкового литерала, то вам нужноследующий
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void write_char( char **s )
{
const char *literal = "some string";
*s = malloc( strlen( literal ) + 1 );
if ( *s ) strcpy( *s, literal );
}
int main( void )
{
char *test_char = NULL;
write_char( &test_char );
if ( test_char ) puts( test_char );
free( test_char );
}
Вывод программы:
some string
Не забудьте динамически выделить массив символов, достаточно большой для хранения также конечного нуля строкового литерала.
И вы должны освободить выделенную память, когда выделенный массив больше не нужен.
Если вы хотите просто инициализировать указатель с адресом строкового литерала, тогда нет необходимости выделять динамически память.
Вы можете написать
#include <stdio.h>
void write_char( char **s )
{
*s = "some string";
}
int main( void )
{
char *test_char = NULL;
write_char( &test_char );
puts( test_char );
}