Может кто-нибудь объяснить, пожалуйста, смысл двух строк ниже в программе для реализации pipe? - PullRequest
0 голосов
/ 01 июня 2019

Нужно объяснить, что писатель пытается здесь сделать.Почему я не могу использовать одномерный массив вместо массива od 2d?

char writemessages[2][20]={"Hi", "Hello"};
char readmessage[20];

Фрагмент программы:

   int main() {
   int pipefds[2];
   int returnstatus;
   char writemessages[2][20]={"Hi", "Hello"}; //why can't i use singlr char array
   char readmessage[20];
   returnstatus = pipe(pipefds);

   if (returnstatus == -1) {
      printf("Unable to create pipe\n");
      return 1;
   }

   printf("Writing to pipe - Message 1 is %s\n", writemessages[0]);
   write(pipefds[1], writemessages[0], sizeof(writemessages[0]));
   read(pipefds[0], readmessage, sizeof(readmessage));
   printf("Reading from pipe – Message 1 is %s\n", readmessage);
   printf("Writing to pipe - Message 2 is %s\n", writemessages[0]);
   write(pipefds[1], writemessages[1], sizeof(writemessages[0]));
   read(pipefds[0], readmessage, sizeof(readmessage));
   printf("Reading from pipe – Message 2 is %s\n", readmessage);
   return 0;
}

1 Ответ

0 голосов
/ 01 июня 2019

объясняет значение двух строк ниже

Строка

char writemessages[2][20]={"Hi", "Hello"};

определяет массив символов, имеющий 2 строки по 20 столбцов, и инициализирует его из-занулевой символ для завершения строк, которые может содержать массив, содержит 2 строки, содержащие до 19 символов, исключая нулевой символ.

При инициализации первая строка будет 'H' 'i', а затем нулевой символ, исекунда 'H' 'e' 'l' 'l' 'o' затем нулевой символ

Это короткий путь, эквивалентный:

char writemessages[2][20]={ { 'H', 'i', 0 }, { 'H', 'e', 'l', 'l', 'o', 0 }};

или

char writemessages[2][20]= {
   { 'H', 'i', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
   { 'H', 'e', 'l', 'l', 'o', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
};

Строка

char readmessage[20];

определяет массив размером 20, так что допускается до 19 символов больше нулевого символа.

Почему я не могу использовать одномерный массив вместо od 2dмассив?

это просто выбор сгруппировать их в двухмерный массив, вы также можете использовать одномерные массивы:

 char writemessage1[20] = "Hi";
 char writemessage1[20] = "Hello";

 printf("Writing to pipe - Message 1 is %s\n", writemessage1);
 write(pipefds[1], writemessage1, sizeof(writemessage1));
 ...
 printf("Writing to pipe - Message 2 is %s\n", writemessage2);
 write(pipefds[1], writemessage2, sizeof(writemessage2));

Обратите внимание, код всегда отправляет 20 символов,изменение определения, чтобы иметь

 char writemessage1[] = "Hi";
 char writemessage1[] = "Hello";

write(pipefds[1], writemessage1, sizeof(writemessage1)); отправляет 3 символа, а write(pipefds[1], writemessage2, sizeof(writemessage2)); отправляет 6 символов из-за размера массивов (они автоматически выбираются и инициализируются, чтобы содержать завершающий нулевой символ)


возможно

printf("Writing to pipe - Message 2 is %s\n", writemessages[0]);
write(pipefds[1], writemessages[1], sizeof(writemessages[0]));

должно быть

printf("Writing to pipe - Message 2 is %s\n", writemessages[1]);
write(pipefds[1], writemessages[1], sizeof(writemessages[1]));

, чтобы отправить "Привет", а не снова "Привет"

...