printf из char * получает ошибку сегментации - PullRequest
0 голосов
/ 05 декабря 2010

Я пытаюсь читать из сокета и печатать на стандартный вывод с помощью printf (необходимость);

Однако я получаю Сегментацию каждый раз, когда читаю определенный файл (HTML) с нормального веб-сайта.

Пожалуйста, посмотрите на этот код и скажите, что не так.

int total_read = 0;
 char* read_buff = malloc(BUF_SIZE);
 char* response_data = NULL;
 if (read_buff == NULL){
  perror("malloc");
  exit(1);
 }
 while((nbytes = read(fd, read_buff, BUF_SIZE)) > 0){
  int former_total = total_read;
  total_read += nbytes;
  response_data = realloc(response_data, total_read);
  memmove(response_data + former_total, read_buff, nbytes); //start writing at the end of spot before the increase.
 }
 if (nbytes < 0){
  perror("read");
  exit(1);
 }

 printf(response_data);

Спасибо.

Ответы [ 3 ]

9 голосов
/ 05 декабря 2010

response_data, вероятно, не NUL ('\0') завершено, поэтому printf продолжается после конца строки. Или, возможно, он содержит директиву %, но printf не может найти дополнительные аргументы.

Вместо этого укажите printf, как далеко читать, а , а не , чтобы интерпретировать любые директивы % в строке.

printf("%.*s", total_read, response_data);

Обратите внимание, что если response_data содержит встроенный NUL, printf остановится там, даже если total_read длиннее.

1 голос
/ 05 декабря 2010

Что может быть в response_data? Если он содержит символы форматирования printf (т. Е. %, за которыми следует один из обычных параметров), printf попытается получить доступ к некоторым параметрам, которые вы не передали, и ошибка сегментации весьма вероятна. Попробуйте вместо puts?

Если вы должны использовать printf, выполните printf("%s", response_data) (и сначала NUL-завершите его)

0 голосов
/ 06 декабря 2010

Насколько я понимаю из вашего поста, ответом являются данные HTML.
И поскольку это текст, вы пытаетесь его распечатать.Не используйте printf так, как вы.
Вместо этого сделайте следующее:

for(int i = 0; i < total_read; i++)
   putc(response_data[i],stdout);
...