在C/C++中,main函数接收类型为char*的参数.

int main(int argc, char* argv[]){
  return 0;
}

argvchar*的数组,指向字符串.这些绳子在哪里?它们是在堆上、堆栈上还是其他地方?

推荐答案

它实际上是编译器依赖性和操作系统依赖性的结合.main()是一个函数,与任何其他C函数一样,因此两个参数argcargv的位置将遵循平台上编译器的标准.e、 g.对于大多数以x86为目标的C编译器,它们将位于返回地址和保存的基指针上方的堆栈上(记住,堆栈向下增长).在x86_上,64个参数在寄存器中传递,因此argc将在%edi中,argv将在%rsi中.编译器生成的主函数中的代码然后将它们复制到堆栈中,这就是后面引用的地方.这样寄存器就可以用于main的函数调用.

argv所指的char*位挡路和实际的字符序列可能在任何地方.它们将在某个操作系统定义的位置开始,并可能被链接器生成的前导代码复制到堆栈或其他地方.您必须查看exec()的代码和链接器生成的汇编器前导才能找到答案.

C++相关问答推荐

AVX-512 BF 16:直接加载bf 16值,而不是从fp 32转换

C sscanf没有捕获第二个参数

想了解 struct 指针和空指针转换

C:scanf(%d&q;,...)输入只有一个减号

为什么在4.9.37版的内核中,kfio还需要smp_wmb呢?

GCC预处理宏和#杂注GCC展开

核心转储文件中出现奇怪的大小变化

带有sigLongjMP中断I/O的异常处理程序

在 struct 中强制转换空指针

C中函数类型的前向声明

进程已完成,退出代码为138 Clion

为什么我会收到释放后堆使用错误?

在Apple Silicon上编译x86的Fortran/C程序

将数字的每一位数平方,并使用C将它们连接为一个数字(程序不能正确处理0)

如何使用空元素块声明指针数组

在printf()中用%.*S格式填充长度为0的字符串是否会调用任何UB?如果是,是哪一个?

存储和访问指向 struct 的指针数组

`%%的sscanf无法按预期工作

令人困惑的返回和 scanf 问题相关

SSE 向量与 Epsilon 的比较