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

C编程-结构、指针和初始化,c,pointers,memory-management,struct,malloc,C,Pointers,Memory Management,Struct,Malloc,我对C语言编程还是相当陌生的,而且还在学习这门语言。我正在尝试做以下工作(这是我初始程序代码的缩小版本)。但每次我尝试初始化计数器时,程序都会崩溃。我已尝试设置另一个函数来处理初始化过程,在set_members函数中设置要递增的计数器,并尝试通过传递total和total的地址来初始化计数器。但每次我试图运行我的程序时,它都会在打印“Hello”后崩溃。我想我试图错误地初始化计数器,因为我不完全理解C语言中的指针和结构。有人能解释一下我的初始化过程如何或为什么不正确,并导致我的程序崩溃吗?我如

我对C语言编程还是相当陌生的,而且还在学习这门语言。我正在尝试做以下工作(这是我初始程序代码的缩小版本)。但每次我尝试初始化
计数器时,程序都会崩溃。我已尝试设置另一个函数来处理初始化过程,在
set_members
函数中设置要递增的
计数器
,并尝试通过传递total
和total
的地址来初始化计数器。但每次我试图运行我的程序时,它都会在打印“Hello”
后崩溃。我想我试图错误地初始化
计数器
,因为我不完全理解C语言中的
指针
结构
。有人能解释一下我的初始化过程如何或为什么不正确,并导致我的程序崩溃吗?我如何才能正确地进行下去?谢谢

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结构CharStruct{
字符*名称;
}CharStruct;
typedef结构计数{
CharStruct*arr;
整数计数器;
}计数;
typedef结构成员{
计数*成员;
}成员;
类型定义结构测试{
成员包括:;
}试验;
无效集合成员(结构测试*人);
无效打印总数(结构测试*人);
内部主(空){
printf(“Hello\n”);/*打印Hello*/
测试人员;
//person.people.member->counter=0;
集合_成员(&人);
打印总数(&人);
系统(“暂停”);
返回退出成功;
}
无效集合成员(结构测试*人)
{
int-total=0;
而(总数<10)
{
++总数;
}
人员->人员.成员->计数器=总数;
}
无效打印总数(结构测试*人)
{
printf(“成员总数:%d\n”,人员->人员.成员->计数器);
}

当您查看以下内容时:

typedef struct Members{
    Count *member;
}Members;
请注意,
成员
是指向
计数类型
对象的指针。 为了能够对该对象进行操作,该对象必须存在。它的内存必须动态或静态分配。否则,程序的行为将处于未定义状态

检查在示例程序中完成的内存分配:

#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;
}
类型为
Count
的对象的内存,其中类型为
Count

typedef struct Count{
    CharStruct *arr;
    int counter;
}Count;
分配人:

malloc(sizeof(Count));
值得强调的是,您可以使用
int计数器
,但
CharStruct*arr
指向未定义的内存位置

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


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

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之前

一旦你像这样使用完内存,别忘了释放它

free(person->people.member);

对于其他指针
person.people.member->arr
person.people.member->arr->names

您没有为成员分配内存。成员是一个指针,这个指针指向一些当时不适合您的内存,您需要使用malloc分配内存,然后再使用它。person->people.member=malloc(sizeof(Count));我不理解
的含义,而
集合成员中的
循环,为什么要这样做?我也不理解你的结构,你用这些结构建模的是什么样的数据
Test
包含
Members
struct,
Members
包含指向
Count
的指针,该指针包含
CharStruct
?你想解决什么问题?谢谢!这更有道理。我没有意识到我没有创建对象,也没有预先为设置
计数器
分配内存。另外,感谢您提供了一个注意内存泄漏和分配/解除分配的说明。这对我来说很重要,要记住。
free(person->people.member);