【发布时间】:2010-12-19 19:22:28
【问题描述】:
我特别关注何时在 char 指针上使用 malloc
char *ptr;
ptr = "something";
...code...
...code...
ptr = "something else";
malloc 会为了这样微不足道的事情而存在吗?如果是,为什么?如果没有,那么什么时候需要 char 指针?
【问题讨论】:
我特别关注何时在 char 指针上使用 malloc
char *ptr;
ptr = "something";
...code...
...code...
ptr = "something else";
malloc 会为了这样微不足道的事情而存在吗?如果是,为什么?如果没有,那么什么时候需要 char 指针?
【问题讨论】:
正如其他人所指出的,您不需要使用 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 */
【讨论】:
const char *foo...,其次,在您的示例中,它只是复制指针,而不是数据。 strdup() 实际上也复制了数据。
(char *)。在 C++ 中使用此代码时需要这样做,但通常此代码不应在 C++ 中使用,因此我恢复了编辑。
malloc 用于在 free-store 上分配内存。如果您有一个不想修改的字符串文字,则可以:
char *literal = "foo";
但是,如果您希望能够对其进行修改,将其用作缓冲区以保存一行输入等等,请使用malloc:
char *buf = (char*) malloc(BUFSIZE); /* define BUFSIZE before */
// ...
free(buf);
【讨论】:
当您不知道编译期间所需的内存量时,请使用malloc()。如果您有只读字符串,则可以使用 const char* str = "something"; 。请注意,字符串很可能存储在只读内存位置,您将无法修改它。另一方面,如果您在编译器期间知道字符串,那么您可以执行以下操作:char str[10]; strcpy(str, "Something"); 这里内存是从堆栈分配的,您将能够修改 str。第三种情况是使用 malloc 进行分配。假设您在编译期间不知道字符串的长度。那你就可以char* str = malloc(requiredMem); strcpy(str, "Something"); free(str);
【讨论】:
malloc 用于单个字符或整数,calloc 用于动态数组。即pointer = ((int *)malloc(sizeof(int)) == NULL),您可以在malloc 的括号内进行算术运算,但您不应该使用calloc,它的定义为void calloc(count, size),这意味着您要存储多少项目,即数据的计数和大小,即int、char等
【讨论】:
每次在编译时不确定字符串的大小时,您都必须使用 malloc(或某些等效方法)分配内存。在您的情况下,您在编译时知道字符串的大小(sizeof("something") 和 sizeof("something else"))。
【讨论】: