gpt4 book ai didi

c - 结构内指针的内存分配

转载 作者:太空宇宙 更新时间:2023-11-04 04:14:46 25 4
gpt4 key购买 nike

最近有人问这个问题 stack overflow ,但我对内存分配有不同的疑问。

在此行 Graph *G=malloc(sizeof(*G))这里的内存分配是指向Graph的指针如果你想说结构的其他成员的内存分配没有发生在任何结构中,那么我们如何能够使用 G->var 访问它们, 因为我们只为 (*G) 分配内存哪个可能等于某个 int 值?

如果你说:

It is allocating a Graph structure and assigning G to the address of that structure



Graph *g = malloc( sizeof( Graph ) );也会这样做。
struct Edge {
int vertex;
int weight;
Edge *next;
};

struct Graph {
int v;
Edge **edge;
int *dist;
int *path;
};

Graph *graph_new(int v)
{
Graph *G = malloc(sizeof(*G));

G->v = v;
G->edge = calloc(v, sizeof(*G->edge));
G->dist = calloc(v, sizeof(*G->dist));
G->path = calloc(v, sizeof(*G->path));

return G;
}

最佳答案

...how we are able to access them using G->var...



看来您并不清楚指针是什么。指针是一个简单的变量,您可以像其他任何变量一样读写。但是您可以对指针再执行一项操作:取消引用它(使用 * 或 ->)。为了执行此特定操作,指针的值必须有效:指针包含地址,如果该地址无效,则会发生错误。把指针想象成一个信封,不管是不是写的。您可以阅读信封上写的内容;您也可以删除并在其上书写。但是当你阅读信封上写的地址时,你希望那个地址存在,否则你可能会到处寻找一个不存在的地址,然后生气。

可以认为指针的特定值类似于整数的值。您可以取任何整数并对其进行计算,但是,如果您想对其进行除法,您的整数必须不为 0,否则会发生错误。指针也是如此:您可以使用任何值对其进行读取和写入,但是,如果您想将其值用作通常应有的值,即内存中的地址,则该值必须指向合适的地址。 malloc() 和 calloc() 返回有效且适合分配给指针的值,并且在您尝试取消引用指针时可以安全地使用(在正常情况下)。

在下面的评论后编辑。
人们通常认为,如果一个程序不能保证正确运行,那就是一个错误。为了使程序始终正确运行,必须采取许多预防措施。其中两个是 1) 不要使用未知值,以及 2) 不要取消引用无效指针。错误可以根据命名法、风格或它们产生或可能产生的效果进一步 segmentation 。未定义行为是 C 语言规范给出的名称,表示编译器(或目标机器)可以为所欲为,因为规范没有要求任何精确的内容。当然,没有人想要“未定义的行为”,所以让它发生只是一个错误。回到解除对错误指针的引用,规范说它会调用未定义的行为。确切地说,根据目标机器和操作系统,可能会发生以下一种或多种情况:1)除了读取未知值之外,什么也没有; 2) 除了写入未知的内存区域之外,什么都没有; 3)段错误或其他陷阱/异常等; 4) CPU 过热,可能爆炸,或其他未指明的事情。

现在我们领先一步。如果您的指针变量不是“普通”全局变量,而是驻留在动态 - 未分配 - 内存中,则您的变量尚不存在。它是一个概念,而不是一个真正的变量。所以,首先你创建那个变量;那么你可以像之前所说的那样使用它。

在您的示例中,“结构图”是一堆变量的声明,这些变量在您分配它们之前不存在。一旦你这样做了,通过“Graph *G = malloc(sizeof(*G));”,它们就会变得栩栩如生;但这并不意味着它们具有有效值。事实上,就在创建结构的下面,在你的代码片段中,它们被访问了。在这一刻,对它们的唯一合法访问是赋予它们一些值(value)。如前所述,它们也可以被读取——它们确实存在,但它们的值可能(嗯,是)非法的。

如果刚刚创建的 Struct Graph 中的值是简单的整数而不是指针,那么问题是一样的:变量存在,但它们的内容是未知的,因此是无效的。请注意,您可以使用 calloc() 分配结构图:在这种情况下,内部变量的值不会是未知的,但对于指针,取消引用仍然无效 - 就像已知为零的整数,因此无效用作除数。但是变量就在那里,准备好针对 0(在整数的情况下)或针对 NULL(或 0)在指针的情况下进行测试,或者准备好用有意义的值写入。

希望我已经足够清楚可以提供帮助。

关于c - 结构内指针的内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53348012/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com