我试图将数据写入多维数组,然后将数组作为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
能够打印我的字符串?
谢谢你
答案 0 :(得分:6)
数组衰减指向其第一个元素的指针,但这只发生在第一个维度。因此,一个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);
答案 1 :(得分:0)
给出的解释是好的:指针指针不与多维数组相同。
简单解释一下,使用语法
的二维数组char cfg [2] [200];
保证分配在相邻的存储单元中。分配有malloc的二维指针到指针数组将不分配到相邻的存储单元中,它将遍布整个堆。因为每次调用malloc时,都会分配一个新段。因此,在C中为多维数组制作泛型函数非常棘手。