-1

我正在使用这样的简单主程序

#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?

4

2 回答 2

2

问:所以我的问题是为什么 strcpy 不能抓取这个 {argv[1]} 字符并将其写入 buf?

你可以。您可能遇到的唯一问题是 ifargc小于 2,或者 argv[1] 大于 255 字节(加上字符串终止字符)。

问:另外,为什么 argc = 1?

在大多数系统上,argv[] 数组的布局具有相同的布局。例如,假设从命令行执行了一个程序:

>./myprog cookie monster

argv[0]    Contains the path where the executing program resides in the filesystem.
           So the actual value is something like: '/home/mahonri/test/test'
           This value is provided by the operating system.

argv[1]    Will contain the string: 'cookie'
           This value is provided (optionally) by the user.

argv[2]    will contain the string: 'monster'
           This value is provided (optionally) by the user.

argc       will be '3', because there are three argv elements; 0, 1 and 2.

在问题代码的情况下,如果argc是'1',那么只有argv[0]被初始化;如果代码随后尝试访问 argv[1] 或 argv[2],就会发生不可预知的事情。

于 2014-05-14T03:04:05.317 回答
1

你的问题“所以我的问题是为什么 strcpy 不能抓住这个 char 并将其写入 buf”的简单答案是 argv[1] 不被视为常量 char *,正如你所提到的,但它将是一个 NULL 指针,见 C §5.1.2.2.1,第 2 段。在您的情况下,将发生未定义的行为。

至于“为什么 argc = 1?” 值得关注,这取决于您传递的参数数量。命令行参数非常基础。做一个研究。

于 2014-05-14T03:17:34.140 回答