2017-02-09 8 views
0

Я работаю над простым веб-сервером в C, и всякий раз, когда я пытаюсь написать char [], который я объявил в основном в другой функции, я получаю segfault. Прежде чем кто-либо предложит, я не объявил его строковым литералом. Я пробовал выделять с помощью malloc(), устанавливая каждый символ в массиве нулевым терминатором при инициализации и не инициализируя его ничем (т. Е. Он не читается до тех пор, пока в него не будет записано что-то новое, поэтому нет причины для нуля это ни к чему изначально), все безрезультатно.Почему я получаю segfault с этим кодом при использовании snprintf?

Синтаксис того, что происходит следующим образом:

#define MAX_BUFFER_LENGTH 20 

int some_function(char *buffer) { //many other params as well 
    //lots of other code 
    snprintf(buffer, MAX_BUFFER_LENGTH, "%s", "HTTP/1.0 404 Not Found"); // This is where the segfault is thrown 
} 

int main(int argc, char *argv[]) { 
    char buffer[MAX_BUFFER_LENGTH]; 
    //many other declarations 
    //... 
    some_function(buffer); 
} 

Странная вещь, это происходит только выдаёт ошибку сегментации в первый раз, что я называю запись в буфер с определенным синтаксисом. Есть несколько запросов, которые не создают segfault. Если я отправляю запросы, которые вызывают segfault после тех, которые этого не делают, они больше не вызывают segfault. Любое понимание?

+1

'полукокса * Buffer [MAX_BUFFER_LENGTH];' -> 'полукокса буфера [MAX_BUFFER_LENGTH];' – BLUEPIXY

+0

Чтение сообщений об ошибках компилятора. Если вы его не видите, вам нужно перенастроить свой компилятор –

+0

извините, у меня на самом деле была опечатка в том, что я спросил выше. Это не массив указателей; Я изменил код, чтобы отразить то, что у меня есть, что дает мне проблему. Кроме того, для кого-то интересно, я компилирую с -Wall. – Kw3si

ответ

3

Ваш буфер не является массивом символов. Это массив символов указатели. Ваш компилятор должен был предупредить вас о несоответствии типа.

Изменить объявление на:

char buffer[MAX_BUFFER_LENGTH]; 
+0

Только при компиляции с предупреждениями. Который должен быть обязательным до публикации вопроса о SO. – dave

+1

@dave: На самом деле это рекомендуется на информационной странице. Но, по-видимому, многие из них не читают. Возможно, перед публикацией должны быть некоторые проверки, обязательные для вопроса с тегом C (или другого). – Olaf

+0

Было бы целесообразно передать размер буфера функции, поэтому 'some_function' не должен делать глупые предположения о размере буфера. – chqrlie