[英]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;
}
也就是說,成員可以容納四個成員,每個成員可以容納字符串的地址。
一些東西:
malloc(4*sizeof(*members))
,如果要使用要為其分配空間的對象的類型 ,將更加清楚,例如malloc(4 * sizeof(char *))
而不是使用變量名。 編輯:正如cmaster指出的那樣,如果您更改變量的類型而不更改malloc()
的類型,則可能會導致問題,因此請謹慎考慮此建議 *members=malloc(5);
在您的情況下是沒有必要的,因為您的編譯器已經為您的字符串"john"
分配了空間,並且 *members="john";
通過將字符串數組索引0處的指針設置為分配給"john"
的編譯器的地址來工作 *(members+1)="shouldn't work";
實際上並因為在3中提到的點的工作。 *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.