[英]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)
這表示要存儲多少項,即數據的計數和大小,即int
, char
等。
每次在編譯時未確定字符串的大小時,您必須使用malloc(或某種等效方法)分配內存。 在你的情況下,你知道你的字符串在編譯時的大小(sizeof(“something”)和sizeof(“其他東西”))。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.