我一直在学习结构,而且我已经到了结构的指针,我目前正在努力解决这个问题。
我已经得到了这段代码:
struct point {
int x;
int y;
} *ptr;
ptr->x = 8;
ptr->y = 8;
运行此操作会产生分段错误。我想要做的是将值8分配给x / y,据我所知,ptr指向该值。
答案 0 :(得分:4)
您的ptr
是指向struct point
的指针。
但是,没有struct point
指向。
struct point {
int x;
int y;
} *ptr;
struct point pt; // add this...
ptr = &pt; // ...and this.
ptr->x = 8;
ptr->y = 8;
答案 1 :(得分:2)
您已创建一个名为ptr
但尚未初始化的指针。当您使用ptr->
(或*ptr
)取消引用它时,您将调用未定义的行为,在您的情况下会崩溃程序(但可以执行任何操作)。
这会更好:
struct point {
int x;
int y;
};
struct point sp = {0,0};
struct point *ptr = &sp;
sp.x = 8;
ptr->y = 8;
答案 2 :(得分:1)
问题是指针ptr
没有指向任何有效的内存缓冲区,而是将其分配给已分配的或自动的存储:
// way 1
struct point p;
ptr = &p;
ptr->x = 8;
ptr->y = 8;
// way 2
ptr = malloc(sizeof *ptr);
ptr->x = 8;
ptr->y = 8;
// when you are done remember to release the allocated memory
free(ptr);
答案 3 :(得分:0)
让我以简单的方式向您解释。
1
变量保存数据(希望它们保存的值),指针只保存变量的内存地址(只是内存的一部分)。指针用于保存变量的地址,因此它们不能保存任何用户数据。我们可以创建指向变量的指针,并使用特定指针操作该变量。我们首先需要创建变量,然后我们创建一个引用该变量的指针,然后我们对指针执行任何操作,变量将被操作。
struct point
{
int x;
int y;
};
struct point var1; //declare a variable
struct point *ptr=&var1;// declare a pointer to that variable
ptr->x = 8; // manipulate the variable
ptr->y = 8;
或者
2
如果你坚持只使用指针,那么你需要动态分配内存,然后将分配的内存的基地址分配给指针。
struct point
{
int x;
int y;
} *ptr;
ptr=(struct point*)malloc(sizeof(struct point)); // this will allocate memory required to hold your structure
ptr->x = 8; //manipulate the memory content pointed by your pointer.
ptr->y = 8;
答案 4 :(得分:0)
您需要为ptr分配有效的内存位置,ptr是指向struct point的指针。您可以使用malloc,也可以使用struct point声明一个变量,并将其地址分配给ptr(如上面的答案)。
顺便说一下,如果ptr有文件范围,则用零初始化,即NULL指针;否则,评估ptr是未定义的行为(你可以获得任何值)。在这两种情况下,尝试取消引用ptr是未定义的行为,因此您可以获得段错误(在某些实现中,您可能无意中修改了一些内存位置)。