C:二维阵列的大小

Wic*_*man 15 c arrays dimensional

我需要一些帮助来计算二维数组的行和列.好像我不能算列?

#include <stdio.h>

int main() {

char result[10][7] = {

    {'1','X','2','X','2','1','1'},
    {'X','1','1','2','2','1','1'},
    {'X','1','1','2','2','1','1'},
    {'1','X','2','X','2','2','2'},
    {'1','X','1','X','1','X','2'},
    {'1','X','2','X','2','1','1'},
    {'1','X','2','2','1','X','1'},
    {'1','X','2','X','2','1','X'},
    {'1','1','1','X','2','2','1'},
    {'1','X','2','X','2','1','1'}

};

int row = sizeof(result) / sizeof(result[0]);
int column = sizeof(result[0])/row;

printf("Number of rows: %d\n", row);
printf("Number of columns: %d\n", column);

}
Run Code Online (Sandbox Code Playgroud)

输出:
行数:10
列数:0

Aug*_*rom 11

使用数组长度宏更方便(并且更不容易出错):

#include <stdio.h>

#define LEN(arr) ((int) (sizeof (arr) / sizeof (arr)[0]))

int main(void)
{
    char result[10][7];

    printf("Number of rows: %d\n", LEN(result));
    printf("Number of columns: %d\n", LEN(result[0]));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*ler 8

这是整数除法的问题!

int column = sizeof(result[0])/row;
Run Code Online (Sandbox Code Playgroud)

应该

int column = 7 / 10;
Run Code Online (Sandbox Code Playgroud)

在整数除法中7/10==0.

你想要做的是划分一行的长度,例如.sizeof(result[0])通过该行的一个元素的大小,例如.sizeof(result[0][0]):

int column = sizeof(result[0])/sizeof(result[0][0]);
Run Code Online (Sandbox Code Playgroud)

  • 为什么这是错误的?sizeof (result) = 70、sizeof(result[0]) = 7、sizeof(result[0][0]) = 1,因此行数 = 70/7 = 10 是正确的,列数 = 7 /1 = 7 也是正确的。即使你将类型从 char 更改为 int (假设 int = 32bits),sizeof (result) = 280, sizeof (result[0]) = 28, sizeof (result[0][0]) = 4,所以,您可以再次注意到,行数 = 280/28 = 10 是正确的,列数 = 28/4 = 7 也是正确的。 (5认同)
  • 这是错的.在这里,您将7(第一行上的元素数)除以1(`result [0] [0]`上的字符数). (2认同)

emi*_*emi 8

这对我有用(评论解释了原因):

#include <stdio.h>

int main() {

   char result[10][7] = {

       {'1','X','2','X','2','1','1'},
       {'X','1','1','2','2','1','1'},
       {'X','1','1','2','2','1','1'},
       {'1','X','2','X','2','2','2'},
       {'1','X','1','X','1','X','2'},
       {'1','X','2','X','2','1','1'},
       {'1','X','2','2','1','X','1'},
       {'1','X','2','X','2','1','X'},
       {'1','1','1','X','2','2','1'},
       {'1','X','2','X','2','1','1'}

   }; 

   // 'total' will be 70 = 10 * 7
   int total = sizeof(result);

   // 'column' will be 7 = size of first row
   int column = sizeof(result[0]);

   // 'row' will be 10 = 70 / 7
   int row = total / column;

   printf("Total fields: %d\n", total);
   printf("Number of rows: %d\n", row);
   printf("Number of columns: %d\n", column);

}
Run Code Online (Sandbox Code Playgroud)

这个输出是:

Total of fields: 70
Number of rows: 10
Number of columns: 7
Run Code Online (Sandbox Code Playgroud)

编辑:

正如@AnorZaken指出的那样,将数组作为参数传递给函数并sizeof在其上打印结果,将输出另一个total.这是因为当你传递一个数组作为参数(而不是指向它的指针)时,C会将它作为副本传递,并在它们之间应用一些C魔法,所以你没有像你想象的那样传递完全相同的东西.为了确定你正在做什么并避免一些额外的CPU工作和内存消耗,最好通过引用传递数组和对象(使用指针).所以你可以使用这样的东西,结果和原作相同:

#include <stdio.h>

void foo(char (*result)[10][7])
{
   // 'total' will be 70 = 10 * 7
   int total = sizeof(*result);

   // 'column' will be 7 = size of first row
   int column = sizeof((*result)[0]);

   // 'row' will be 10 = 70 / 7
   int row = total / column;

   printf("Total fields: %d\n", total);
   printf("Number of rows: %d\n", row);
   printf("Number of columns: %d\n", column);

}

int main(void) {

   char result[10][7] = {

       {'1','X','2','X','2','1','1'},
       {'X','1','1','2','2','1','1'},
       {'X','1','1','2','2','1','1'},
       {'1','X','2','X','2','2','2'},
       {'1','X','1','X','1','X','2'},
       {'1','X','2','X','2','1','1'},
       {'1','X','2','2','1','X','1'},
       {'1','X','2','X','2','1','X'},
       {'1','1','1','X','2','2','1'},
       {'1','X','2','X','2','1','1'}

   };

   foo(&result);

   return 0;
}
Run Code Online (Sandbox Code Playgroud)

  • 代码对我来说是自动解释的,但了解你.现在编辑答案. (4认同)
  • 没有解释的代码答案通常对未来的访问者非常无益.考虑编辑您的答案,以提供有关您的解决过程的更多信息/见解. (2认同)