【问题标题】:Segmentation fault when using strcpy?使用 strcpy 时出现分段错误?
【发布时间】:2010-08-27 14:03:56
【问题描述】:

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

-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'怎么样?
  • @karlphillip:\0 自动包含在字符串文字的末尾。

标签: c string pointers char


【解决方案1】:
char * ptr_path;
strcpy(ptr_path, DCROOTDEF);

你永远不会初始化ptr_path

它在第二个代码 sn-p 中不起作用,你只是运气不好,它似乎起作用了。您仍在使用未初始化的指针并尝试写入谁知道内存中的位置。

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

【讨论】:

  • strlcpy 是非标准的,不是吗?
  • @Nyan: strlcpy 是非标准的。您可以轻松find an implementation online
  • 如果它看起来有效,那么它就有效。未定义行为的一个可能结果是您最初的目标行为。很遗憾。
【解决方案2】:

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

你需要打电话给例如malloc()先获取空间:

char * ptr_path = malloc(PATH_MAX);

或者类似的东西。

【讨论】:

  • 你也需要在完成后free()内存。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2019-05-10
    • 1970-01-01
    • 2018-03-17
    • 2020-04-20
    • 1970-01-01
    • 2020-02-28
    • 1970-01-01
    • 1970-01-01
    • 2018-12-15
    相关资源
    最近更新 更多