通过struct类型的指针将值插入结构成员

时间:2014-12-21 10:46:09

标签: c

我不理解指针和结构之间的东西;为什么如果我尝试通过struct类型的指针访问struct成员,并使用指针给它们值,我得到分段错误??

如果我将结构指针声明为:

typedef struct a {
int b;
}A;

int main(){
A *ptr;
}

我可以使用这种语法访问struct成员

(*ptr).b or ptr->b

即使ptr指向什么也没有,ptr可以访问struct成员因为ptr被声明为类型struct,对吧?

如果我没有在某处明确设置指针点,那么指针一般指向他的类型,在这种情况下A no ??

但是当我尝试通过指针给结构成员赋予一些值时,我总是得到分段错误

ptr->b=9;

3 个答案:

答案 0 :(得分:0)

  

即使ptr指向什么也没有,ptr可以访问struct成员,因为ptr被声明为struct struct,对吗?

为什么会这样?指针指向某处; 某处并不一定是内存中的有效位置。

char* p = (char*)0x12345678; // Syntactically valid; not a real place in memory!

指针不会分配除sizeof(void*)个字节以外的任何内存来保存实际地址。

由于ptr只是一个指针,而不是实际的struct对象,因此在任何地方都没有分配A结构,因此是段错误。

A someA;
A* ptr;
(*ptr).b = 9; // or...
ptr->b = 9;

以上是正确的用法。

答案 1 :(得分:0)

你告诉编译器 - 请在堆栈A *ptr;上创建它,这样做 - 但你没有分配任何内存(从堆中)或将其分配给某个变量

   --------------> Points to where ??
| ^ |
 /
ptr

然后你尝试取消引用它*ptr - 你没有初始化它 - 所以它有权带你到任何可能的地方 - 因此它被称为未定义行为。 您的编译器应该将您带到哪里?

你应该做的:

A *ptr = malloc(sizeof(A)); 

A a1;
A *ptr = &a1; 


   ------------------> Points to   |  |
| ^ |                            a1/
 /
ptr

答案 2 :(得分:0)

变量ptr可以用来访问struct成员,如果ptr没有指向正确类型的结构,可能会发生坏事(这个坏东西的技术术语是未定义的行为)。通常它的一个程序终止有错误,程序做错了,或程序似乎做正确的事,不常见的结果包括" Anonymous"通过利用您的错误关闭您的业务..

如果指针没有设置为指向某处,它(通常)指向其他地方,(它总是指向某处),类型没有可以指向的位置,类型是指针的属性,而不是它指向的属性,如果要使用它,必须将其指向正确的位置。

分段错误是未定义行为的常见示例。