【发布时间】:2014-05-14 02:48:27
【问题描述】:
我正在使用这样的简单主程序
#include <string.h>
int main(int argc, char **argv)
{
char buf[256];
strcpy(buf, argv[1]);
}
我知道如果编译,这个 main 将产生值为 1 的 'argc',并且 argv[1] 将不存在这个程序中定义的。然而,由 argv[1] 表示的内存地址,虽然没有在这个程序中定义,但不会被程序修改,因为 argv[1] 是作为 const char * 传递的。所以我的问题是为什么 strcpy 不能抓取这个字符并将其写入 buf?还有,为什么 argc = 1?
【问题讨论】:
-
如果是,为什么你认为
argv[1]不存在? -
你可能想先学习Command line argument。希望你能自己得到答案。
-
printf("%i\n", argc) 显示 1
-
那么,
argv[1]会是? -
const与argv无关。该标准支持修改它以及它所承载的字符串(尽管它可能看起来很奇怪)。无论如何,argv[N]仅被定义为在[0..(argc-1)]中为所有N公开一个有效的非空地址。该标准还要求argv[argc]应为空指针。 (C §5.1.2.2.1,第 2 段)。换句话说,您使用 NULL 源地址调用strcpy,这会调用 未定义的行为。