使用strcpy时出现分段错误?

我试图通过传递在编译时定义路径:

-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指针的复杂性吗?

谢谢

 char * ptr_path; strcpy(ptr_path, DCROOTDEF); 

你永远不会初始化ptr_path

它在第二个代码片段中不起作用,你只是运气不好而且似乎有效。 你仍在使用一个未初始化的指针,并试图写入谁知道在内存中的位置。

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

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

您需要调用例如malloc()来获取空间,首先:

 char * ptr_path = malloc(PATH_MAX); 

或类似的东西。

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

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