![](/img/trans.png)
[英]How the memory is organized when I declare this array of chars pointer? "char* op[30]"
[英]How do I use char** ? (pointer to an array of chars)
所以我正在嘗試制作一個char**
,我完全理解它在后台是如何工作的以及所有這些東西,但我似乎不明白如何為它編寫代碼。 我想創建一個指向其中有名稱的字符數組的指針。 我需要幫助在其中存儲字符串(使用 strcpy() )並在此之后打印它。
char** name = (char**)malloc((strlen("MyName") + 1) * sizeof(char*));
strcpy(name, "MyName"); // I get an error right here
如果你真的想要一個指向 char 數組的指針,你可以執行以下操作:
char** name = (char**)malloc(sizeof(char*)); //initialize the pointer
*name = (char*)malloc((strlen("MyName") + 1) * sizeof(char)); //initialize the array
strcpy(*name, "MyName");
您應該理解的第一件事是,將變量聲明為單指針或雙指針(或任何其他 n 指針)實際上並不能說明底層變量是保存單個值還是值數組。
單個指針指向存儲實際值的內存地址。 雙指針指向存儲單指針的內存地址,依此類推。
現在,要創建指向 char 指針數組的指針,您可以使用單個 char 指針 ( char*
),但出於可維護性目的,我建議使用雙 char 指針 ( char**
)。
考慮以下代碼:
char** names = (char**)malloc(100 * sizeof(char*));
它將為堆上的 100 個字符指針 ( char*
) 分配內存空間,並返回一個雙指針 ( char**
) 到該內存空間中的第一個單指針 ( char*
)。 這意味着您將能夠在該內存空間中保存 100 個字符指針(或在您的情況下為 100 個名稱)。 然后你可以像這樣使用它們:
char* name0 = "First Name"; // Saved on stack
char* name1 = malloc((strlen("Second Name") + 1) * sizeof(char)); // Saved on heap
strcpy(name1, "Second Name");
names[0] = name0;
names[1] = name1;
另外,請注意,在堆上保存字符串時,您需要為空字符再添加一個位置(手動)。
所以我正在嘗試制作一個
char**
,我完全理解它在后台是如何工作的以及所有這些東西,但我似乎不明白如何為它編寫代碼。
嗯……不,不完全是。
要聲明一個指向 char的指針,您只需 decalre:
char *name = malloc (strlen("MyName") + 1);
為什么? 當您調用malloc
, malloc
分配一塊內存,提供strlen("MyName") + 1
個字節,並將起始地址返回到該內存塊 - 您分配給name
。 然后,您可以將"MyName"
復制到 name(空終止字符剩余 1 個字節)。 方法是:
size_t len = strlen ("MyName");
char *name = malloc (len + 1); /* allocate len + 1 bytes */
if (name == NULL) { /* validate EVERY allocation */
perror ("malloc-name");
/* handle error by returning or exiting */
}
memcpy (name, "MyName", len + 1); /* no need to scan again for \0 */
/* do something with name - here */
free (name); /* don't forget to free name when you are done */
那么char**
做什么呢?
當您處理指向字符的指針時,您必須首先分配一定數量的指針,然后您可以為每個指針分配和分配一塊內存,並像以前一樣使用每個指針上面的name
。
例如:
/* array of ponters to string-literals for your source of strings */
char *band[] = { "George", "Ringo", "Paul", "John" };
char **names;
size_t nmembers = sizeof band / sizeof *band;
/* allocate nmembers pointers */
names = malloc (nmembers * sizeof *names);
if (names == NULL) { /* validate EVERY allocation */
perror ("malloc-name_pointers");
/* handle error by returning or exiting */
}
/* now loop allocating for each name and copy */
for (size_t i = 0; i < nmembers; i++) {
size_t len = strlen (band[i]); /* get length */
names[i] = malloc (len + 1); /* allocate */
if (names[i] == NULL) { /* validate EVERY allocation */
perror ("malloc-names[i]");
/* handle error by returning or exiting */
}
memcpy (names[i], band[i], len + 1);/* no need to scan again for \0 */
}
/* output each */
for (size_t i = 0; i < nmembers; i++)
printf ("member[%zu]: %s\n", i + 1, names[i]);
釋放names
是一個兩步過程。 您必須釋放分配給每個names
指針的內存,然后釋放指針本身,例如
for (size_t i = 0; i < nmembers; i++)
free (names[i]); /* free each allocated names[i] */
free (names); /* free pointers */
現在希望你更密切地"... fully understand how it works"
。 如果您有任何問題,請告訴我。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.