C -是malloc + strcpy函数,和calloc一样好



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

我读过好几遍malloc和calloc的区别。如果您对速度有问题,您应该使用malloc,因为malloc分配+初始化缓冲区为0。

现在,在我的例子中,我应该坚持使用malloc,因为它更快,但我仍然想确保我仍然得到正确的数据。

在malloc之后调用strcpy和调用calloc一样好吗?我知道callc不能将一个string对象的值复制到另一个。但我想知道,既然你用了strcpy,它是否和calloc一样安全?


[update from comment:]

我声明并分配请求的内存。

char * commands = malloc(1000); 

然后编写我需要的awk命令并将其保存在命令中。

strcpy(commands,"awk '{ print $0}' running-config.txt" ); 

我就是这么用的。

在malloc之后调用strcpy和调用calloc一样好吗?

不,因为strcpy(buffer, "")只将内存的1st字节设置为0,而calloc()将分配的整个内存归零。

strcpy(buffer, "");等价于buffer[0] = '';。我倾向于说后者更快。

strcpy()的行为是否足够初始化取决于上下文/用例。


更新:

根据您更新的问题,似乎不需要在分配时初始化内存。(例如,通过使用calloc(),就像调用strcpy()一样。但是要注意,strcpy()会留下未初始化的所有未使用的内存(在allcoated内存之外)。在分配的1000个字节中,只有strlen("awk '{ print $0}' running-config.txt") + 1个字节被初始化。

实际上在malloc之后调用memset更接近于调用calloc,而不是您建议的选项。在malloc之后仍然使用memset将在最好的情况下与calloc一样快。如果您需要确保内存初始化为0,没有比使用calloc更好的选择了。

由于命令变量是char *,您可能会将其解释为以空结束的字符数组(缓冲区),因此要初始化,

commands[0] = 0; 

足以具有以null结尾的空字符串,当您有一个真正的字符串要复制时,您可以使用strcpy将所有字符从源复制到目标,包括以null结尾的字符。你必须小心缓冲区溢出。如果你不确定缓冲区溢出,安全的做法是使用strncpy,例如

const int SIZE = 1000; // or #define SIZE 1000
char * commands = malloc(SIZE);
strncpy(commands, src, SIZE-1 );
command[SIZE-1] = 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稍微慢一点,因为它将0写入内存的最后一个字节,而这些字节不会被程序使用。

我推荐的做法:

size_t n = sizeof("hello");
char* str = malloc(n);
if(str == NULL) 
  handle_error();
memcpy(str, "hello", n);

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

相关内容

  • 没有找到相关文章

最新更新