Ошибка сегментации при использовании strcpy? - PullRequest
2 голосов
/ 27 августа 2010

Я пытаюсь определить путь во время компиляции, передав:

-DDCROOTDEF='"/path/to/stuff"'

в строке компиляции.Затем я пытаюсь использовать это в коде вроде:

char * ptr_path;  
strcpy(ptr_path, DCROOTDEF);
strcat(ptr_path,"/MainCommons/CommonLib/fonts/Arial.ttf");
char *pftf=ptr_path;
gdImageStringFT(pimg,brect,iclr,pftf,pts,ang,ixp,iyp, (char *)cbuf);

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

char * ptr_path;
strcpy(ptr_path, DCROOTDEF);
strcat(ptr_path,"/MainCommons/CommonLib/fonts/Arial.ttf");
char *pftf=ptr_path;
printf("%s\n",pftf);
gdImageStringFT(pimg,brect,iclr,pftf,pts,ang,ixp,iyp, (char *)cbuf);

Это работает просто отлично.Какую сложность указателя символа я здесь упускаю?

Спасибо

Ответы [ 3 ]

3 голосов
/ 27 августа 2010
char * ptr_path;
strcpy(ptr_path, DCROOTDEF);

Вы никогда не инициализируете ptr_path.

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

Вам нужно инициализировать ptr_path, чтобы он указывал на массив char длиной не менее strlen(DCROOTDEF) + 1. Вам также необходимо проверить длину DCROOTDEF перед копированием его содержимого в массив, чтобы убедиться, что он не слишком длинный. Вы можете сделать это вручную, используя strlen, или использовать функцию копирования с проверкой длины, например strlcpy.

1 голос
/ 27 августа 2010

В

char * ptr_path;
strcpy(ptr_path, DCROOTDEF);
strcat(ptr_path,"/MainCommons/CommonLib/fonts/Arial.ttf");

указатель не привязан к законно выделенному блоку памяти, поэтому ваша программа работает с неопределенным поведением.Сначала нужно выделить буфер - например, используя malloc().Убедитесь, что буфер достаточно большой, чтобы вместить полученную строку вместе с завершающим нулевым символом.

1 голос
/ 27 августа 2010

Указатель ptr_path не инициализируется, чтобы указывать на доступную для записи память, поэтому разыменование его с помощью strcpy() дает сбой.

Вам нужно позвонить, например, malloc() чтобы получить пробел, сначала:

char * ptr_path = malloc(PATH_MAX);

Или что-то в этом роде.

...