繁体   English   中英

何时使用malloc作为char指针

[英]When to use malloc for char pointers

我特别关注何时在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 */

malloc用于在免费商店分配内存。 如果你有一个字符串文字,你不想修改以下是好的:

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"); char str[10]; strcpy(str, "Something"); 这里的内存是从堆栈中分配的,你可以修改str。 第三种情况是使用malloc进行分配。 让我们说你在编译期间不知道字符串的长度。 然后你可以做char* str = malloc(requiredMem); strcpy(str, "Something"); free(str); char* str = malloc(requiredMem); strcpy(str, "Something"); free(str);

用于单个字符或整数的malloc和用于动态数组的calloc。 pointer = ((int *)malloc(sizeof(int)) == NULL)你可以的括号内做算术题malloc ,但你不应该因为你应该使用calloc其中有定义void calloc(count, size)这表示要存储多少项,即数据的计数和大小,即intchar等。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM