连接字符串后,Malloc()内存损坏错误

时间:2011-04-28 18:08:44

标签: c string memory-management strcat

伙计我正在生成一个字符串,该字符串覆盖文件的路径,连接宏和字符串。功能如下:

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就在这里。这段代码出了什么问题?

8 个答案:

答案 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

您的代码还有其他一些奇怪之处,但它们并没有错,只是可以做得更好的事情:

  1. 你不需要在C中转换malloc的返回值,有些人(比如我)认为这种风格很糟糕,因为你不仅仅是谷歌搜索。
  2. sizeof(char)始终为1(这在标准中定义)。有人说要保持对称性。有人说把它拿出来,因为它是一个。有人说将其更改为sizeof *path,因此如果您将path更改为wchar_t *,则malloc会正确调整,以便继续分配正确的尺寸。
  3. 使用strcat将第一位数据写入字符串可能效率低下。为什么不放弃path[0] = '\0';行,只使用strcpy作为第一位数据?
  4. 您计算所有字符串的长度,然后将它们丢弃并使用strcat,它将重新遍历(先前计算的)长度以找到正确的位置。如果您存储了两个strlen调用的结果,则无需使用strcat并且不必要地重新计算字符串结尾的位置。
  5. 使用strcat附加单个字符效率低下。
  6. 在使用之前,您不会检查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));