何时使用malloc作为char指针

时间:2009-11-24 08:28:42

标签: c pointers malloc char

我特别关注何时在char指针上使用malloc

char *ptr;
ptr = "something";
...code...
...code...
ptr = "something else";

malloc会不会像这样简单的东西?如果是,为什么?如果没有,那么什么时候需要char指针?

5 个答案:

答案 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),这意味着你想要多少项目存储即数据的计数和大小,即intchar等。

答案 4 :(得分:1)

每次编译时字符串的大小未确定时,您必须使用malloc(或某种等效方法)分配内存。在你的情况下,你知道你的字符串在编译时的大小(sizeof(“something”)和sizeof(“其他东西”))。