#include<stdio.h>
#include<string.h>
int main(int argc,char *argv[])
{
char string[]="#";
printf("%s\n",argv[1]);
printf("%s\n",argv[2]);
printf("%s\n",argv[3]);
strcat(argv[1],string);
printf("argv[1] is %s\n",argv[1]);
printf("argv[2] is %s\n",argv[2]);
printf("argv[3] is %s\n",argv[3]);
return 0;
}
当我使用strcat()向argv [1]的末尾添加内容时,argv [2]将丢失(strlen(argv [2])在使用strcat后更改为0)。但是argv [3]没有变化。为什么???
答案 0 :(得分:2)
请记住,C中的“字符串”是零终止的字符数组。假设原来的四个论点是“一”,“二”,“三”和“四”;然后这四个参数作为
存储在内存中one\0two\0three\0four\0
当你在argv [1]之后追加#(strcat也会添加一个\ 0)时,内存内容变为:
one\0two#\0hree\0four\0
你现在可以验证argv [2]指向\ 0 char,因此它是一个空字符串。 argv [3]仍然正确指出,它仍然完好无损。
答案 1 :(得分:2)
您无法将内容直接附加到argv[]
,因为每个argv[]
都已分配序列化,并且内存空间只能保留其原始大小。
要了解发生了什么,想象argv
是这样的:
char buffer[] = "./program\0one\0two\0three\0";
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 %s\n", buf);
答案 2 :(得分:0)
您不应该修改argv [] =效果未定义