首页 > 解决方案 > 使用指针更改 C 函数中的 argv 字符串

问题描述

是否可以在函数中更改您在启动时为程序提供的 argv 字符串?不使用退货?我设法用整数来做到这一点(在传递指针时更改它的值),但我正在努力处理字符串。语法会是什么样子?我真的对整个指针的事情感到困惑: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;
}

标签: arraysccharargumentsc-strings

解决方案


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 *[]。这是不正确的,因为您在使用on时将地址传递给 a 。因此,这应该是(或)。char *[]&argvchar **[]char ***

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


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

#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;
}

推荐阅读