2014-11-22 3 views
1

Во-первых, я пишу простую программу.Ошибка сегментации на strncat()

1 #include <string.h> 
    2 #include <stdio.h> 
    3 #include <stdlib.h> 
    4 
    5 int main() 
    6 { 
    7  char *buf = (char*)malloc(sizeof(char)*2000); 
    8  char tmp[256]; 
    9  strcpy (tmp, "test"); 
10  printf ("tmp: %s\n", tmp); 
11  strncat (buf, tmp, strlen(tmp)); 
12  printf ("buf: %s\n", buf); 
13 } 

Ожидаемый результат:

tmp: test 
buf: test 

Но после того, как я совмещаю код в моем большом проекте. (Которые используют много сегментов кучи)

153  char *inbuf = (char*)malloc(sizeof(char)*2000); 
154  char *outbuf = (char*)malloc(sizeof(char)*2000); 
155  char *oldinbuf = (char*)malloc(sizeof(char)*2000); 
156  char *errbuf = (char*)malloc(sizeof(char)*2000); 
157  memset (inbuf, '\0', strlen(inbuf)); 
158  memset (oldinbuf, '\0', strlen(oldinbuf)); 
159  memset (errbuf, '\0', strlen(oldinbuf)); 

Затем в строке: 11, я получаю сообщение об ошибке Segmentation fault (core dumped)

Есть ли возможности, которые strncat результат в вине сегмента?

+0

Потому что мне нужно сцепить старое содержание в 'buf' и новое содержание в' tmp', и я проверил старый содержимое inbuf тщательно (в пределах размера malloc). –

+0

Мы не видим, что 'buf' инициализируется любым значением перед' strncat() ', поэтому вы видите проблему. Если бы buf имел некоторое значение до 'strncat', тогда это сработало бы хорошо. Итак, если это так, вы можете использовать 'strncpy()' – Gopi

+0

Вместо 'malloc + memset' вы можете использовать' calloc' [который может быть быстрее в любом случае] (http://stackoverflow.com/questions/2688466/why- mallocmemset-это-медленнее, чем calloc /). Ваш 'memset' в строках 157-159 устанавливает [неправильное количество байтов] (http://stackoverflow.com/questions/492384/how-to-find-the-sizeofa-pointer-pointing-to-an-array) , Также [см. Здесь] (http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc) для современного использования malloc. –

ответ

6

Эта линия Неопределенное поведение

strncat (buf, tmp, strlen(tmp)); 

потому что buf происходит от malloc неинициализированного. strncat, с другой стороны, ожидает, что buf содержит строку C с нулевым завершением.

Вы можете исправить это, установив начальный символ buf на '\0'.

1

Если вы собираетесь использовать strcat или sttrncat, то buf должен иметь действительную строку. Так что пишите

char *buf = (char*)malloc(sizeof(char)*2000); 
buf[0] = '\0'; 

Кроме того, если вы используете strncat, то вы всегда должны добавить Нуль себя, что копирование будет безопасным. Например

size_t n = strlen(tmp); 
strncat (buf, tmp, n + 1); 
buf[n] = '\0'; 

Хотя в данном конкретном случае, вы могли бы просто использовать strcat вместо strncat

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