考虑遵循C代码 -
typedef struct node
{
int data;
}node;
int main()
{
node *temp;
temp->data=100;
printf("%d",temp->data);
return 0;
}
它在Segmentation fault
上包含temp->data=100;
因为(我认为)我没有为它分配内存。所以,没有像temp->data
这样的东西。
但是,当我尝试 -
int main()
{
node *temp,*n;
n=(node*)malloc(sizeof(node));
n->data=100;
temp->data=n->data;
printf("%d",temp->data);
retrun 0;
}
它提供适当的输出100。
我没有分配temp
指向的内存。但我仍在将n->data
复制到temp->data
。怎么??
答案 0 :(得分:2)
临时指针需要一些垃圾值,因为它没有初始化。偶然,temp有一个垃圾值,可能恰好是你程序的合法地址,所以它运行。如果垃圾值有非法地址,则会产生段错误。
答案 1 :(得分:1)
你很幸运。
本地变量不会自动初始化,因此当程序开始时,temp
和n
都包含堆栈上的任何值。接下来,分配内存并将n
设置为指向它。值100存储在结构的data
成员中。
但temp
仍然未初始化,因此值100被复制到未指定的内存区域。根据内存的位置,程序可能会出现段错误,或者它可能只会破坏它不拥有的内存。
答案 2 :(得分:1)
你在temp->data=n->data;
中没有遇到段错误只是巧合。 temp
未初始化,因此它指向数字必杀技。
当你调用malloc
时,你已经分配了sizeof node
个字节(实际上它甚至可能更多一点)然后你对{{1指向的块'有完全内存访问权限}}
一般情况下,您应该以这种方式致电n
:
malloc
node *n;
n = malloc(sizeof *n);
代替sizeof *n
。如果您更改了数据类型(例如,您有一个拼写错误,而不是sizeof <datatype>
,您已经写了typedef .... node
。那么您只需要更改变量的声明,其余的代码不会必须改变。答案 3 :(得分:1)
你的第一个代码也是正确的,只是“temp”指向一个垃圾值,所以你必须初始化它。
temp=(node *)malloc(sizeof(node));
答案 4 :(得分:0)
你在第一部分的权利,它是段错误的,因为node * temp没有指向任何地方(好吧,某处,但没有分配内存)。
我不知道为什么第二个“有效”。我怀疑它似乎只是工作,因为它没有崩溃。但由于临时从未初始化,谁知道它在哪里坚持'100'。也许只是徘徊以后崩溃。无论哪种方式,写入单元化内存都不是一个好主意; -0