结构变量指针声明错误
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
}
为什么我使用此代码会出现分段错误?
#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
}