我一直在读一本名为《学习用汇编编程,Jonathan Barlett》的书。其中,我不理解图 6-1。
上下文:作者正在解释寄存器间接模式,使用mov (%rbx), %rax
。
我怀疑底部的框应该标记%rax
为 而不是%rbx
。但我不是 100% 有信心。因为我是汇编新手。我是否遗漏了一些我必须知道的东西,或者作者是否犯了一个错误?
根据 C 标准,在局部作用域中声明的局部变量将带有垃圾值,直到它们被显式初始化。与此相反,如果变量在全局作用域中声明,则它被隐式定义为 0。
所有这些只有在我声明一个或两个变量时才成立,例如int w, x
。但是当我声明三个或更多变量时,很少会自动定义为0。我认为这完全违反标准。
注意:我运行了多次,它每次都这样做,好像是故意的一样。
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int w, x, y, z;
printf("%d %d %d %d\n", w, x, y, z);
return EXIT_SUCCESS;
}
GCC 的输出:
0 0 1623616696 32764
Clang 的输出:
849564872 0 0 29759
我通常将主函数的形式参数声明为 或int argc, char* argv[]
,int argc, char** argv
以便从命令行获取实际参数。但我注意到一位资深 C 程序员(他恰好也是 ISO 委员会成员和 C23 修订版的合著者)使用了int argc, char* argv[argc+1]
或int argc, char* argv[argc]
。这样做有什么意义?
在 C 语言中,如果声明了一个对象。例如,声明int x;
为自动变量。没有用任何值初始化它,它是否仍被视为声明而不是定义?
因为 ChatGPT 认为,当声明一个对象时,编译器有时会留出一些与其(对象)关联的内存。因此,这是一个隐含的定义。请仅在您完全确定 C 语义的情况下回答。