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

标签 c pass-by-reference

我现在正在重新学习 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/

相关文章:

c - 如何在 C 中将结构体数组中的名称值作为引用传递?

java - Java 中的按引用传递行为递归 : Combinations and permutations of strings

c++ - 添加和删​​除最后一位

c++ - 是否有将 SHA1 散列表示为 C 字符串的标准方法,我如何转换成它?

c - SSE等 vector 编程(SIMD)

C++ 引用困惑(以及一些复制构造函数)

php - 在 PHP 数组中创建引用键

在 C 中比较包含 IPv4 地址的字符串

c - write() 在写入大数据后永远被阻塞

c++ - 返回一个字符串/通过引用传递