Почему компилятор не может получить длину строки для массива строк? - PullRequest
4 голосов
/ 13 ноября 2009

Примечание: На этот вопрос повлиял этот ответ .

Действительный код C:

char myString[] = "This is my string";

Это позволит разместить в стеке строку длиной 18 (включая символ \0) и присвоить ей указанное значение.

Однако, следующее:

char myStrings[][] = {"My 1st string", "My 2nd string", "My 3rd string"};

недопустимо, выдавая ошибку «тип массива имеет неполный тип элемента».

Итак, я должен указать массив следующим образом:

char myStrings[][20] = {"My 1st string", "My 2nd string", "My 3rd string"};

Где 20 - это число, которое больше моей самой длинной строки.

Компилируется и работает как положено.

Если компилятор может динамически определять длину строки при выделении одной строки в стеке, почему он не может сделать это для массива строк?

Edit:

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

Ответы [ 4 ]

5 голосов
/ 13 ноября 2009

Одна вещь заключается в том, чтобы «ощутить» длину одной строки. Другое дело, чтобы вычислить максимальную длину многих строк. Существует определенная интуитивная качественная разница между ними. Таким образом, авторы языка, вероятно, решили, что первое является простым и полезным, но второе слишком компилируемо и менее полезно.

4 голосов
/ 13 ноября 2009

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

const char* myStrings[] = {"My 1st string", "My 2nd string", "My 3rd string"};
3 голосов
/ 13 ноября 2009

Поскольку компилятор видит это

char myStrings[][20] = {"My 1st string", "My 2nd string", "My 3rd string"};

в

char myStrings[][20] = {(char*), (char*), (char*)};

Затем, errrr ... хммм, с помощью "волшебства компилятора" он может скопировать символы из этих (char*) в массив myStrings [0] и myStrings [1], ....


Редактировать

Вы не можете иметь «зубчатые массивы» в C. Предположим, у вас было

char my_strings[][] = {"a", "ab", "abc", "foo foo fo foo foo", "abc", "ab", "a"};

my_strings[0] требуется то же пространство, что и my_strings[3], поскольку язык требует, чтобы элементы массива были смежными, и ему нужен определенный размер каждого массива.

my_strings in memory
    'a' '\0' '\0' ...  '\0' but must be a definite size
    'a' 'b'  '\0' ...  '\0' definite size
    ...
    'f' 'o'  'o'  ...  '\0'
    ...

Чтобы найти максимальный размер и инициализировать массив (ы), компилятору потребуется выполнить два прохода над строковыми литералами.

2 голосов
/ 13 ноября 2009

char myString [] = "..." - это одномерный массив, и он будет работать. char myStrings [] [] = {"...", "..."} - это двумерный массив с (возможно) различной длиной строки, и это не будет работать. char myStrings [] [20] - это двумерный массив с фиксированной длиной строки, и он будет работать.

Согласно стандартам C, компилятор не может определить длину строки в двумерных массивах.

Но я думаю, это возможно в Java.

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