如何解决使用指针更改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;
}
解决方法
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 *[]
。这是不正确的,因为在char *[]
上使用&
时,您正在将地址传递给argv
。因此,应为char **[]
(或char ***
)。
在// 2
,我不确定您要尝试什么,但是如果您想更改argc
的值,则只需在main
中将其赋值即可它的地址并在另一个函数中对其进行修改。
请注意,如果您在argv
中定义了新的char *[]
,则也可以简单地分配给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;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。