Вы на самом деле не задавали вопрос, но я вижу несколько проблем с кодом:
char *mymsg[1028];
...
mymsg[1] = "serving for sender\n";
Здесь у вас есть mymsg
, который представляет собой массив 1028
указателей на char
, который предназначен для обработки в виде строки. (Кстати, почему 1028? Не то, чтобы это имело значение, но вы знаете, что 2 ^ 10 - это 1024). Однако этот массив содержит указатели, которые не инициализированы и указывают на случайные местоположения. Важно то, что для возможного сообщения, которое вы хотите поместить в них, не выделено места.
Вторая проблема заключается в том, что массивы в C начинаются с индекса 0, поэтому вы, вероятно, намеревались написать
mymsg[0] = "serving for sender\n";
Это не имеет значения, однако.
Что еще более важно, вы не можете копировать строки в C, используя =
, вы должны использовать strcpy
и копировать в область памяти, которую вы уже выделили. Вот два способа сделать это:
char mymsg[1028][1028]; // if you are sure your messages fit in 1028 chars
...
mymsg[1] = malloc(strlen("serving for sender)*sizeof(char)); // sizeof(char) not really needed
strcpy(mymsg[1], "serving for sender\n");
msgsnd(msqid,mymsg[1],len,msgflg);
free(mymsg[1]);
или
char *mymsg[1028];
...
char str_to_be_printed[] = "serving for sender\n";
mymsg[1] = malloc(strlen(str_to_be_printed)*sizeof(char)); // sizeof(char) not really needed
strcpy(mymsg[1], str_to_be_printed);
msgsnd(msqid,mymsg[1],len,msgflg);
free(mymsg[1]);
Редактировать: Во втором случае, где у вас уже есть строка (а не в форме «это строка»), достаточно присвоить указатели, и вы не копируете и не выделяете память. Однако, если ваша ситуация более сложна, чем эта, и между присвоением mymsg[1] = ...
и msgsnd
есть другой код, вы должны убедиться, что исходная строка остается в живых до тех пор, пока msgsnd
не будет сделано. В противном случае у вас есть свисающий указатель, который вызовет у вас проблемы. Вот идея:
+-+-+-+-+-+-+-+-+--+
str_to_be_printed ----->|A| |s|t|r|i|n|g|\0|
+-+-+-+-+-+-+-+-+--+
^
mymsg[1]---------------/
Если у вас free
память str_to_be_printed
, доступ к mymsg[1]
вызовет ошибку сегментации / нарушение доступа.
Обратите внимание, что код, который я написал, просто для того, чтобы дать вам руководство, не копируйте и не вставляйте его.