簡體   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