Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 无法理解结构的内存分配_C_Memory Management - Fatal编程技术网

C 无法理解结构的内存分配

C 无法理解结构的内存分配,c,memory-management,C,Memory Management,考虑下面的C代码- typedef struct node { int data; }node; int main() { node *temp; temp->data=100; printf("%d",temp->data); return 0; } 它在包含temp->data=100的行上给出分段错误因为(我想)我没有为它分配内存。因此,当我尝试使用- int main() { node *temp,*n; n=(no

考虑下面的C代码-

typedef struct node
{
    int data;
}node;

int main()
{
    node *temp;
    temp->data=100;
    printf("%d",temp->data);
    return 0;
}
它在包含
temp->data=100的行上给出
分段错误
因为(我想)我没有为它分配内存。因此,当我尝试使用-

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
。如何???

在第一部分,您的右侧出现故障,因为node*temp没有指向任何地方(好的,指向某个地方,但没有指向分配的内存)


我不知道为什么第二个“有效”。我怀疑它似乎只起作用,因为它没有崩溃。但由于temp从未初始化过,谁知道它将“100”粘贴在哪里呢。也许只是在附近闲逛,等会撞车。无论哪种方式,写统一化的记忆都不是一个好主意-0

您的右侧在第一部分,它会出现故障,因为node*temp没有指向任何地方(好的,指向某个地方,但没有指向分配的内存)

我不知道为什么第二个“有效”。我怀疑它似乎只起作用,因为它没有崩溃。但由于temp从未初始化过,谁知道它将“100”粘贴在哪里呢。也许只是在附近闲逛,等会撞车。无论哪种方式,写统一化的记忆都不是一个好主意-你很幸运

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

但是
temp
仍然未初始化,因此值100被复制到内存的未指定区域。根据内存所在的位置,程序可能会出错,也可能只是损坏了它不拥有的内存。

你很幸运

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


但是
temp
仍然未初始化,因此值100被复制到内存的未指定区域。取决于内存所在的位置,程序可能会出现segfault,也可能只是损坏了它不拥有的内存。

temp->data=n->data中没有segfault只是巧合<代码>温度
未初始化,因此它指向数字涅盘

当您调用
malloc
时,您已经分配了
sizeof node
字节(实际上可能会多一点),然后您就可以对
n
所指向的块进行完全内存访问

通常,您应该以以下方式调用
malloc

node *n;
n = malloc(sizeof *n);
  • 没有石膏
  • sizeof*n
    代替
    sizeof
    。如果您更改了数据类型(例如,您有一个输入错误,而不是
    typedef….node
    ,您已经编写了
    typedef….nhode
    。那么您只需更改变量的声明,其余代码根本不必更改

  • 你在
    temp->data=n->data;
    中没有一个segfault只是巧合。
    temp
    没有初始化,因此它指向数字天堂

    当您调用
    malloc
    时,您已经分配了
    sizeof node
    字节(实际上可能会多一点),然后您就可以对
    n
    所指向的块进行完全内存访问

    通常,您应该以以下方式调用
    malloc

    node *n;
    n = malloc(sizeof *n);
    
  • 没有石膏
  • 使用
    sizeof*n
    而不是
    sizeof
    。如果您更改了数据类型(例如,您有一个输入错误,而不是
    typedef….node
    ,您已经编写了
    typedef….nhode
    。那么您只需更改变量的声明,其余代码就不必更改

  • temp指针将一些垃圾值作为其未初始化的值。temp有一个垃圾值,它可能恰好是程序的合法地址,因此它运行。如果垃圾值具有非法地址,它将生成段错误。

    temp指针将一些垃圾值作为其未初始化的值。temp有一个垃圾值,它将h可能恰好是程序运行时的合法地址。如果垃圾值具有非法地址,它将生成段错误。

    您的第一个代码也是正确的,只是“temp”指向垃圾值,因此您必须对其进行初始化

    temp=(node *)malloc(sizeof(node));
    

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

    temp=(node *)malloc(sizeof(node));
    

    这两个程序都不正确-恰好一个看起来正常,而另一个不正常。未定义的行为。它也可能像第一个程序一样崩溃(可能对某些编译器也是如此)。两个程序都不正确-恰好一个看起来正常,而另一个不正常。未定义的行为。它也可能像第一个一样崩溃(对于某些编译器可能也是如此)。