【发布时间】:2017-11-22 09:47:42
【问题描述】:
我现在正在学习动态内存分配,很难理解,尤其是当讲师提到DMA和使用指针的结构时。
首先,在我的代码的第 1 行,我对“&ptr->eno”的含义感到困惑。我们将ptr作为指针初始化,所以它意味着ptr保存了我们保留的内存地址,假设ptr保存了地址2046,“&ptr->eno”是指将值写入它指向的2046地址吗?
其次,在第 2 行,我如何打印出值,因为“ptr->eno”包含值“2046”,而不是当我打印出来时,它会给我数字 2046,而不是我尝试的值存储在内存位置 2046 中。
我的代码是从讲义中复制的,我尝试在 Visual Studio 上运行它,在我输入值后它崩溃了。我对 C 很陌生,我的假设可能看起来很愚蠢而且很难理解。如果你不能理解我的解释,请告诉我如何使用结构指针,也许我能弄清楚我的错误。谢谢
#include<stdio.h>
#include<stdlib.h>
struct emp
{
int eno;
char ename[20];
float esal;
};
void main()
{
struct emp* ptr;
ptr = (struct emp*)malloc(sizeof(struct emp));
if (ptr=NULL)
{
printf("out of memory error");
}
else
{
printf("enter the value of employee: \n");
scanf_s("%d%s%f", &ptr->eno, ptr->ename, &ptr->esal); // line 1
}
printf("the name is: %s \t the number: %d \t the salary: %f", ptr->ename, ptr->eno, ptr->esal); //line2
}
【问题讨论】:
-
@StoryTeller 我的错误,已修复
-
请记住,指针只是一个变量,它将其他东西的地址存储为它的值。所以
int a=5;和int *b = &a;指针b只是存储a的地址作为它的值。当您使用malloc, calloc or realloc动态分配时,这些函数会保留所请求大小的内存块并返回内存块开头的地址。因此,您只是将地址存储到分配返回的指针变量中的内存块中。 -
@DavidC.Rankin:这是您今天发表的第二条(我遇到的)与指针相关的评论,我很喜欢这些评论! +1 给它。
-
它怎么会崩溃那里?!您的代码在那里有
ptr = NULL,它甚至没有进入 input 分支。 -
@WedaPashi - 是的,这似乎是新 C 程序员在指针方面遇到的最大绊脚石之一。因此,如果这看起来是他们正在努力解决的问题,我会尝试发表评论。 (这意味着我最终放弃了很多
:)