【发布时间】: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不能那样工作。您将 strcpy 到filePath然后 strcat -
另外,您没有为空终止符 (+ 1) 分配空间,
sizeof(char)根据定义为 1。 -
复制字符串时,
strcat()将输入字符串复制到并包括零终止符。您的malloc()大小不允许出现该零终止符,因此比需要的字符短一个。因此,strcat()写入了filePath的分配端,这会给出未定义的行为。给定两个字符串文字时,甚至不应该编译strcat()的调用。如果是这样,那么要么你的代码以某种你没有显示的方式强制它,要么你的编译器/库有缺陷。我会打赌前者。
标签: c segmentation-fault dynamic-memory-allocation