[英]When to use malloc for char pointers
我特别关注何时在char指针上使用malloc
char *ptr;
ptr = "something";
...code...
...code...
ptr = "something else";
malloc是否会为了这个微不足道的东西? 如果是,为什么? 如果没有,那么什么时候需要char指针?
正如其他人所指出的那样,您不需要使用malloc来执行以下操作:
const char *foo = "bar";
原因恰恰在于*foo
是一个指针 - 当你初始化foo
你没有创建字符串的副本,只是一个指向"bar"
存在于可执行文件数据部分中的位置的指针。 您可以根据需要随时复制该指针,但请记住,它们总是指向该字符串的同一个单个实例。
那么什么时候应该使用malloc? 通常使用strdup()
复制一个字符串,该字符串在后台处理malloc。 例如
const char *foo = "bar";
char *bar = strdup(foo); /* now contains a new copy of "bar" */
printf("%s\n", bar); /* prints "bar" */
free(bar); /* frees memory created by strdup */
现在,我们终于解决了一个案例,如果您正在使用sprintf()
或者更安全地创建/格式化新字符串的snprintf()
,您可能需要malloc。
char *foo = malloc(sizeof(char) * 1024); /* buffer for 1024 chars */
snprintf(foo, 1024, "%s - %s\n", "foo", "bar"); /* puts "foo - bar\n" in foo */
printf(foo); /* prints "foo - bar" */
free(foo); /* frees mem from malloc */
malloc
用于在免费商店分配内存。 如果你有一个字符串文字,你不想修改以下是好的:
char *literal = "foo";
但是,如果您希望能够修改它,使用它作为缓冲区来保存输入行,依此类推,使用malloc
:
char *buf = (char*) malloc(BUFSIZE); /* define BUFSIZE before */
// ...
free(buf);
如果在编译期间不知道所需的内存量,请使用malloc()
。 如果你有只读字符串,那么你可以使用const char* str = "something";
。 请注意,该字符串很可能存储在只读存储器位置,您将无法修改它。 另一方面,如果您在编译时知道字符串,那么您可以执行以下操作: char str[10]; strcpy(str, "Something");
char str[10]; strcpy(str, "Something");
这里的内存是从堆栈中分配的,你可以修改str。 第三种情况是使用malloc进行分配。 让我们说你在编译期间不知道字符串的长度。 然后你可以做char* str = malloc(requiredMem); strcpy(str, "Something"); free(str);
char* str = malloc(requiredMem); strcpy(str, "Something"); free(str);
用于单个字符或整数的malloc和用于动态数组的calloc。 即pointer = ((int *)malloc(sizeof(int)) == NULL)
你可以的括号内做算术题malloc
,但你不应该因为你应该使用calloc
其中有定义void calloc(count, size)
这表示要存储多少项,即数据的计数和大小,即int
, char
等。
每次在编译时未确定字符串的大小时,您必须使用malloc(或某种等效方法)分配内存。 在你的情况下,你知道你的字符串在编译时的大小(sizeof(“something”)和sizeof(“其他东西”))。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.