C编程 - 结构,指针和初始化

时间:2018-03-11 16:04:36

标签: c pointers memory-management struct malloc

我仍然是C语言编程的新手,还在学习语言。我尝试执行以下操作(它是我的初始程序代码的缩小版本)。但每次我尝试初始化counter时,程序都会崩溃。我已经尝试设置另一个函数来处理初始化过程,设置要在counter函数中递增的set_members,并尝试通过传递总计{{{{ 1}}。但每次我尝试运行我的程序时,它会在打印&total后崩溃。我想我正在尝试错误地初始化"Hello"因为我不完全理解C中的counterpointers。有人可以解释我的初始化过程不正确的原因或原因,并导致我的程序崩溃?我怎么能正确地前进呢?谢谢!

structs

2 个答案:

答案 0 :(得分:2)

当你看一下:

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 counterCharStruct *arr点来定义未定义的内存位置。

同样,为了安全地使用成员arr,它必须指向类型为CharStruct的有效对象。您应该为CharStruct分配内存。这不是全部。一旦你有对象CharStruct,它就有char *names指针指向字符串。如果你想使用names,它应该指向有效的字符串!

您的带有指针的嵌套结构链将需要非常仔细的内存处理来进行分配和释放。注意潜在的内存泄漏或未初始化的指针。这是许多C程序员遇到的最常见的问题之一。

答案 1 :(得分:0)

person.people.member是一个未初始化的指针。它有一些垃圾值,可能是程序不允许访问的某些内存位置的地址。

正如其他人所说,取消引用未初始化的指针会调用未定义的行为。

您需要为struct Count分配内存,并在为其写入值之前将其地址指定给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;

不要忘记在使用它之后释放内存,如

free(person->people.member);

其他指针person.people.member->arrperson.people.member->arr->names同样如此。