簡體   English   中英

C編程-結構,指針和初始化

[英]C Programming - Structs, Pointers, and Initialization

我對使用C進行編程還是很陌生,並且仍然在學習該語言。 我正在嘗試執行以下操作(它是我的初始程序代碼的縮小版本)。 但是每次我嘗試初始化counter ,程序都會崩潰。 我嘗試設置另一個函數來處理初始化過程,在set_members函數中設置要遞增的counter ,並嘗試通過向其傳遞total &total的地址來初始化計數器。 但是,每次我嘗試運行程序時,在打印"Hello"之后它就會崩潰。 我想我嘗試錯誤地初始化counter因為我不完全理解C中的pointersstructs 。有人可以解釋我的初始化過程不正確或如何導致我的程序崩潰的原因嗎? 以及我如何正確地做到這一點? 謝謝!

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->arrperson.people.member->arr->names

暫無
暫無

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

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