【发布时间】:2019-04-22 13:21:21
【问题描述】:
我创建了一个struct 并为该结构分配了一个指针变量。当我尝试打印该变量的地址时,它会正确打印。在使用此pointer 结构变量为结构的成员之一赋值后,当我尝试打印pointer 变量的地址时,我得到了segmentation fault。
#include <stdio.h>
typedef struct node {
char mem;
double mem2;
char mem3;
int mem4;
char mem5;
char mem6;
}NODE;
int main()
{
NODE * m;
printf("%u",&m);
return 0;
}
我得到的输出为 3014616488。当我将变量分配给结构成员之一时,
#include <stdio.h>
typedef struct node {
char mem;
double mem2;
char mem3;
int mem4;
char mem5;
char mem6;
}NODE;
int main()
{
NODE * m;
m->mem3 = 'A';
printf("%u",&m);
return 0;
}
我遇到了分段错误。当我喜欢这个时
#include <stdio.h>
typedef struct node {
char mem;
double mem2;
char mem3;
int mem4;
char mem5;
char mem6;
}NODE;
int main()
{
NODE * m;
printf("%u",&m->mem3);
return 0;
}
我得到 16 作为输出。我不知道16是怎么来的。它真的在我的脑海里挣扎。请任何人帮助我了解到底发生了什么。提前致谢
【问题讨论】:
-
m是一个指针,但你永远不会让它指向任何地方。所以当你取消引用它(通过m->mem3)你有undefined behavior。未初始化的局部变量将有一个不确定(并且看似随机)的值。 -
另外,当打印带有
printf的指针时,你应该使用"%p",否则你也会有未定义的行为。并且指针真的应该被强制转换为void *才能正确。最后,不要忘记&m是指向变量m的指针(并且具有NODE **类型),它不是m指向的位置(如果没有地址,那将是简单的m运算符)。 -
关于代码的第二个版本:变量
m从未初始化为结构节点的实例。而是声明了指向此类结构的指针的实例。但是该指针永远不会设置为指向结构节点的实例。所以声明:m->mem3 = 'A';是未定义的行为,任何事情都可能发生。注意:贴出的代码的三个版本都有相同的问题,导致未定义的行为 -
编译时,始终启用警告,然后修复这些警告。 (对于
gcc,至少使用:-Wall -Wextra -Werror -Wconversion -pedantic -std=gnu11)注意:其他编译器使用不同的选项来产生相同的东西。 -
第三版代码不是未定义的,它是有效的。但它在打印 mem3 变量的起始字节。我不知道为什么。请解释一下。 @user3629249
标签: c pointers memory-management segmentation-fault structure