当我调试我的操作系统时,我做了以下更改以杀死一个错误:
struct proc {
int p_status;
};
int *status;
struct proc *childP;
在:
*status = childP->p_status;
我把它改为:
status = &childP->p_status;
然后操作系统正常工作。但是根据我的理解,不应该在之前和之后的工作相同吗?他们之间有什么区别?谢谢!
答案 0 :(得分:0)
*status = childP->p_status;
表示:指定status
指向childP->p_status
值
status = &childP->p_status;
表示:将status
设置为指向childP->p_status
答案 1 :(得分:0)
*
和&
运算符有些过载,这是一个很容易犯的错误。
typename * variable
//e.g.
int * status;
声明一个int类型的变量 - 在这种情况下,operator *
绑定到typename并成为一个修饰符。
* variable
表示the contents of the address pointed to by variable
#include <iostream>
int main() {
char text[] = "hello, world!";
char* p = text; // declare 'p' as a 'char*' and point it to 'h'
*p = 'H'; // change the first letter of text to a capital
std::cout << text << '\n';
return 0;
}
有多种方法可以编写这些语句,有些程序员喜欢在声明变量时将*
放在左侧
int* status;
int * status;
int *status;
都声明了相同的变量。但是,当您必须声明多个变量
时,它会使用第一个表单变为阴天int* p1, p2;
声明指针p1但 p2只是一个int
int * p1, * p2;
int *p1, *p2;
声明两个指针。 Lefty-pointer-types倾向于
int* p1;
int* p2;
答案 2 :(得分:0)
如果status
在*status = childP->p_status;
之前未指向已分配的内存,则表示您有错误。因为状态指针将指向未知的内存地址。
第二个选项意味着状态指向结构成员的相同地址。此指针的作用类似于别名 - &childP->p_status
答案 3 :(得分:0)
我认为问题是您在创建之前尝试访问该值。当您尝试调用ChildP-&gt; p_status段时,您还没有真正将值加载到p_status中,因此结果是错误。
第二个,你用地址值加载状态,给struct一个具体的值来处理 - 在我看来,这是一个更好的方法。最好先设置指针本身的值而不是指针值。