为什么我使用此代码会出现分段错误?
#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;
但我想知道以前的代码有什么问题?
答案 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
}