网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
05月28日漏签0天
c语言吧 关注:798,920贴子:4,355,953
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 1 2 下一页 尾页
  • 64回复贴,共2页
  • ,跳到 页  
<<返回c语言吧
>0< 加载中...

【讨论】main函数参数

  • 只看楼主
  • 收藏

  • 回复
  • 清风拂面水无痕
  • 大能力者
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
在C语言中,main函数是一个特殊的函数,它完整的原型是
int main( int argc, char **argv, char **argp);
无论你怎样写这个函数的参数,C编译器都会给它传递这三个参数。那么这是什么意思呢?
在C语言中,我们的第一条语句是从main函数开始的,但是,在编译后的exe文件中,在main函数之前有一段初始化代码,大致是内存管理和命令行参数处理。在exe文件中,程序大约是这样子的(以汇编形式):
.......(初始化代码)
push argp ; 传递参数argp
push argv ; 传递参数argv
push argc ; 传递参数argc
call _main ; 调用main函数,程序开始。
......(程序结束代码)
就是说,即使把main函数写成:
int main ( void)
{
......
}
的形式,程序也为main传递了argc,argv,argp参数。考察以下程序:
// 本程序用以显示命令行参数,在vs2010下调试。
// 为什么要特别说“vs2010“呢?因为本程序涉及到int和指针类型的长度,而在不同的编译器下它们可能不同。
#include "stdafx.h"
#include <windows.h>
int main( void)
{
int i;
char * p, *pv;
p = (char *)&i; // p取得栈地址
p += 16; // p指向参数argc,虽然参数表中没有这个argc。
i = (int)(int *)*p; // i = argc
printf("命令行共有%d个参数。\n", i);
p += 4; // p指向参数argv,虽然参数表中没有这个argv。
pv = (char *)*(DWORD *)p;// pv = argv
// 以下显示各个命令行参数
while(i)
{
printf("%s\n", *(DWORD *)pv);
i--;
pv += 4;
}
getchar();
return 0;
}


  • 最高指挥官11
  • 强能力者
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
中间那个不是char *argv[]?


2025-05-28 13:23:26
广告
  • 清风拂面水无痕
  • 大能力者
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
一楼的程序和下面的程序等效:
// 本程序用以显示命令行参数#include "stdafx.h"
#include <windows.h>
int main(int argc, char **argv)
{
int i;
char **p;
i = argc;
printf("命令行共有%d个参数。\n", i);
p = argv;
// 以下显示各个命令行参数
while(i)
{
printf("%s\n", *p);
i--;
p++;
}
getchar();
return 0;
}


  • 最高指挥官11
  • 强能力者
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
在linux下非ide环境,当./的时候就是给系统第一参数,既程序名字,第二个参数可以传递整形,给系统指明要传递的参数个数!后面就是你自己传递的参数,个数似乎没限制!因为这些参数包括前面的程序名字,都在char *argv[]里面放着!


  • 清风拂面水无痕
  • 大能力者
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
一楼的程序中,虽然main函数写成不带参数表的形式:
int main ( void)
但仍然可以通过堆栈读取它的三个参数。这说明,无论我们怎么写,编译器都为main传递了三个参数。而我们写
int main (int argc, char **argv, char **argp)
只是给出了这三个参数的名字,方便我们以后使用而已。


  • 最高指挥官11
  • 强能力者
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
好吧,楼主说的说的好高深的样子!膜拜


  • z什么什么k
  • 彩虹面包
    13
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
呐,恕我数死早,数不出访问了几个参数。此外恕我孤陋寡闻,不知道世上除了VC、gcc、clang、icc、digital mars c/c++,还有几个软件可以编译c代码,除了windows、Linux、Unix、Mac OS,还有几个系统可以运行用c写出的程序……


  • beastwars000
  • 麻婆豆腐
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
楼主你好,既然系统main函数定义了三个形参,为什么第二个和第三个类型相同,只是变量名不同,这不有点浪费空间么?是不是里面有个是动态数组?


2025-05-28 13:17:26
广告
  • 莪怎麽能卟變態
  • 低能力者
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
楼主我们说的是标准C。。。
也就是最基本的stdio.h 头文件。。。
你就抱着VS2010不放,顺带搞清楚一下编译器和IDE的区别。。。
你随便写个C程序,main的参数随便改 用GCC编译,你看能行不。。。
或者自己去翻c prime plus 313页。。。
stdafx.h和windows.h头文件里谁知道在预编译的时候干了啥事。。。


  • Edison_Canton
  • 麻婆豆腐
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
楼主要作死的话,大家拦都拦不住。


  • 清风拂面水无痕
  • 大能力者
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

MinGW下的程序:
#include <windows.h>
int main( void)
{
int i;
char * p, *pv;
p = (char *)&i; // p取得栈地址
p += 12; // p指向参数argc,虽然参数表中没有这个argc。
i = (int)*(int *)p; // i = argc ,在GCC下的写法
printf("命令行共有%d个参数。\n", i);
p += 4; // p指向参数argv,虽然参数表中没有这个argv。
pv = (char *)*(DWORD *)p;// pv = argv
// 以下显示各个命令行参数
while(i)
{
printf("%s\n", *(DWORD *)pv);
i--;
pv += 4;
}
getchar();
return 0;
}


  • 清风拂面水无痕
  • 大能力者
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼


  • Sunchy321
  • 圆の帝球
    16
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
2BVS。
求用gcc -Wmain -Werror编译你所谓的标准main()。


  • NoGovernment
  • 异能力者
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
正确得说main函数的参数个数是由操作系统决定的,楼主的参数表只是windows标准。而且楼主对指针处理貌似不太准确。


2025-05-28 13:11:26
广告
  • 清风拂面水无痕
  • 大能力者
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
int main( void)
{
int i;
char * p, *pv;
p = (char *)&i; // p取得栈地址
p += 12; // p指向参数argc,虽然参数表中没有这个argc。
i = (int)*(int *)p; // i = argc
printf("命令行共有%d个参数。\n", i);
p += 4; // p指向参数argv,虽然参数表中没有这个argv。
pv = (char *)*(int *)p;// pv = argv
// 以下显示各个命令行参数
while(i)
{
printf("%s\n", *(int *)pv);
i--;
pv += 4;
}
getchar();
return 0;
}


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 1 2 下一页 尾页
  • 64回复贴,共2页
  • ,跳到 页  
<<返回c语言吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示