C 无法理解结构的内存分配
考虑下面的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
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));
这两个程序都不正确-恰好一个看起来正常,而另一个不正常。未定义的行为。它也可能像第一个程序一样崩溃(可能对某些编译器也是如此)。两个程序都不正确-恰好一个看起来正常,而另一个不正常。未定义的行为。它也可能像第一个一样崩溃(对于某些编译器可能也是如此)。