伙计我正在生成一个字符串,该字符串覆盖文件的路径,连接宏和字符串。功能如下:
char *userPath(char *username)
{
char *path = (char*)malloc(sizeof(char) * (strlen(MAILBOXES) + strlen(username) + 1));
path[0] = '\0';
strcat(path, MAILBOXES);
strcat(path, "/");
strcat(path, username);
return path;
}
返回的指针引用了一个正确的字符串,但是在调用了这个函数后,该进程抛出了一个非常糟糕的 * glibc检测到的 ./mmboxd: malloc():内存损坏:0x085310a8 * *带有相对回溯。我知道这就是问题,因为我一旦实现它就开始出现这个错误,也因为我使用的唯一malloc就在这里。这段代码出了什么问题?
答案 0 :(得分:9)
+1应该是+2,以考虑您添加的分隔符和空终止符。你可以省略sizeof(char),它总是1。
答案 1 :(得分:4)
问题在于:
char *path = (char*)malloc(sizeof(char) * (strlen(MAILBOXES) + strlen(username) + 1));
你正在为a MAILBOXES
中的所有字符分配足够的内存,b)username
中的所有字符,以及c)'/'
字符,但你忘记了d)终止'\0'
字符!因此+ 1
应为+ 2
您的代码还有其他一些奇怪之处,但它们并没有错,只是可以做得更好的事情:
malloc
的返回值,有些人(比如我)认为这种风格很糟糕,因为你不仅仅是谷歌搜索。sizeof(char)
始终为1(这在标准中定义)。有人说要保持对称性。有人说把它拿出来,因为它是一个。有人说将其更改为sizeof *path
,因此如果您将path
更改为wchar_t *
,则malloc
会正确调整,以便继续分配正确的尺寸。strcat
将第一位数据写入字符串可能效率低下。为什么不放弃path[0] = '\0';
行,只使用strcpy
作为第一位数据?strcat
,它将重新遍历(先前计算的)长度以找到正确的位置。如果您存储了两个strlen
调用的结果,则无需使用strcat
并且不必要地重新计算字符串结尾的位置。strcat
附加单个字符效率低下。malloc
的成功或失败的返回值。答案 2 :(得分:2)
您似乎没有为零终结符留出空间。你应该为此分配一个额外的char
。
我假设+1
中的malloc()
用于路径分隔符。设为+2
,你就可以为终止空字符留出空间。
答案 3 :(得分:1)
当您分配“路径”字符串时,您忘记添加在MAILBOXES和用户名之间添加的“/”字符的长度。
答案 4 :(得分:1)
看来你需要malloc另一个字节进行零终止。
答案 5 :(得分:1)
您需要为空字符“\ x00”分配一个额外字节作为C字符串中的字符串终止符。
目前,您只为/ character分配一个额外字节。
所以尝试+2而不是+1
答案 6 :(得分:1)
您没有在char中终止null的预算。您的malloc长度应为+2,而不是+1。
答案 7 :(得分:1)
+1
结尾的malloc()
代表/
。但是最后需要空格用于空字符,由strcat()
添加。所以它是+2
。
char *path = (char*)malloc(sizeof(char) * (strlen(MAILBOXES) + strlen(username) + 2));