Во-первых, я пишу простую программу.Ошибка сегментации на 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
результат в вине сегмента?
Потому что мне нужно сцепить старое содержание в 'buf' и новое содержание в' tmp', и я проверил старый содержимое inbuf тщательно (в пределах размера malloc). –
Мы не видим, что 'buf' инициализируется любым значением перед' strncat() ', поэтому вы видите проблему. Если бы buf имел некоторое значение до 'strncat', тогда это сработало бы хорошо. Итак, если это так, вы можете использовать 'strncpy()' – Gopi
Вместо '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. –