结构变量指针声明错误

Error in pointer declaration of structure variable

为什么我使用此代码会出现分段错误?

#include<stdio.h>
typedef struct
{
    int                 val;
} DEVICE;

main()
{
DEVICE  *dev_ptr;
dev_ptr->val = 21;
printf(" %d   ",dev_ptr->val);
}

我知道正确的赋值方式。为此,我们需要添加这些行

DEVICE simple;
dev_ptr = &simple;
simple.val = 21;

但我想知道之前的代码有什么问题?

当你分配给 val 时,dev_ptr 是未初始化的,你永远不会将它设置为指向某个有效的地方。

所以您(可能)正在写入内存中的 "random" 位置,这(绝对)会产生未定义的行为。

修复应该是这样的:

DEVICE my_device;
DEVICE *dev_ptr = &my_device;
dev_ptr->val = 21;
printf("my_device.val=%d\n", my_device.val);

以上将打印21.

在您的第一个代码中,dev_ptr 未初始化使用。使用未初始化的内存会导致 undefined behaviour,并可能产生分段错误的副作用。

在使用[解除引用]之前,您需要为变量分配内存[您在第二个片段中所做的]。

您已经获得了编译时内存分配,并且在您的第二个代码片段中使用该地址 dev_ptr 绝对正确。现在,请看下面的动态分配代码。

试试

int main()    // use proper signature
{
DEVICE  *dev_ptr = malloc(sizeof(DEVICE));   // allocate memory

  if (dev_ptr)                                 //check for malloc success
  {
    dev_ptr->val = 21;
    printf(" %d   ",dev_ptr->val);
  }

free(dev_ptr);                                 //make valgrind happy, prevent memory leak
return 0;                                      // have a return statement
}