我正在學習C。我有一個結構,如果我需要設定結構陣列-> 所以我為這個陣列分配記憶體。但是我需要為這個結構中的欄位單獨分配記憶體嗎?像這樣:
struct Call{
char *country;
int duration;
};
int main(){
struct Call *calls;
int n;
scanf_s("%d", n);
calls = (struct Call *) calloc(n 1 , sizeof(struct Call));
}
uj5u.com熱心網友回復:
您不需要為結構型別物件的資料成員分配空間,因為它們屬于物件。
country但是,如果您希望物件成為相應字串的所有者,您似乎需要分配一個字符陣列,該陣列的指標將存盤在資料成員中。
例如
struct Call *calls = calloc( 1, sizeof( struct Call ) );
const char *country = "Some country";
calls->country = malloc( strlen( country ) 1 );
strcpy( calls->country, country );
當您為該型別的物件釋放記憶體時,struct Call您首先需要釋放為資料成員指向的字符陣列分配的記憶體country。
uj5u.com熱心網友回復:
是的,您必須先初始化任何指標,然后才能取消參考它。這意味著為其分配記憶體,或將其分配給已分配的記憶體。這是 C 語言中的通用規則,結構中的指標沒有特殊情況。C 不會“遞回地”為您分配記憶體。除其他事項外,它如何知道您需要多少?考慮下面的簡化代碼
int main(){
struct Call *calls;
calls = calloc(1 , sizeof(struct Call));
}
假設calloc成功,calls現在指向一個記憶體塊,其中包含單個 的struct Call空間,其中包括char指標和的空間int。但是,country它本身仍然是一個未初始化的指標,您必須為其分配空間或將其指向已分配的內容,然后才能安全地取消參考它
calls->country = malloc(25);
if (calls->country == NULL) exit(-1); // handle error how you want
strcpy(calls->country, "Portugal");
printf("%s\n", calls->country); // prints Portugal
或類似的東西
char myCountry[] = "Spain";
calls->country = myCountry;
myCountry[0] = 'X';
printf("%s\n", calls->country); // prints Xpain
另請參閱Do I cast the result of malloc?
uj5u.com熱心網友回復:
您需要為 struct 和 char 陣列分配空間。
您可能希望動態添加對陣列的呼叫,因此您還需要知道陣列的大小:
typedef struct Call{
char *country;
int duration;
}Call;
typedef struct
{
size_t size;
Call call[];
}Calls_t;
Calls_t *addCall(Calls_t *calls, const int duration, const char *country)
{
size_t newsize = calls ? calls -> size 1 : 1;
calls = realloc(calls, sizeof(*calls) newsize * sizeof(calls -> call[0]));
if(calls)
{
calls -> size = newsize;
calls -> call[newsize - 1].country = malloc(strlen(country) 1);
if(!calls -> call[newsize - 1].country)
{
/* error handling */
}
strcpy(calls -> call[newsize - 1].country, country);
calls -> call[newsize - 1].duration = duration;
}
return calls;
}
void printCalls(const Calls_t *calls)
{
if(calls)
for(size_t i = 0; i < calls -> size; i )
printf("Call %zu: Country:%s Duration:%d\n", i 1, calls -> call[i].country, calls -> call[i].duration);
}
int main(void)
{
Calls_t *calls = NULL, *tmp;
tmp = addCall(calls, 10, "Poland");
if(tmp) calls = tmp;
tmp = addCall(calls, 20, "UK");
if(tmp) calls = tmp;
tmp = addCall(calls, 30, "US");
if(tmp) calls = tmp;
printCalls(calls);
/* free allocated memory */
}
https://godbolt.org/z/Kb5bKMfYY
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/484002.html
上一篇:兩個鏈表的交集
