Как найти размер многомерного массива в C - PullRequest
5 голосов
/ 18 сентября 2009

Я объявил двумерный массив следующим образом:

char *array[][3] = {
    {"a", "b", "c"},
    {"d", "e", "f"},
    {"u", "v", "w"},
    {"x", "y", "z"}};

Как мне узнать первое измерение?

Ответы [ 2 ]

11 голосов
/ 18 сентября 2009

размер массива / размер массива [0]

Пример: *

#include <stdio.h>

int main(void) {
  int array[4];

    printf("%zd\n", sizeof array / sizeof array[0]);
    printf("%zd\n", sizeof (int));
    printf("%ld\n", (long)(sizeof array / sizeof array[0]));
    return 0;
}


* Вам нужны парены, если операндом является type-name, хотя sizeof является оператором, а не функцией. Но в любом месте, где type-name появляется в грамматике C (деклараторы не используют эту продукцию), вокруг нее требуются символы скобок. Поскольку в полуформальных грамматиках, используемых для различных спецификаций C, не существует отдельного производства для имени типа «в именах», они определяют необходимые символы в выражениях, таких как sizeof, generic-associations и cast-expressions. Но эти парены действительно существуют для того, чтобы иметь возможность анализировать тип в грамматике выражения. Они являются частью синтаксиса чего-то, что вы могли бы назвать «выражениями типов», но, учитывая ограниченное использование таких вещей, у них фактически нет такого производства или термина.
4 голосов
/ 18 сентября 2009

Почему бы вам не дать:

sizeof(array) / sizeof(char*) / 3

выстрел?

Предполагается, что вы знаете тип данных (char *) и другое измерение (3).

Вы делите размер структуры на размер каждого элемента, чтобы получить общее количество элементов, а затем делите его на первое измерение, давая вам второе.

В сторону: мой первоначальный ответ использовал 'sizeof("a")', что, конечно, было неверно, так как это был размер массива (2, будучи 'a' и '\ 0'), а не указатель (4 на моей ужасно устаревшей 32-битной машине). Но мне нравится, как я получил два отзыва за этот неправильный ответ - разве вы не проверяете ответы здесь до голосования? : -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...