почему ошибка сегментации при копировании памяти - PullRequest
2 голосов
/ 21 января 2011

Я запускаю Ubuntu на x86_32 ... и продолжаю получать ошибку сегментации при запуске этой программы.

enter code here
#include<stdio.h>
#include<stddef.h>
char *memcp(char *dest, const char *src, size_t n)
{

    char *dp = dest;
    const char *sp = src;
    while(n--)
        *dp++ = *sp++;
    return dest;

}

int main()
{

    char *s = "abcde";
    char *d;
    char *r = memcp(d,s,6);
    printf("%s",r);

    return(0);
}

Проблема с этим кодом в том, что он работает на компьютере моего друга x86_64 в Windows, а также в Ubuntu. Пожалуйста, помогите мне ..

1 Ответ

7 голосов
/ 21 января 2011

Есть как минимум два способа сделать это:

malloc метод:

int main(void)
{
    char *s = "abcde";
    char *d = malloc(6);
    char *r = memcp(d, s, 6);
    printf("%s",r);

    free(d);
    return(0);
}

Метод массива:

int main(void)
{
    char *s = "abcde";
    char d[6];
    memcp(d, s, 6);

    return 0;
}

Обратите внимание, что обычно это не такхорошая идея жестко закодировать длину буфера в ваш код (например, вы жестко программируете 6).Если размер вашего ввода изменится, и вы забудете обновить число 6. Возникнут проблемы.

Причина, по которой вы получаете ошибку сегментации, заключается в том, что указатель d никуда не указывает.В вашей функции memcp вы пытаетесь написать этот указатель, но поскольку он нигде не указывает на значимый сбой вашей программы.В стандарте C это называется неопределенное поведение , и в основном это означает, что все может произойти.

Кроме того, вас может заинтересовать то, что в стандартной библиотеке C уже есть две функции,memmove и memcpy.memmove полезно, если области источника и назначения перекрываются.Если вы знаете, что они никогда не будут перекрываться, memcpy может быть быстрее.

Наконец, я хотел бы отметить, что вам не следует принимать советы от Артура в отношении использования неинициализированного указателя.Вы никогда не должны полагаться на значение неинициализированного указателя, и это означает, что поведение вашей программы не четко определено.В приложении J спецификации языка C упоминается следующее: неопределенное поведение :

J.2 Неопределенное поведение

  1. Поведение не определено вследующие обстоятельства:
    • Значение объекта с автоматической продолжительностью хранения используется, пока оно не определено.
...