c - 多维字符数组在函数内打印,但在传递给另一个函数时不打印

标签 c

我正在尝试将数据写入多维数组,然后将该数组作为 const char** 传递给另一个函数。当我在声明它的函数中本地打印 char* 时,一切都按预期工作。但是,当我尝试在另一个函数中打印 char* 数组时,它们都是空字符串。

我正在使用以下代码:

void my_print (const char** lines, unsigned int num)
{
    int i = 0;

    for (i = 0; i < num; i++) {
        fprintf(stderr, "lines[%d]:  %s", i, lines[i]);
    }
}

void my_func ()
{
    char cfg[2][200];
    unsigned int value = 5;

    snprintf(cfg[0], 200, "one two three\n");
    snprintf(cfg[1], 200, "my value = %u\n", value);

    fprintf(stderr, "lines[0] = %slines[1] = %s\n", cfg[0], cfg[1]);

    my_print((const char**) cfg, 2);
}

这会产生以下输出:

lines[0] = one two three
lines[1] = my value = 5
lines[0]:
lines[1]:

如果相反,对于给定的 my_func,我使用以下内容:

void my_func ()
{
    char* cfg[2];
    unsigned int value = 5;

    cfg[0] = malloc(200);
    cfg[1] = malloc(200);
    snprintf(cfg[0], 200, "one two three\n");
    snprintf(cfg[1], 200, "my value = %u\n", value);

    fprintf(stderr, "lines[0] = %slines[1] = %s\n", cfg[0], cfg[1]);

    my_print((const char**) cfg, 2);
}

然后,一切正常,我得到:

lines[0] = one two three
lines[1] = my value = 5
lines[0]: one two three
lines[1]: my value = 5

那么,这里的背景发生了什么?为什么我需要使用 malloc 以便 my_print 能够打印我的字符串?

谢谢

最佳答案

数组不是指针

数组退化 为指向其第一个元素的指针,但这只发生在第一 维度。因此,二维数组不会衰减为指向指针的指针,它只会衰减为指向数组的指针,因此这是您必须传递给函数的内容:

// lines is of type "pointer to array 200 of const char"
void my_print (const char (*lines)[200], unsigned int num)

这行代码是非常非常错误的:

my_print((const char**) cfg, 2);

您可能将转换插入到 const char** 以使编译器静音。不要不要那样做——编译器试图告诉您您做错了什么!关闭它是错误的做法。通过以上对 my_print 定义的更改,您不需要任何转换:

my_print(cfg, 2);

关于c - 多维字符数组在函数内打印,但在传递给另一个函数时不打印,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4763199/

相关文章:

c - 如何使用 fopen 函数进行正确的错误处理

c - 你如何制作一个在数字 2 或 3 之间进行选择的随机数生成器。(不是 1、2、3)

c - 如何查看rpl-ofc.c中的printf语句?

c - 如何删除 C 中的所有赔率位?

检查 charArray 是否只有十六进制数字

c - linux 中等于系统监视器的确切总内存使用量

通过终端构建时更改构建输出目录

c - 通过命令行获取一个十六进制数到程序中

c - 来自 int 的基本 C 强制转换警告指针

c - 使用带超时的 Pcap 收听