我编译了我的代码,前两次崩溃了。我没有改变一个东西,并且再次编译愤怒,第三和第四个编译过程运行良好,没有任何崩溃。
前两次崩溃没有立即发生,它已经打印了我的printf声明,并立即被强行关闭。
这是我的代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
char testString[] = "Yiu Rules";
char* destString = (char*)malloc(sizeof(strlen(testString))*2);
strcpy(destString, testString);
printf("%s", destString);
free(destString);
return 0;
}
有什么想法吗?
答案 0 :(得分:2)
您分配sizeof(strlen(testString)) * 2
个字节的内存。这似乎没有意义。 sizeof(strlen(testString)) * 2
为sizeof(size_t) * 2
,通常对您的字符串不够。
sizeof(size_t) * 2
通常分别是64位或32位平台上的16或8字节内存。在64位平台上,您的代码将“生存”,因为您的字符串确实适合16个字节。但是在32位平台上它不适合,它会超出分配的内存并损坏堆。
此
char* destString = malloc(strlen(testString) * 2);
会有所帮助(如果你想尝试分配内存),但sizeof
来自哪里,为什么我不清楚。
答案 1 :(得分:1)
sizeof(strlen(testString))
不是您认为的那样。您计算strlen
返回的值的大小(以字节为单位),即size_t
。
只需使用strlen(testString)
。
这就是为什么strcpy
不是一个安全的功能,你应该使用strncpy
。
答案 2 :(得分:0)
sizeof(strlen(testString))确实是不正确的,但它仍然显示了一个很好的做法,即使用应用于char类型的sizeof运算符。在你的情况下,你在size_t上使用sizeof不是你想要的,strlen已经给你想要传递给malloc的字节数,但是如果你想使用sizeof,这是一个正确的方法:
(char *)malloc(sizeof(char) * strlen(testString) * 2 + 1).
注意malloc末尾的+ 1:strlen不计算它计算长度的字符串的终止NULL字节。您的strcpy可能会起作用,但您最终可能会遇到总线错误或某种错误,因为您尝试将\ 0(在strcpy中)附加到未预留的内存部分。
此外,你的malloc可能会返回你已经使用过的内存区域(但它很少发生在你提供的短程序中)所以你可以在分配之后使用bzero,以确保你正在使用干净的记忆。