2012-01-02 3 views
1

Почему этот ниже код дает ошибку сегментации?Функция memcpy в c

int main() 
{ 
     char *t = "Working on RedHat Linux"; 
     char *s; 

     s = malloc (8000 * sizeof(char)); 
     memcpy(s,t,7000); 
     printf("s = %s\nt = %s\n",s,t); 
     free(s); 
} 

Я выделил 8000 байт за 's'. И копирование только 't' до s до 7000 байт. Хотя я выделил 8000 байтов для 's', почему он дает ошибку сегментации?

+0

Вы также можете посмотреть 'strcpy' или' strncpy' для строкового копирования. –

ответ

11

Ошибка сегментации заключается в том, что t указывает на область размером менее 7000 байт. Возможно, вы пытаетесь прочитать в области, когда отображаемая страница не отображается (после окончания строкового литерала "Working on RedHat Linux"). Вы должны ограничить memcpy до sizeof("Working on RedHat Linux") байтов.

2

Использование:

memcpy(s, t, strlen(t) + 1); 

избежать memcpy чтения мимо строки буквального массива.

Стандарт C говорит о строковых функциях (memcpy является функцией string.h) (C99, 7.21.1p1).

«Если доступ к массиву осуществляется за пределами объекта, поведение не определено».

4

Ваша программа имеет неопределенное поведение: для тетсра(), чтобы работать, как источника и назначения должен быть адресацией для числа байт, которые вы указали.

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

Кроме того, вы можете удалить sizeof(char), как это определено стандартом, чтобы всегда быть 1.

+0

Hey Занято русским, спасибо за ответ. Я не получаю заявление «Вы удовлетворены пунктом назначения, но не исходной частью». Почему мне нужно удовлетворять исходную часть? – sach

+0

@NikhilTej: Потому что 't' меньше 7000 байтов. –

+0

@NikhilTej - у вас есть 24 байта, и вы сообщаете ему, чтобы он копировал 7000. Как только он достигнет конца 24 байтов, на самом деле у вас есть его, он отключается на неизведанной (неопределенной) территории. Вы не знаете, что находится в памяти за пределами 24 байтов строкового литерала ('t'). –

1

т указывает на строку буфера длиной 24, но в тетсру вы пытаетесь скопировать более чем (7000) которых нет.

Вы пытаетесь получить доступ к памяти за пределами выделенного. Так что он дает ошибку сегментации

+0

Длина строки - 23. Размер массива строковых литералов равен 24. – ouah

+0

Да, правильно, я имел в виду общую длину буфера, а не strlen –

+0

Эй, Сумит Джайн, я выделил память 8000 байт для s. Но копирование только до 7000 байт.Тогда почему это должно привести к ошибке сегментации – sach

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