gpt4 book ai didi

c - while 循环内的变量作用域

转载 作者:太空狗 更新时间:2023-10-29 17:21:30 24 4
gpt4 key购买 nike

这可能是我遇到过的最奇怪的事情之一。我在 C 中编程不多,但据我所知,加上在线检查不同的来源,变量 ma​​croNamema​​croBody 仅在 while 循环的范围内定义.因此,每次循环运行时,我都希望 ma​​rcoNamema​​croBody 获得新地址并成为全新的变量。然而事实并非如此。

我发现即使循环再次运行,两个变量共享相同的地址,这让我非常头疼需要检查元素唯一性的链表。我不知道这是为什么。 ma​​croNamema​​croBody 难道不应该在每次 while 循环运行时获得全新的地址吗?

我知道这是问题所在,因为我正在打印地址,它们是相同的。

while(fgets(line, sizeof(line), fp) != NULL) // Get new line
{
char macroName[MAXLINE];
char macroBody[MAXLINE];

// ... more code

switch (command_type)
{
case hake_macro_definition:
// ... more code

printf("**********%p | %p\n", &macroName, &macroBody);
break;

// .... more cases
}
}

代码是我的链表代码的一部分。

struct macro {
struct macro *next;
struct macro *previous;
char *name;
char *body;
};

检查元素是否已存在于链表中的函数。但是由于 *name 具有相同的地址,所以我总是在 if 条件内结束。

static struct macro *macro_lookup(char *name)
{
struct macro *temp = macro_list_head;

while (temp != NULL)
{
if (are_strings_equal(name, temp->name))
{
break;
}

temp = temp->next;
}

return temp;
}

最佳答案

这些数组分配在栈上:

char macroName[MAXLINE];
char macroBody[MAXLINE];

编译器为您预先分配了空间,该空间位于函数的开头。换句话说,从计算机的角度来看,这些数组的位置与您在函数体顶部的循环体外部定义它们的位置相同。

C 中的作用域仅指示标识符在何处可见。所以编译器(而不是计算机)强制执行 macroNamemacroBody 不能在循环体之前或之后引用的语义。但从计算机的角度来看,这些数组的实际数据在函数启动后就存在,只有在函数结束时才会消失。

如果您要查看代码的程序集转储,您可能会看到机器的帧指针减少了足够多的量以适应函数的 call stack。为所有局部变量(包括这些数组)留出空间。

关于c - while 循环内的变量作用域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15318393/

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