2
#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] には変更がありません。 。どうして???

4

3 に答える 3

2

C の「文字列」は、文字のゼロ終端配列であることを思い出してください。元の 4 つの引数が「1」、「2」、「3」、「4」だったとします。次に、これらの 4 つの引数は次のようにメモリに格納されます。

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

argv[1] の後に # を追加すると (strcat は \0 も追加します)、メモリの内容は次のようになります。

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

argv[2] が \0 文字を指していることを確認できます。したがって、これは空の文字列です。argv[3] はまだ正しく指しており、そのまま残ります。

于 2013-04-10T02:37:28.047 に答える
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);
于 2013-04-10T02:49:30.383 に答える
0

argv[] を変更することは想定されていません = 効果は未定義です

于 2013-04-10T02:29:22.747 に答える