C语言中能否无需初始化直接用字符串字面量传递二维char数组
结论
你给出的这种直接传入{"Hello", "Hi"}的写法在标准C中是不支持的,需要调整语法后才能实现类似效果。
原因说明
- 你给出的示例代码本身存在语法错误:
printf("%s\n"), a[i]);多写了一个右括号,正确写法是printf("%s\n", a[i]);。 - C语言默认不支持将未指定类型的匿名聚合初始化列表直接作为函数参数传递,你必须显式声明数组变量再传入,或者使用C99标准引入的复合字面量语法指定类型。
可行写法1:使用C99复合字面量(推荐)
如果你使用的编译器支持C99及以上标准(现在绝大多数主流编译器都支持),可以直接用复合字面量语法指定二维数组类型后传入:
#include <stdio.h> void go (int rowSize, int colSize, char a[rowSize][colSize]) { for (int i = 0; i < rowSize; ++i) { printf("%s\n", a[i]); } } int main() { // 显式指定复合字面量的类型为char[2][16] go(2, 16, (char[2][16]){"Hello", "Hi"}); return 0; }
可行写法2:先声明数组变量再传参
如果需要兼容旧标准C编译器,可以先定义二维char数组变量,再把变量作为参数传入:
#include <stdio.h> void go (int rowSize, int colSize, char a[rowSize][colSize]) { for (int i = 0; i < rowSize; ++i) { printf("%s\n", a[i]); } } int main() { char str_arr[2][16] = {"Hello", "Hi"}; go(2, 16, str_arr); return 0; }
拓展:更灵活的指针数组写法
如果你不需要修改字符串内容,也可以把形参改为char*指针数组类型,不需要指定列长度,写法更简洁:
#include <stdio.h> void go (int rowSize, char *a[]) { for (int i = 0; i < rowSize; ++i) { printf("%s\n", a[i]); } } int main() { go(2, (char*[]){"Hello", "Hi"}); return 0; }
内容的提问来源于stack exchange,提问作者Kain
相关产品推荐
相关产品推荐

