c - 何时对字符指针使用 malloc

标签 c pointers malloc char

我特别关注何时对字符指针使用 malloc

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

malloc 是否适合像这样微不足道的事情?如果是,为什么?如果不是,那么什么时候需要字符指针?

最佳答案

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

关于c - 何时对字符指针使用 malloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1788655/

相关文章:

使用 Ruby 调用命令行工具

C 程序打印出的数字高于预期

c - 使用转义字符从 Sysfs 路径读取长值

c - 将节点添加到链表中的随机位置

c - 这段代码(在描述中)如何工作?

c - 重命名函数而不更改其引用

c++ - 在 C++ 中将二维数组更改为 1 的函数

无法从 Fortran 90 中返回的 C 浮点指针获取数据

c - 堆内存 C 中的二维结构数组

c - 函数内动态重新分配 - C