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

C 多维字符数组在函数内打印,但在传递给另一个函数时不会打印,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, "lin

我试图将数据写入多维数组,然后将数组作为
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);
}
如果相反,我使用以下内容代替给定的
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
才能打印我的字符串

谢谢你

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

// 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);
数组不是指针 数组衰减为指向其第一个元素的指针,但这只发生在第一个维度。因此,2D数组不会衰减为指向指针的指针,它只会衰减为指向数组的指针,因此必须传递给函数:

// 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);

给出的解释很好:指向指针的指针与多维数组不同

解释得很清楚,一个具有语法的二维数组

char-cfg[2][200]


保证在相邻的内存单元中分配。使用malloc分配的指向指针数组的二维指针不会分配到相邻的内存单元中,它将遍布堆。因为每次调用malloc时,都会分配一个新段。因此,在C语言中为多维数组生成泛型函数相当棘手。

给出的解释很好:指向指针的指针与多维数组不同

解释得很清楚,一个具有语法的二维数组

char-cfg[2][200]


保证在相邻的内存单元中分配。使用malloc分配的指向指针数组的二维指针不会分配到相邻的内存单元中,它将遍布堆。因为每次调用malloc时,都会分配一个新段。因此,在C语言中为多维数组生成通用函数是相当棘手的。

2D数组不会退化为指向指针的指针这一事实就是答案。谢谢2D数组不会衰减为指向指针的指针这一事实就是答案。谢谢