Эта строка:
char *std_out_lines[BUFFER_LEN];
выделяет массив символов указателей , но не выделяет места для самих фактических данных.
Позже, когда выdo:
char temp[BUFFER_LEN];
printf("PARENT read from stdout: %s\n", outbuf);
strcpy(temp, outbuf);
std_out_lines[std_out_count] = temp;
вы на самом деле перезаписываете такой же фрагмент памяти, который каждая новая строка и сохраняет (неизменяемый) адрес в следующем символьном указателе. char temp[BUFFER_LEN];
не делаетвыдает новую область данных каждый раз, когда она выполняется.
Вот почему она работает.Однако, когда temp
выходит из области видимости, я бы не советовал пытаться исследовать какие-либо строки, на которые указывает ваш массив.Это неопределенное поведение.Кажется, это работает для вас, но я гарантирую, что это чисто случайно: -)
Вы можете захотеть посмотреть на дублирование строки, чтобы каждый элемент массива имел свою собственную копию.Замените:
std_out_lines[std_out_count] = temp;
на:
std_out_lines[std_out_count] = strdup(temp);
или просто канаву temp
в целом и используйте:
std_out_lines[std_out_count] = strdup(outbuf);
Это дает копию строки и дает вам адрес для хранения в массиве, так что они все отделены друг от друга.Просто помните, что вы, вероятно, должны в конце концов освободить эту память.
При маловероятной вероятности того, что ваша реализация C не имеет a strdup
(это не предписано ISOстандарт), вот тот, который я подготовил ранее .