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