в
char* res = (char*)malloc(strlen("recv") + strlen(name));
вам нужно выделить «recv_» вместо «recv» из-за кода после и выделить еще 1, чтобы иметь место для завершающего нулевого символа, поэтому
char* res = (char*)malloc(strlen("recv_") + strlen(name) + 1);
В
if(res == null)
{
return null;
}
null должно быть NULL
В
memcpy(&res, "recv_", strlen("recv_"));
должно быть
memcpy(res, "recv_", strlen("recv_") + 1);
иначе вы не модифицируете выделенный массив, а стек из адреса переменной res , и вам также нужно поместить завершающий нулевой символ, так что я просто добавляю 1 к числу символов для копирования
обратите внимание, что проще использовать strcpy : strcpy(res, "recv_")
Пример:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char* new_name(char* name)
{
char* res = (char*)malloc(strlen("recv_") + strlen(name) + 1);
if(res == NULL)
{
return NULL;
}
else
{
memcpy(res, "recv_", strlen("recv_") + 1); /* or strcpy(res, "recv_"); */
strcat(res, name);
}
return res;
}
int main()
{
char * result = new_name("foo");
printf("'%s'\n", result);
free(result);
return 0;
}
Компиляция и исполнение:
pi@raspberrypi:~ $ gcc -pedantic -Wall -Wextra m.c
pi@raspberrypi:~ $ ./a.out
'recv_foo'
Исполнение под valgrind :
pi@raspberrypi:~ $ valgrind ./a.out
==22335== Memcheck, a memory error detector
==22335== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==22335== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info
==22335== Command: ./a.out
==22335==
'recv_foo'
==22335==
==22335== HEAP SUMMARY:
==22335== in use at exit: 0 bytes in 0 blocks
==22335== total heap usage: 2 allocs, 2 frees, 1,033 bytes allocated
==22335==
==22335== All heap blocks were freed -- no leaks are possible
==22335==
==22335== For counts of detected and suppressed errors, rerun with: -v
==22335== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 6 from 3)