Как говорится в заголовке, всякий раз, когда я пытаюсь скопировать строку (используя собственный тип строки и библиотеку), я получаю ошибку сегментации. Согласно отладчику это происходит на 29-й строке источника (где вызывается s_strcpy4()), которая переходит к строке в sstring.h с "_dest [i] = _sour [i];". i время от времени имеет какое-то значение в момент сбоя, но несколько раз придерживается одного значения (не знаю, почему еще). На момент написания он застрял в 1689 году.Копирование пользовательской строки в C с использованием указателей на uint64_t вызывает ошибку сегментации
Кто-нибудь знает, где я могу причинить segfault в коде?
source.c
#include "sstring.h"
#include <string.h>
#include <stdio.h>
#include <time.h>
int main(void) {
s_string ss1,
ss2;
long long int start, end;
struct timespec time;
FILE *LoremIpsum;
s_init(&ss1, NULL, 65536);
s_init(&ss2, NULL, 65536);
LoremIpsum = fopen("Lorem ipsum", "r");
if(LoremIpsum == NULL) {
perror("Error opening file ");
return 1;
}
fgets(ss2.string, 65536, LoremIpsum);
if(fclose(LoremIpsum) == EOF) {
perror("Error closing file ");
return 2;
}
s_strcpy4(&ss1, &ss2);
return 0;
}
sstring.h
#include <stdlib.h>
#include <stdint.h>
enter code here
typedef struct {
int length;
char *string;
} s_string;
s_string *s_init(s_string *str, char *array, size_t num) {
int i;
if(str == NULL)
str = malloc(sizeof(s_string));
if(array == NULL) {
(*str).length = num;
if(num != 0)
(*str).string = malloc(num);
} else {
if(num == 0) {
(*str).string = NULL;
for(i = 0; array[i] != '\0'; i++) {
(*str).string = realloc((void *)(*str).string, i + 1);
(*str).string[i] = array[i];
}
(*str).length = i;
} else {
(*str).string = (char *)malloc(num);
(*str).length = num;
for(i = 0; i < num; i++)
(*str).string[i] = array[i];
}
}
return str;
}
s_string *s_strcpy4(s_string *__restrict__ destination, const s_string *__restrict__ source) {
int i;
long long *_dest = (long long *)(destination->string),
*_sour = (long long *)(source->string);
for(i = 0; i < source->length - 8; i+=8)
_dest[i] = _sour[i];
for(; i < source->length; i++)
destination->string[i] = source->string[i];
destination->length = i;
return destination;
}
's_init (p, NULL, 0)' не инициализирует 'p-> string'. Я не уверен, что это * проблема *, но это * * проблема. – Casey
Спасибо, не понял. Теперь он устанавливает p-> string в NULL в этом случае. –