Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于strcpy溢出的问题_C_Argv_Strcpy_Argc - Fatal编程技术网

关于strcpy溢出的问题

关于strcpy溢出的问题,c,argv,strcpy,argc,C,Argv,Strcpy,Argc,我使用的是这样一个简单的主管道 #include <string.h> int main(int argc, char **argv) { char buf[256]; strcpy(buf, argv[1]); } #包括 int main(int argc,字符**argv) { char-buf[256]; strcpy(buf,argv[1]); } 我知道,如果编译,这个main将生成一个值为1的“argc”,并且argv[1]将不存在

我使用的是这样一个简单的主管道

#include <string.h>

int main(int argc, char **argv)
{
        char buf[256];
        strcpy(buf, argv[1]);
}
#包括
int main(int argc,字符**argv)
{
char-buf[256];
strcpy(buf,argv[1]);
}
我知道,如果编译,这个main将生成一个值为1的“argc”,并且argv[1]将不存在这个程序中定义的值。但是,由argv[1]表示的内存地址虽然未在此程序中定义,但不会被程序修改,因为argv[1]是作为常量char*传递的。所以我的问题是为什么strcpy不能获取这个字符并将其写入buf?还有,为什么argc=1?

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

你可以。您可能遇到的唯一问题是
argc
小于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],则会发生不可预知的事情。

您的问题“我的问题是strcpy为什么不能获取此字符并将其写入buf”的简单答案是,正如您所提到的,argv[1]不被视为常量字符*,但它将是一个空指针,请参见C§5.1.2.2。在您的情况下,将发生未定义的行为


至于“为什么argc=1?”这个问题,它取决于您传递的参数数量。命令行参数是非常基本的。做一项研究。

如果是,你为什么认为
argv[1]
不存在?你可能想先学习。希望您能自己得到答案。printf(“%i\n”,argc)显示1So,
argv[1]
将是什么?关于
argv
没有任何
const
。该标准支持修改它以及它承载的字符串(尽管它可能看起来很奇怪)。无论如何,
argv[N]
仅定义为在
[0.(argc-1)]
中为所有
N
公开一个有效的非空地址。本标准还规定
argv[argc]
应为空指针。(C§5.1.2.2.1,第2款)。换句话说,您使用空源地址调用strcpy,这会调用未定义的行为。如果
argc
为1,则
argv[1]
也会初始化,但会初始化为
NULL