2013-07-29 1 views
0

Как говорится в заголовке, всякий раз, когда я пытаюсь скопировать строку (используя собственный тип строки и библиотеку), я получаю ошибку сегментации. Согласно отладчику это происходит на 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; 
} 
+0

's_init (p, NULL, 0)' не инициализирует 'p-> string'. Я не уверен, что это * проблема *, но это * * проблема. – Casey

+0

Спасибо, не понял. Теперь он устанавливает p-> string в NULL в этом случае. –

ответ

1

_dest [I] = _sour [I]; должно быть _dest [i/8] = _sour [i/8];

или что-то подобное.

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

Я предполагаю, что вы делаете это как упражнение, а не для использования в производстве. Просто используйте memcpy()

+0

Было бы неплохо узнать, что не так с моим кодом, а не только с тем, что с ним что-то не так. –

0
size_t const LLsize = sizeof(long long); 
for(i = 0; i < source->length/LLsize; ++i) 
    _dest[i] = _sour[i]; 

for(i = i*LLsize; i < source->length; ++i) 
    destination->string[i] = source->string[i]; 
Смежные вопросы