簡體   English   中英

指針數組初始化

[英]Array of pointers initialization

 char **arr;
 arr = (char **)calloc(1,sizeof(char*));

 for(i = 0; i< 16; i++)
    if(arr[i] = (char *)calloc(1, 2*sizeof(char)) == NULL)
        perror("Memory cannot be allocated to arr[i]", %d);

當我嘗試將內存分配給arr [i]時,以上代碼在for循環內引發錯誤。 此分配有什么問題嗎? 本質上,我想存儲長度為2的16個字符串。我也嘗試過使用指針數組(char * arr [16])。 我嘗試使用malloc()和calloc()在雙指針初始化中尋找資源,但找不到很多。 如果您可以指出一些鏈接,將不勝感激。 謝謝。

您需要為16個指針分配內存,而不僅僅是一個。

arr = (char **)calloc(16, sizeof(char*));

您的代碼會發生什么情況,就是arr僅對一個指針具有足夠的內存,因此arr[0] = <something>是正確的,但是arr[1]及更高版本會觸及不屬於該程序的內存。

此外,分配字符串指針的方法是錯誤的。 您要分配0或1個值,具體取決於callocNULL的結果。 您需要在其中添加括號:

if ((arr[i] = (char *)calloc(1, 2*sizeof(char))) == NULL)
    perror("Memory cannot be allocated to arr[%d]", i);

甚至更好:

for(i = 0; i < 16; i++) {
    arr[i] = (char *)calloc(1, 2*sizeof(char));
    if (arr[i] == NULL) {
        perror("Memory cannot be allocated to arr[%d]", i);
    }
}

使用calloc ,通常使用第一個參數傳遞數組中元素的數量,第二個參數傳遞元素的大小。 因此,要分配一個包含16個指針的數組,通常使用calloc(16, <pointer size>) ,而不是calloc(1, 16 * <pointer size>) 1,16 calloc(1, 16 * <pointer size>) ,盡管兩者都做同樣的事情。 在您的代碼中,您顯然完全忘記了16,而只分配了1個指針。

不要轉換'calloc'的結果。

在為內存分配函數計算大小時,避免使用sizeof(<type>) 最好改用sizeof *<pointer>

如果要存儲長度為2的小節,則需要至少3個字符長的緩沖區(對於零終止符,需要額外的字符)。

內存分配失敗通常不會設置errno ,因此perror在此處不適合使用。

if條件缺失括號, if您分配給arr[i] 操作關聯不正確。 它不會按原樣編譯。

char **arr; 
arr = calloc(16, sizeof *arr); 
for(i = 0; i < 16; i++)
    if((arr[i] = calloc(3, sizeof *arr[i]) == NULL)
        fprintf(stderr, "Memory cannot be allocated");

最后,未命名的“魔術常數”(16和3)在大多數情況下不是一個好主意。

arr = (char **)calloc(1,sizeof(char*));

分配一個指向char的指針。

本質上,我想存儲16個長度為2的字符串

char **arr = calloc(16, sizeof *arr);

if (!arr) exit(-1); /* bail out somehow */

for(i = 0; i < 16; i++)
  if((arr[i] = calloc(2, sizeof *arr[ i ])) == NULL)
    printf("Memory cannot be allocated to arr[ %d ]", i + 1);

還要在if條件和printf語句中檢查括號。 您的代碼是否可以編譯?

直接存儲兩個字符比存儲指針要便宜,因此我建議刪除一個間接級別並使用連續的內存塊:

char (*arr)[2] = calloc(16, sizeof *arr); 

另外請記住,您的字符序列不能為字符串,因為您沒有為終止0提供內存。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM