Основная проблема в том, что вы пытаетесь напечатать строку, передавая только символ. Это потому, что buffer[8]
относится к char
в индексе 8, а не к строке, начинающейся в этой позиции. Таким образом, вам нужно взять адрес buffer[8]
, чтобы сделать его строкой или char*
.
Причина, по которой он segfaults, заключается в том, что printf
пытается напечатать строку, начинающуюся с адреса, указанного первым символом (т. Е. Самого содержимого строки), который не является допустимым указателем.
Есть также несколько опечаток и ошибок. Рабочая версия ниже:
#include <stdio.h>
#include <memory.h>
int main()
{
unsigned char buffer[444];
int id = 102;
int len = 3;
char* str = "working";
memmove(buffer,&id,sizeof(id));
memmove(buffer+(sizeof(id)),&len,sizeof(len));
memmove(buffer+(2*sizeof(id)), str, sizeof(str));
printf("1 is: %d\n", buffer[0]);
printf("2 is: %d\n", buffer[4]);
printf("3 is %s\n", &buffer[8]);
return 0;
}
Если вы скомпилировали это приложение со всеми включенными предупреждениями (т.е. -Wall
), ваш компилятор (по крайней мере, GCC делает) должен предупредить вас о вашей ошибке, например:
problem.c:18: warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘int’
Предупреждения не следует игнорировать!