簡體   English   中英

在C中動態分配的字符串數組

[英]Dynamically allocated string arrays in C

我試圖了解如何在C 99中動態分配數組。無論如何,我有以下代碼:

int main()
{
    char** members=malloc(4*sizeof(*members));
    *members=malloc(5);
    *members="john";
    *(members+1)="shouldn't work";
    printf("%s \n",*members);
    printf("%s",*(members+1));
    return 0;
}

我以為會得到運行時錯誤,因為我沒有分配(members + 1),但實際上它確實打印了“ john”和“ should't work”,而且,它還評估了* members = malloc(5 )行不是必需的。 為什么?

您的作業沒有按照您認為的去做。 當您分配*members*(members+1) ,您是在將char*分配給每個字符串文字,而不是將其復制到已分配(或未分配)的堆內存中。

相反,如果您用strcpy替換您的分配,即:

strcpy(*members, "john");
strcpy(*(members+1), "shouldn't work");

然后,您將在第二個任務上遇到訪問沖突,但不會遇到第一個任務。 同樣,看起來malloc(5)不必要的原因是因為您重新分配了指向字符串文字的指針,而不是將“ john”字符串復制到分配的內存中。

char** members=malloc(4*sizeof(*members));

這意味着您已經創建了一個數組,並為可以存儲字符串地址的四個元素分配了內存。

因此,如果刪除行* members = malloc(5); 然后它也會起作用。

int main()
{
char** members=malloc(4*sizeof(*members));
//*members=malloc(5);
*members="john";
*(members+1)="shouldn't work";
printf("%s \n",*members);
printf("%s",*(members+1));
return 0;
}

也就是說,成員可以容納四個成員,每個成員可以容納字符串的地址。

一些東西:

  1. 對於第一個malloc, malloc(4*sizeof(*members)) ,如果要使用要為其分配空間的對象的類型 ,將更加清楚,例如malloc(4 * sizeof(char *))而不是使用變量名。 編輯:正如cmaster指出的那樣,如果您更改變量的類型而不更改malloc()的類型,則可能會導致問題,因此請謹慎考慮此建議
  2. *members=malloc(5); 在您的情況下是沒有必要的,因為您的編譯器已經為您的字符串"john"分配了空間,並且
  3. *members="john"; 通過將字符串數組索引0處的指針設置為分配給"john"的編譯器的地址來工作
  4. 同樣, *(members+1)="shouldn't work"; 實際上因為在3中提到的點的工作。
  5. 最后,由於這一行- *members="john"; -您丟失了指向malloc(5)所存儲的內存的指針,因此該內存將被泄漏:)

因為您已經使用4*sizeof(*members)初始化了char**類型的指針,所以我認為您打算存儲4個字符串,因此建議為所有4個字符串分配內存,例如:

char** members=malloc(4*sizeof(*members));
int i;
for(i = 0; i < 4; i++)
    members[i] = malloc(100 + 1);  // 100 is a max length of string
              // actually length of each string can be different

或者您可以使用NULL初始化所有指針,然后根據需要更改它們(分配或指向某些已分配的內存),例如:

char** members=malloc(4*sizeof(*members));
int i;
for(i = 0; i < 4; i++)
    members[i] = NULL;  
// ... somewhere ....
char str[] = "Some string";
members[2] = str;
// ... somewhere else ....
members[1] = malloc(20);
scanf("%19s", members[1]); 

在這種情況下,您可以檢查if(members[i] != NULL)以標識指向數據的項目。

暫無
暫無

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

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