我正在使用像这样的简单主体
#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?
答案 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?”关注,这取决于你传递的参数的数量。这是命令行参数的基础。做一项研究。