[英]C Programming - Structs, Pointers, and Initialization
我對使用C進行編程還是很陌生,並且仍然在學習該語言。 我正在嘗試執行以下操作(它是我的初始程序代碼的縮小版本)。 但是每次我嘗試初始化counter
,程序都會崩潰。 我嘗試設置另一個函數來處理初始化過程,在set_members
函數中設置要遞增的counter
,並嘗試通過向其傳遞total &total
的地址來初始化計數器。 但是,每次我嘗試運行程序時,在打印"Hello"
之后它就會崩潰。 我想我嘗試錯誤地初始化counter
因為我不完全理解C中的pointers
和structs
。有人可以解釋我的初始化過程不正確或如何導致我的程序崩潰的原因嗎? 以及我如何正確地做到這一點? 謝謝!
typedef struct CharStruct{
char *names;
}CharStruct;
typedef struct Count{
CharStruct *arr;
int counter;
}Count;
typedef struct Members{
Count *member;
}Members;
typedef struct Test{
Members people;
}Test;
void set_members(struct Test *person);
void print_total(struct Test *person);
int main(void) {
printf("Hello\n"); /* prints Hello */
Test person;
//person.people.member->counter = 0;
set_members(&person);
print_total(&person);
system("pause");
return EXIT_SUCCESS;
}
void set_members(struct Test *person)
{
int total = 0;
while(total < 10)
{
++total;
}
person->people.member->counter = total;
}
void print_total(struct Test *person)
{
printf("Total Members: %d\n", person->people.member->counter);
}
當您查看以下內容時:
typedef struct Members{
Count *member;
}Members;
請注意, member
是一個指向Count type
對象的指針。 為了能夠對該對象進行操作,該對象必須存在。 它的內存必須動態或靜態分配。 否則,程序的行為將處於未定義狀態。
檢查在示例程序中完成的內存分配:
#include <stdio.h>
#include <stdlib.h>
typedef struct CharStruct{
char *names;
}CharStruct;
typedef struct Count{
CharStruct *arr;
int counter;
}Count;
typedef struct Members{
Count *member;
}Members;
typedef struct Test{
Members people;
}Test;
void set_members(struct Test *person)
{
int total = 0;
while(total < 10){
++total;
}
person->people.member->counter = total;
}
void print_total(struct Test *person)
{
printf("Total Members: %d\n", person->people.member->counter);
}
int main(void) {
printf("Hello!\n"); /* prints Hello */
Test person;
#if 0 // allocate memory on stack
Members m;
Count c;
// use declared variables
person.people = m;
m.member = &c;
#else
// or dynamic alocation
person.people.member = malloc(sizeof(Count));
#endif
set_members(&person);
print_total(&person);
person.people.member->counter = 77;
print_total(&person);
free(person.people.member);
//system("pause");
return EXIT_SUCCESS;
}
輸出:
Hello!
Total Members: 10
Total Members: 77
Count
類型對象的內存,其中Count
類型
typedef struct Count{
CharStruct *arr;
int counter;
}Count;
由以下人員分配:
malloc(sizeof(Count));
值得強調的是,您可以使用int counter
但是CharStruct *arr
指向未定義的內存位置。
同樣,為了安全地使用成員arr
它必須指向CharStruct
類型的有效對象。 您應該為CharStruct
分配內存。 這還不是全部。 一旦有了對象CharStruct
它就會具有char *names
指針,用於指向字符串。 如果要使用names
,則應指向有效的字符串!
您的帶有指針的嵌套結構鏈將需要非常小心的內存處理以進行分配和釋放。 請注意潛在的內存泄漏或未初始化的指針。 這些是許多C程序員遇到的最常見的問題之一。
person.people.member
是未初始化的指針。 它具有一些垃圾值,該垃圾值可能是程序不允許訪問的某些內存位置的地址。
正如其他人所說,取消引用未初始化的指針會調用未定義的行為。
您需要為struct Count
分配內存並將其地址分配給person.people.member
然后person.people.member
其寫入值。
你可以做
person.people.member = malloc(sizeof(struct Count));
在main()
聲明之后person
或做
person->people.member = malloc(sizeof(struct Count));
在set_members()
person->people.member->counter = total;
之前的set_members()
person->people.member->counter = total;
。
而且,不要忘了在使用完之后像這樣重新分配內存
free(person->people.member);
其他指針person.people.member->arr
和person.people.member->arr->names
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.