指向结构和打印的指针

时间:2016-05-11 09:25:56

标签: c pointers struct

我一直在学习结构,而且我已经到了结构的指针,我目前正在努力解决这个问题。

我已经得到了这段代码:

struct point {
    int x;
    int y;
} *ptr;

ptr->x = 8;
ptr->y = 8;

运行此操作会产生分段错误。我想要做的是将值8分配给x / y,据我所知,ptr指向该值。

5 个答案:

答案 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是未定义的行为,因此您可以获得段错误(在某些实现中,您可能无意中修改了一些内存位置)。