关于strcpy溢出的问题

时间:2014-05-14 02:48:27

标签: c argv strcpy argc

我正在使用像这样的简单主体

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

2 个答案:

答案 0 :(得分:2)

问:所以我的问题是为什么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为&#39; 1&#39;,则只初始化argv [0];如果代码然后尝试访问argv [1]或argv [2],则会发生不可预测的事情。

答案 1 :(得分:1)

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

至于“为什么argc = 1?”关注,这取决于你传递的参数的数量。这是命令行参数的基础。做一项研究。