malloc + strcpy函数和calloc一样好吗?

时间:2014-08-11 11:21:02

标签: c malloc strcpy calloc

我一直在寻找我的问题的答案,但我找不到任何答案。

我已经多次阅读过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" ); 

这就是我使用它的方式。

4 个答案:

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

memcpystrcpy快,并且还强制您指定缓冲区大小。还要注意,在上面的例子中,n实际上是6,因为字符串文字“hello”由5个字符+ 1个空终止组成。程序员倾向于忘记空终止,例如只有mallocing strlen()字节的空格,而实际上他们需要strlen()+ 1.