无法理解结构的内存分配

时间:2012-10-08 22:45:33

标签: c memory-management

考虑遵循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。怎么??

5 个答案:

答案 0 :(得分:2)

临时指针需要一些垃圾值,因为它没有初始化。偶然,temp有一个垃圾值,可能恰好是你程序的合法地址,所以它运行。如果垃圾值有非法地址,则会产生段错误。

答案 1 :(得分:1)

你很幸运。

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

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

答案 2 :(得分:1)

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

当你调用malloc时,你已经分配了sizeof node个字节(实际上它甚至可能更多一点)然后你对{{1指向的块'有完全内存访问权限}}

一般情况下,您应该以这种方式致电n

malloc
  1. 没有演员
  2. 使用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

相关问题