我正在尝试通过传递:
在编译时定义路径-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指针的复杂性?
由于
答案 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()
。确保缓冲区足够大,以便将结果字符串与终止空字符一起保存。