为什么这段代码不起作用?
我有一些旧代码,并且不想在堆中分配a
。
void test(char **str) {
cout << str[0] << endl;
cout << str[1] << endl;
}
int main(int argc, char* argv[]) {
char a[2][5];
strcpy(a[0],"abc");
strcpy(a[1],"def");
char *str1 = (char *)a;
test(&str1);
return 0;
}
答案 0 :(得分:5)
此代码不起作用,因为指向char
的指针不与char
的2 x 5数组相同,有或没有强制转换:< / p>
*
运算符取消引用其元素以下是如何构建与char**
兼容的数组:
char a[2][5];
strcpy(a[0],"abc");
strcpy(a[1],"def");
char *str1[] = { a[0], a[1] };
test(str1);
现在str1
是一个char
指针数组,有两个项目。第一项是包含a[0]
地址的指针;第二项是包含a[1]
地址的指针。指针数组可以传递给期望指向指针的函数,因此test()
函数可以正常工作。
答案 1 :(得分:1)
因为char a[2][5]
是一个存储为10个连续字符的二维数组。但是参数char **str
需要一个指向一维字符数组的指针数组。
保持函数原样,但将一个指针数组传递给char:
...
char *str1[2];
str1[0]=a[0];
str1[1]=a[1];
test(str1);
选择函数接受在secund维度中包含5个元素的2D数组(要传递n维数组,必须预定义最后的n-1维度):
void test(char str[][5]) {
...
}
int main() {
...
test(a);
}
不便之处在于灵活性较差。
如果您的问题与字符串数组特别相关,而不是二维数组更常见的问题,请从char*
切换到std::string
,这样可以让您的生活更轻松!
void test(string str[]) {
...
}
int main(int argc, char* argv[]) {
string a[2] ={ "abc","def" };
test(a);
}
答案 2 :(得分:0)
由于您使用的是C ++,因此可以将test
函数更改为以下内容:
template <int cols> void test(char arr2d[][cols]){
/* whatever */
}
然后您在程序中将a
作为参数(例如test(a)
)调用它,而不进行任何转换或其他类型的转换。