在C

时间:2016-07-03 02:37:01

标签: c

我在这里做错了什么?第一个就像一个魅力第二个崩溃。

char *t[3][4] = {
  {"one", "two", "three", "Four"},
  {"Five", "Six", "Seven", "Eight"},
  {"Nine", "Ten", "Eleven", "Twelve"}
};
int i,j;
for (i=0;i<3;i++) {
  for (j=0;j<4;j++) {
    printf("%s\n",t[i][j]);
  }
}

只想在函数中使用相同的数组:

foo(t, 3, 4);

char **foo(char **t, int row, int col) {
  int i,j;
  for (i=0;i<row;i++) {
    for (j=0;j<col;j++) {
      printf("%s\n",t[i][j]);
    }
  }
}

处理终止,状态为-1073741510(0分钟,8秒(s));

2 个答案:

答案 0 :(得分:2)

处理指针很麻烦,特别是对于字符串矩阵。最好以编译器清楚地知道传递给它的方式来编写函数。

将您的功能签名更改为void foo(int row, int col, char* t[][col]) { ... },并相应地将您的功能称为foo(3, 4, t);。你清楚地告诉编译器传递了什么。

答案 1 :(得分:0)

这是我与char **foo(char **t, int row, int col)合作的代码。问题是我有一个**数组,其指针指向它的开头,你不能像一个简单的2d数组那样遍历它,如t [i] [j]。但是您可以使用i * col来到达您想要的行,而j是在第i行中定位第j个元素。 另外请注意,包含字符串的大小并不重要,因为您在数组中有地址。感谢有用的评论女巫让我得到了正确的答案。

for (i=0;i<row;i++)
    {
        for (j=0;j<col;j++)
        {
        printf("%s",*(t+i*col+j)); 
        }
    }