何时使用malloc作为char指针

ZPS*_*ZPS 34 c malloc pointers char

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

char *ptr;
ptr = "something";
...code...
...code...
ptr = "something else";
Run Code Online (Sandbox Code Playgroud)

malloc是否会为了这个微不足道的东西?如果是,为什么?如果没有,那么什么时候需要char指针?

sco*_*chi 32

正如其他人所指出的那样,您不需要使用malloc来执行以下操作:

const char *foo = "bar";
Run Code Online (Sandbox Code Playgroud)

原因就在于它*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 */
Run Code Online (Sandbox Code Playgroud)

现在,我们终于解决了一个案例,如果您正在使用malloc,sprintf()或者更安全地snprintf()创建/格式化新字符串.

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 */
Run Code Online (Sandbox Code Playgroud)


dir*_*tly 14

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

char *literal = "foo";
Run Code Online (Sandbox Code Playgroud)

但是,如果您希望能够对其进行修改,请将其用作缓冲区来保存输入行,依此类推,使用malloc:

char *buf = (char*) malloc(BUFSIZE); /* define BUFSIZE before */
// ...
free(buf);
Run Code Online (Sandbox Code Playgroud)


Nav*_*een 5

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