gpt4 book ai didi

困惑为什么通过引用传递 char** 没有按预期工作

转载 作者:太空宇宙 更新时间:2023-11-04 06:22:48 25 4
gpt4 key购买 nike

我现在正在重新学习 C,并在审查通过引用传递时编写了一小段测试代码:

#include <stdio.h>
#include <string.h>

void distort_flags_list(char*** flags);

int NUM_FLAGS = 2;

int main(int argc, char** argv)
{
distort_flags_list(&argv);

for (int flag_offset = 0; flag_offset < NUM_FLAGS; flag_offset++) {
printf("%s\n", *(argv + flag_offset));
}

return 0;
}

void distort_flags_list(char*** flags)
{
char* tester[2] = {"first", "second"};
*flags = tester;
}

我很好奇为什么在运行时会得到以下输出:

first
(null)

而不是打印“第一”和“第二”。根据我的理解,当将指向 argv 的指针传递给 distort_flags_list 时,您正在更改指针指向定义的 tester 地址的位置在那个函数中。

对为什么会发生这种情况有什么解释吗?

最佳答案

在函数 distort_flags_list 中,您将 *flags 的值设置为函数返回后无效的值。

在调用 distort_flags_list 之后访问 argv 中的任何内容是未定义的行为。

要确保值 *flags 在函数返回后继续有效,您需要使用动态内存分配。

void distort_flags_list(char*** flags)
{
*flags = malloc(2*sizeof(**flags));
(*flags)[0] = malloc(20); // Make is large enough
(*flags)[1] = malloc(20); // ditto
strcpy((*flags)[0], "first");
strcpy((*flags)[1], "second");
}

然后,添加代码以在 main 中释放内存。

int main(int argc, char** argv)
{
distort_flags_list(&argv);

for (int flag_offset = 0; flag_offset < NUM_FLAGS; flag_offset++) {
printf("%s\n", *(argv + flag_offset));
}

free(argv[1]);
free(argv[0]);
free(argv);

return 0;
}

关于困惑为什么通过引用传递 char** 没有按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31529849/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com