我一直在寻找我的问题的答案,但是我找不到任何。
我读过好几遍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);
memcpy
比strcpy
更快,并且还强制您指定缓冲区大小。还要注意,在上面的例子中,n
实际上是6,因为字符串字面量"hello"由5个字符+ 1个null终止组成。程序员倾向于忘记null终止,例如只错置strlen()字节的空间,而实际上他们需要strlen() + 1。