1

考虑遵循 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->datatemp->data. 如何 ??

4

5 回答 5

2

临时指针采用一些垃圾值作为未初始化的值。碰巧 temp 有一个垃圾值,它可能恰好是您的程序的合法地址,因此它运行。如果垃圾值有非法地址,则会产生段错误。

于 2012-10-09T06:48:31.357 回答
1

你很幸运。

局部变量不会自动初始化,因此当程序开始时,两者都temp包含n堆栈中发生的任何值。接下来,分配内存并n设置为指向它。值 100 存储在data结构的成员中。

temp仍然未初始化,因此值 100 被复制到未指定的内存区域。根据该内存的位置,程序可能会出现段错误,或者它可能只是破坏它不拥有的内存。

于 2012-10-08T22:51:07.923 回答
1

你没有段错误temp->data=n->data;只是巧合。temp未初始化,因此它指向数字必杀技。

当您调用时malloc,您已经分配sizeof node了字节(实际上可能更多),然后您可以完全访问n.

一般来说,您应该malloc以这种方式调用:

node *n;
n = malloc(sizeof *n);
  1. 没有演员表
  2. sizeof *n而不是sizeof <datatype>. 如果您更改数据类型(例如,您有一个错字,而不是typedef .... node您已经写了typedef ... nhode。那么您只需要更改变量的声明,其余代码根本不需要更改。
于 2012-10-08T22:52:21.210 回答
1

你的第一个代码也是正确的,只是“temp”指向一个垃圾值,所以你必须初始化它。

temp=(node *)malloc(sizeof(node));
于 2014-01-10T18:25:02.890 回答
0

你在第一部分的权利,它是段错误,因为 node* temp 没有指向任何地方(嗯,某处,但不是分配的内存)。

我不知道为什么第二个“有效”。我怀疑它只是看起来有效,因为它没有崩溃。但是由于 temp 从未初始化过,谁知道它在哪里粘贴'100'。也许只是徘徊在以后崩溃。无论哪种方式,写入未初始化的内存都不是一个好主意;-0

于 2012-10-08T22:49:21.807 回答