何时将 malloc 用于 char 指针

Posted

技术标签:

【中文标题】何时将 malloc 用于 char 指针【英文标题】:When to use malloc for char pointers 【发布时间】:2010-12-19 19:22:28 【问题描述】:

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

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

malloc 会为了这样微不足道的事情而存在吗?如果是,为什么?如果没有,那么什么时候需要 char 指针?

【问题讨论】:

【参考方案1】:

正如其他人所指出的,您不需要使用 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 */

【讨论】:

会有什么问题:char *foo = "bar";字符 *bar = foo; printf("%s\n", bar); 首先,它应该是const char *foo...,其次,在您的示例中,它只是复制指针,而不是数据。 strdup() 实际上也复制了数据。 此处建议进行编辑,将 malloc 的结果转换为 (char *)。在 C++ 中使用此代码时需要这样做,但通常此代码不应在 C++ 中使用,因此我恢复了编辑。【参考方案2】:

malloc 用于在 free-store 上分配内存。如果您有一个不想修改的字符串文字,则可以:

char *literal = "foo";

但是,如果您希望能够对其进行修改,将其用作缓冲区以保存一行输入等等,请使用malloc

char *buf = (char*) malloc(BUFSIZE); /* define BUFSIZE before */
// ...
free(buf);

【讨论】:

【参考方案3】:

当您不知道编译期间所需的内存量时,请使用malloc()。如果您有只读字符串,则可以使用 const char* str = "something"; 。请注意,字符串很可能存储在只读内存位置,您将无法修改它。另一方面,如果您在编译器期间知道字符串,那么您可以执行以下操作:char str[10]; strcpy(str, "Something"); 这里内存是从堆栈分配的,您将能够修改 str。第三种情况是使用 malloc 进行分配。假设您在编译期间不知道字符串的长度。那你就可以char* str = malloc(requiredMem); strcpy(str, "Something"); free(str);

【讨论】:

【参考方案4】:

malloc 用于单个字符或整数,calloc 用于动态数组。即pointer = ((int *)malloc(sizeof(int)) == NULL),您可以在malloc 的括号内进行算术运算,但您不应该使用calloc,它的定义为void calloc(count, size),这意味着您要存储多少项目,即数据的计数和大小,即intchar

【讨论】:

【参考方案5】:

每次在编译时不确定字符串的大小时,您都必须使用 malloc(或某些等效方法)分配内存。在您的情况下,您在编译时知道字符串的大小(sizeof("something") 和 sizeof("something else"))。

【讨论】:

以上是关于何时将 malloc 用于 char 指针的主要内容,如果未能解决你的问题,请参考以下文章

为啥在将 malloc() 的指针分配给 char* 时会出现段错误?

用于多级指针取消引用?

双指针将 char 数组值分配给 char 数组,结构使用 char 指针

指针 分配空间

c语言指针变量?

为什么要malloc(),何时要malloc()?如何使用malloc()?