2013-11-25 9 views
1

У меня проблема с пониманием strlen и/или memcpy. Это фрагмент кода:Strlen вызывает segfault

char * restP; 
char * str; 
//this returns a pointer 
restP = strrstr (input_buffer, "pointer"); 
//this prints this pointer 
printf("%p\n", restP); 

str = malloc(50000); 

//this is wrong, restP is a pointer to a sring; i can print it with printf("%s", restP); it just a part of input_buffer 

memcpy(restP, str, strlen(restP)-1); 

StrLen (restP) дает мне ошибку - segmentation fault. Может кто-то может дать мне ключ, что я делаю неправильно.

+0

Вы уверены, что это 'strlen', а не' memcpy'? – dreamlax

+1

У вас есть первые 2 аргумента memcpy, которые были отменены –

+0

Вы не выделили память для переменной restP. –

ответ

3

Похоже, что ваши аргументы memcpy неверны. Первым аргументом является адресат, второй аргумент - источник. Похоже, вы хотите скопировать содержимое restP в str. .

memcpy(str, restP, strlen(restP) + 1); 

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

  1. str Вы знаете достаточно долго, и она инициализируется до нуля, так что любой подходящий размер строка, которая копируется в него будет заканчиваться нулевым символом.

  2. Вы не ва nt, чтобы скопировать последний символ исходной строки.

3

Strlen подсчитывает символы, пока не достигнет символа NUL ('\ 0'). Убедитесь, что ваша строка содержит этот символ, иначе strlen будет подсчитывать границы массива, когда появляется ошибка сегментации. C не обеспечивает проверку границ массива.

Кроме того, проверьте, действительно ли указатель, который вы передаете, (то есть он не является нулевым).

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