【问题标题】:Why does the strcat function give me a segmentation fault? [duplicate]为什么 strcat 函数会给我一个分段错误? [复制]
【发布时间】:2018-11-11 09:56:31
【问题描述】:

我想连接“/bin/”和“touch”,这样我就有了“/bin/touch”。

在我的程序中,我有

        char* filePath = malloc((strlen("/bin/") + strlen(rv[0]))* sizeof(char));
        filePath = strcat("/bin/",rv[0])

首先,rv[0] 包含一个字符串“touch”。我使用 malloc 函数在内存中分配 10 个字节,filePath 将是指向这 10 个字节内存的指针。因为,串联的字符串(“/bin/touch”)的总长度为10。

程序正常执行,直到第二行给我一个分段错误。我在 strcat 函数上犯了什么错误吗?

【问题讨论】:

  • 您正在 追加 到字符串文字。 strcat 不能那样工作。您将 strcpyfilePath 然后 strcat
  • 另外,您没有为空终止符 (+ 1) 分配空间,sizeof(char) 根据定义为 1。
  • 复制字符串时,strcat() 将输入字符串复制到并包括零终止符。您的 malloc() 大小不允许出现该零终止符,因此比需要的字符短一个。因此,strcat() 写入了 filePath 的分配端,这会给出未定义的行为。给定两个字符串文字时,甚至不应该编译 strcat() 的调用。如果是这样,那么要么你的代码以某种你没有显示的方式强制它,要么你的编译器/库有缺陷。我会打赌前者。

标签: c segmentation-fault dynamic-memory-allocation


【解决方案1】:

看看reference如何使用strcat

char *strcat( char *dest, const char *src );

src 指向的空终止字节串的副本附加到dest 指向的空终止字节串的末尾。

因此,第一个参数必须是指向足够大的内存位置的指针,以容纳已经存在的 C 字符串和 src 指向的 C 字符串的字节。

您调用strcat("/bin/",rv[0]) 并因此尝试写入存储字符串文字“/bin/”的内存.. 通常在只读内存中,因此您会遇到分段错误。

您需要先将"/bin/" 复制到filePath 指向的分配内存中,然后在此处附加rv[0]

【讨论】:

    猜你喜欢
    • 2021-10-12
    • 2015-12-19
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多