我一直在寻找我的问题的答案,但我找不到任何答案。
我已经多次阅读过malloc和calloc的不同之处。如果你有速度问题,你应该使用malloc,因为calloc分配+初始化缓冲区为0。
现在,在我的情况下,我应该坚持使用malloc,因为它更快,但我仍然想确保Id仍然获得正确的数据。
在malloc之后调用strcpy和调用calloc一样好吗?我知道calloc不能将字符串1的值复制到另一个。但我想知道它是否像calloc一样安全,因为你使用了strcpy?
[评论更新:]
我声明并分配了需要的内存..
char * commands = malloc(1000);
然后编写我需要的awk命令并将其保存在命令中。
strcpy(commands,"awk '{ print $0}' running-config.txt" );
这就是我使用它的方式。
答案 0 :(得分:3)
在malloc之后调用strcpy和调用calloc一样好吗?
不,因为strcpy(buffer, "")
仅将内存的1 st 字节设置为0
,而calloc()
将分配的整个内存清零。 / p>
strcpy(buffer, "");
相当于buffer[0] = '\0';
。我倾向于说后者更快。
strcpy()
的行为是否足以初始化取决于上下文/用例。
更新
根据您更新的问题,似乎没有必要在分配时初始化内存。 (例如,使用calloc()
,因为对strcpy()
的调用会这样做。但请注意strcpy()
保留未初始化的所有未使用的内存(来自全涂层内存)。这只是{{1分配的1000个字节中的字节被初始化。
答案 1 :(得分:1)
实际上在memset
之后调用malloc
更接近于调用calloc
,而不是您建议的选项。在memset
之后仍然使用malloc
的情况与[{1}}一样快。如果您需要确保将内存初始化为0,则没有比使用calloc
更好的选择。
答案 2 :(得分:0)
因为命令变量是char *,你可能会解释为以null结尾的字符数组(buffer),所以要初始化,
commands[0] = 0;
足以让null终止空字符串,并且每当你有一个真正的字符串要复制时,你可以使用strcpy将所有字符从源复制到目的地,包括空终止字符。缓冲区溢出时要小心。 如果你不确定缓冲区溢出,那么安全就是使用strncpy,例如
const int SIZE = 1000; // or #define SIZE 1000
char * commands = malloc(SIZE);
strncpy(commands, src, SIZE-1 );
command[SIZE-1] = 0;
答案 3 :(得分:0)
malloc分配一个包含垃圾值的数据块。简化示例:
char* str = malloc(10);
str现在指向可以包含任何内容的内存,让我们假设这些内容:
G A R B A G E 1 2 3
然后如果你做strcpy(str, "hello")
,内存将如下所示:
h e l l o 0 E 1 2 3
如果你改为使用calloc(1, sizeof(char))
,那么内存就是:
0 0 0 0 0 0 0 0 0 0
在strcpy(str, "hello")
之后:
h e l l o 0 0 0 0 0
这两个在功能方面完全相同,两者都可以正常工作。唯一的区别是calloc的速度稍慢,因为它会将零写入内存的最后一个字节,而不是程序使用的。
我建议的做法:
size_t n = sizeof("hello");
char* str = malloc(n);
if(str == NULL)
handle_error();
memcpy(str, "hello", n);
memcpy
比strcpy
快,并且还强制您指定缓冲区大小。还要注意,在上面的例子中,n
实际上是6,因为字符串文字“hello”由5个字符+ 1个空终止组成。程序员倾向于忘记空终止,例如只有mallocing strlen()字节的空格,而实际上他们需要strlen()+ 1.