2012-01-17 7 views
1

У меня есть цикл, который выглядит примерно такSegfault только при печати

while(condition){ 
    read_some_data(source, buf, BUFSIZE); 
    printf(buf); 
    memset(buf, 0, BUFSIZE+1); 
    //do stuff to affect condition that does not touch buf 
} 

buf является массивом символов размера BUFSIZE+1. Странно, что если я прокомментирую printf, программа отлично выполнится без сбоев сегментации. Только когда я пытаюсь распечатать buf, я получаю проблему. Кроме того, ошибка seg не обязательно возникает на первой итерации петли. Обычно это занимает 6 или 7 итераций.

Кроме того, динамическая выделенная память в этой программе отсутствует.

+3

Что произойдет, если вы правильно используете 'printf()'? то есть 'printf ("% s ", buf);' –

+0

@DanFego Я так смущен. Это была моя проблема. – Daniel

+2

Не нужно смущаться, пока вы что-то узнали! То есть, как использовать 'printf()' и, возможно, использовать '-Wall' и обращать внимание на предупреждения компилятора. :) –

ответ

7
  • Убедитесь, что buf имеет нуль (с нулевым значением) байт где-то в пределах выделенного диапазона. Этот нулевой байт - это то, как printf может сказать, что он достиг конца строки; без него он будет продолжать читать, где он может безопасно это сделать.
  • Удостоверьтесь, что buf не содержит ничего, как %d, что printf может потребоваться, чтобы указать дополнительные аргументы. Еще лучше — просто используйте printf("%s", buf), что полностью исключает любой такой риск.
6

Вы не хватает спецификатор формата аргумент PRINTF

1

Удостоверяются, что buf is \0 Прекращенная строка. Только тогда printf() может напечатать строку.

1

Вам необходимо указать строку в качестве параметра печати: printf("%s", buf);.

Надеюсь, это поможет!
N.S.

0

Окончен ли он? И почему вы вызываете printf (buf) вместо puts (buf), если все, что вы хотите сделать, это написать buf в stdout?

Смежные вопросы