在c. 中使用未初始化的字符串传递2d char数组



对于1d char数组,您可以像这样将它们作为字符串文字传递

#include <stdio.h>
void go(char *a)
{
printf("%s", a);
}
int main() 
{
go("Hello");

return 0;
}

但是我们可以用2d char数组做到这一点吗?比如

void go (int rowSize, int colSize, char a[rowSize][colSize])
{
for (int i = 0; i < rowSize; ++i) {
printf("%sn"), a[i]);
}
}
go(2, 16, {"Hello", "Hi"});

您需要使用复合文字:

void go (size_t rowSize, size_t colSize, char a[rowSize][colSize])
{
for (size_t i = 0; i < rowSize; ++i) 
{
printf("%sn", a[i]);
}
}
int main(void) 
{
go(2, 16, (char[][16]){"Hello", "Hi"});

return 0;
}

正如@Lundin所建议的,你也可以使用指针数组:

void go (size_t nstrings, char **strings)
{
for (size_t i = 0; i < nstrings; ++i) {
printf("%sn", strings[i]);
}
}
int main() 
{
go(2, (char *[]){"Hello", "Hi"});

return 0;
}

或更多const正确版本:

void go (int nstrings, char *const *strings)
{
for (int i = 0; i < nstrings; ++i) {
printf("%sn", strings[i]);
}
}
int main() 
{
go(2, (char *const[]){"Hello", "Hi"});

return 0;
}

对于大小、索引等,最好使用size_tssize_t

如果您想要一个指向只读字符串字面值的数组,它必须是一个字符指针数组,char* array[] = {"Hello", "Hi"};。这种类型与2D字符数组完全不同,它们是不兼容的。

在这种情况下使用哪个表单取决于您想要做什么。这些应该是读/写字符串还是只读的?您是否计划调整单个字符串的大小?等等......字符串字面值总是只读的,所以当指向它们时使用的正确指针类型是const char*。但是,如果您仅将字符串字面值用于初始化读/写2D数组,则这无关紧要。

假设用例只是在函数中打印一堆字符串字面值,没有其他内容,那么最正确的形式是:

#include <stdio.h>
void go(size_t n, const char* a[n]) {
for (size_t i = 0; i < n; ++i) {
puts(a[i]);
}
}
int main() {
go(2, (const char*[]){"Hello", "Hi"});
}

这在功能上几乎与2D数组版本相同,但它可能不使用任何临时内存来存储字符串,因此您可以节省一些2x16字节等(这不是什么大问题)。

最新更新