使用指针更改 C 函数中的 argv 字符串

Change argv strings in function in C with pointers

是否可以在函数中更改启动时给程序的 argv 字符串?不使用 return?我设法用整数来做到这一点(在传递指针时改变它的值),但我正在努力处理字符串。语法是什么样的?我真的对整个指针的事情感到困惑 :D.

void changestrings(char*strings[]){
    char*newstrings[5] = {"a","b","c","d","e"};
    *strings = newstrings;    
}
int main(int argc, char *argv[])
{
    changestrings(&argv);
    (void)argc;
    return 0;
}

C 中的字符串用 char * 表示。这意味着字符串本身是连续存储的,但变量的实际值是内存中的地址,而不是字符串。该地址指向字符串中的第一个字符。

char *argv[] 表示这些指针的数组。这个数组的存储方式相同; argv的“值”只是指向数组中第一个元素的内存地址。

当您获取该数组的地址时,您获取的是变量本身在内存中的地址,而不是其内容的地址。然后您可以将此地址传递给函数以修改该变量,这就是您在此处所做的。

固定代码如下:

#include <stdio.h>

void changestrings(char **strings[]) { // 1
    char *newstrings[5] = { "a", "b", "c", "d", "e" };
    *strings = newstrings;
}

int main(int argc, char *argv[]) {
    changestrings(&argv);
    // (void)argc // 2
    printf("%s\n", argv[0]);
    return 0;
}

(我添加了一个 printf 来帮助证明更改有效。)

// 1,您的原始函数有一个类型为 char *[] 的参数。这是不正确的,因为当您在 argv 上使用 & 时,您将 地址 传递给 char *[]。因此,这应该是char **[](或char ***)。

// 2,我不确定你在尝试什么,但如果你想更改 argc 的值,你可以简单地在 main 中分配给它或者获取它的地址并在另一个函数中修改它。


请注意,如果您在 main 中定义了一个新的 char *[],您也可以简单地分配给 argv。如果你想改变单个字符串,这会变得有点棘手,因为你需要跟踪数组中有多少,但该代码看起来像这样:

#include <stdio.h>

void change_first_string(char *strings[], int strings_length) {
    if (strings_length < 2) return;
    strings[0] = "foo";
}

int main(int argc, char *argv[]) {
    change_first_string(argv, argc);
    printf("%s\n", argv[0]);
    return 0;
}