结构变量的指针声明出错

时间:2015-02-03 11:58:40

标签: c pointers segmentation-fault

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

#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;

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

2 个答案:

答案 0 :(得分:3)

当您分配到val时,dev_ptr未初始化,您从未将其设置为指向某个有效的位置。

所以你(可能)写了一个&#34;随机&#34;在内存中的位置,(绝对)给出未定义的行为。

修复应该是这样的:

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

以上内容将打印21

答案 1 :(得分:2)

在您的第一个代码中,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
}