我在main中声明了一个二维数组指针
char* data[3][8]
我传入了一个函数
void func(char*** data)
当我在printf("%p\n", data[0]);
中执行main
时,在函数中,我在main函数中获得了不同的输出0x7ffeabc27640
,并在函数中获得了(nil)
。虽然只是data
打印输出的地址与main
内的地址相同。为什么我不能在函数中访问数组。
答案 0 :(得分:5)
如果您启用了一些警告(您应该经常这样做),您将获得:
main.cpp: In function 'main':
main.cpp:6:10: warning: passing argument 1 of 'func' from incompatible pointer type
func(data);
^
main.cpp:2:6: note: expected 'char ***' but argument is of type 'char * (*)[8]'
void func(char*** data) { (void)data; }
^
它告诉你确切的错误,即数组不是指针。取消引用已转换为错误类型的指针是未定义的行为,因此您可以取回任何内容。
如果您想为char *(*)[8]
提供char *(*)[8]
,请将您的功能纳入void func(char *(*data)[8]);
:
data
或者,如果你想强调void func(char *data[][8]);
应该指向数组的第一个元素:
main.cpp
这两种语法完全等效。
注意:该文件名为{{1}},但确实以C模式编译。
答案 1 :(得分:0)
将2D数组传递给函数 -
这将有助于您阅读并更好地了解如何执行此操作...
http://www.geeksforgeeks.org/pass-2d-array-parameter-c/
以下是网页的摘要 - 显示了如何执行此操作的一个示例。
#include <stdio.h>
const int n = 3;
void print(int arr[][n], int m)
{
int i, j;
for (i = 0; i < m; i++)
for (j = 0; j < n; j++)
printf("%d ", arr[i][j]);
}
int main()
{
int arr[][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
print(arr, 3);
return 0;
}
Output:
1 2 3 4 5 6 7 8 9