何时将 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)
,这意味着您要存储多少项目,即数据的计数和大小,即int
、char
等
【讨论】:
【参考方案5】:每次在编译时不确定字符串的大小时,您都必须使用 malloc(或某些等效方法)分配内存。在您的情况下,您在编译时知道字符串的大小(sizeof("something") 和 sizeof("something else"))。
【讨论】:
以上是关于何时将 malloc 用于 char 指针的主要内容,如果未能解决你的问题,请参考以下文章
为啥在将 malloc() 的指针分配给 char* 时会出现段错误?