我不理解指针和结构之间的东西;为什么如果我尝试通过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;
答案 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"通过利用您的错误关闭您的业务..
如果指针没有设置为指向某处,它(通常)指向其他地方,(它总是指向某处),类型没有可以指向的位置,类型是指针的属性,而不是它指向的属性,如果要使用它,必须将其指向正确的位置。
分段错误是未定义行为的常见示例。