簡體   English   中英

使用main(int argc,char * argv [])的問題

[英]Problems using main(int argc,char *argv[])

#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]將丟失(使用strcat后strlen(argv [2])變為0)。但是argv [3]不變。為什么???

請記住,C中的“字符串”是字符的零終止數組。 假設最初的四個參數是“一個”,“兩個”,“三個”和“四個”; 然后將這四個參數存儲在內存中

one\0two\0three\0four\0

當您在argv [1]之后附加#時(strcat也將添加\\ 0),內存內容變為:

one\0two#\0hree\0four\0

您現在可以驗證argv [2]指向\\ 0字符,因此它是一個空字符串。 argv [3]仍然正確指向,並且保持完整。

您不能將內容直接附加到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);

您不應該修改argv [] =效果未定義

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM