传递指针数组时的奇怪输出 - C

时间:2015-08-04 08:07:35

标签: c arrays pointers

我在main中声明了一个二维数组指针

char* data[3][8]

我传入了一个函数

void func(char*** data)

当我在printf("%p\n", data[0]);中执行main时,在函数中,我在main函数中获得了不同的输出0x7ffeabc27640,并在函数中获得了(nil)。虽然只是data打印输出的地址与main内的地址相同。为什么我不能在函数中访问数组。

2 个答案:

答案 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