我特别关注何时在char指针上使用malloc
char *ptr;
ptr = "something";
...code...
...code...
ptr = "something else";
malloc会不会像这样简单的东西?如果是,为什么?如果没有,那么什么时候需要char指针?
答案 0 :(得分:32)
正如其他人所指出的那样,您不需要使用malloc来执行:
const char *foo = "bar";
原因恰恰是*foo
是一个指针 - 当你初始化foo
时你没有创建字符串的副本,只是一个指向哪里的指针"bar"
位于可执行文件的数据部分。您可以根据需要随时复制该指针,但请记住,它们总是指向该字符串的同一单个实例。
那你什么时候应该使用malloc?通常使用strdup()
复制字符串,该字符串在后台处理malloc。 e.g。
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 */
答案 1 :(得分:13)
malloc
用于在免费商店分配内存。如果你有一个字符串文字,你不想修改以下是好的:
char *literal = "foo";
但是,如果您希望能够修改它,使用它作为缓冲区来保存一行输入等等,请使用malloc
:
char *buf = (char*) malloc(BUFSIZE); /* define BUFSIZE before */
// ...
free(buf);
答案 2 :(得分:5)
如果在编译期间不知道所需的内存量,请使用malloc()
。如果您有只读字符串,则可以使用const char* str = "something";
。请注意,该字符串很可能存储在只读存储器位置,您将无法修改它。另一方面,如果您在编译时知道字符串,那么您可以执行以下操作:char str[10]; strcpy(str, "Something");
这里内存是从堆栈中分配的,您将能够修改str。第三种情况是使用malloc进行分配。让我们说你在编译期间不知道字符串的长度。然后你可以char* str = malloc(requiredMem); strcpy(str, "Something"); free(str);
答案 3 :(得分:2)
单个字符或整数的malloc和动态数组的calloc。即pointer = ((int *)malloc(sizeof(int)) == NULL)
,你可以在malloc
的括号内进行算术,但你不应该因为你应该使用calloc
来定义void calloc(count, size)
,这意味着你想要多少项目存储即数据的计数和大小,即int
,char
等。
答案 4 :(得分:1)
每次编译时字符串的大小未确定时,您必须使用malloc(或某种等效方法)分配内存。在你的情况下,你知道你的字符串在编译时的大小(sizeof(“something”)和sizeof(“其他东西”))。