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