使用strcpy时出现分段错误?

时间:2010-08-27 14:03:57

标签: c string pointers char

我正在尝试通过传递:

在编译时定义路径
-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);

它运作得很好。我错过了char指针的复杂性?

由于

3 个答案:

答案 0 :(得分:3)

char * ptr_path;
strcpy(ptr_path, DCROOTDEF);

您永远不会初始化ptr_path

它在第二个代码段中不起作用,你只是运气不好而出现才能工作。你还在使用一个未初始化的指针,并试图写信给谁知道记忆中的位置。

您需要初始化ptr_path以指向长度至少为char的{​​{1}}数组。在将其内容复制到数组之前,还需要检查strlen(DCROOTDEF) + 1的长度,以确保它不会太长。您可以使用DCROOTDEF手动执行此操作,也可以使用strlen等经过长度检查的复制功能。

答案 1 :(得分:1)

指针ptr_path未初始化为指向可写内存,这就是使用strcpy()取消引用它的原因。

您需要致电,例如malloc()获得空间,首先:

char * ptr_path = malloc(PATH_MAX);

或类似的东西。

答案 2 :(得分:1)

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

指针未绑定到合法分配的内存块,因此您的程序会运行到未定义的行为。您需要先分配缓冲区 - 例如使用malloc()。确保缓冲区足够大,以便将结果字符串与终止空字符一起保存。