使用指针更改 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;
}
是否可以在函数中更改启动时给程序的 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;
}