#include<stdio.h>
#include<string.h>
int main(int argc,char *argv[])
{
char string[]="#";
printf("%sn",argv[1]);
printf("%sn",argv[2]);
printf("%sn",argv[3]);
strcat(argv[1],string);
printf("argv[1] is %sn",argv[1]);
printf("argv[2] is %sn",argv[2]);
printf("argv[3] is %sn",argv[3]);
return 0;
}
当我使用strcat()在argv[1]的末尾添加一些东西时,argv[2]将丢失(strlen(argv[2])在使用strcat后变为0)。但是argv[3]没有变化,为什么??
不能直接向argv[]
添加内容,因为每个argv[]
都是序列化分配的,并且只能保存其原始大小。
为了理解发生了什么,想象argv
是这样的:
char buffer[] = "./program one two three ";
char *argv[4] = { &buffer[0], &buffer[10], &buffer[14], &buffer[18] };
所以你可以看到,如果你在"one"
之后写一些东西,你会覆盖"two"
并破坏整个东西,因为它们是在内存中序列化的。
要解决这个问题,您必须将每个argv[]
复制到一个更大的缓冲区,在那里您可以安全地进行修改。例如:
char buf[1024];
strcpy(buf, argv[1]);
strcat(buf, string);
printf("argv[1] is %sn", buf);
请记住,C语言中的"string "是终止于零的字符数组。假设最初的四个参数是"一"、"二"、"三"one_answers"四";然后这四个参数以
的形式存储在内存中。one two three four
当你在argv[1]后面加上#时(strcat也会加上 ),内存内容变成:
one two# hree four
现在可以验证argv[2]指向 字符,因此它是一个空字符串。Argv[3]仍然指向正确,并且保持完整。
您不应该修改argv[] =效果未定义