Чего вы ожидаете от того, что должен делать int2month?
У вас есть ментальная модель того, как выглядит память?Вот мое графическое представление памяти, например:
pszMonths = [ . , . , . , ...]
| | |
| | |
V | |
"invalid" | V
| "February"
V
"January"
pszMonths - это массив, с которым вы уже должны быть знакомы.Однако элементы массива являются указателями.Вы должны следовать за стрелками до их значений, в этом случае строки.Этот вид косвенного представления необходим: это нелегко сделать с плоским представлением, потому что у каждого названия месяца есть своя, переменная длина.
Очень сложно сказать, где вы застряли, не имея большеобсуждение.Вы должны сказать больше.
[Редактировать]
Хорошо, вы сказали немного больше.Похоже, вам нужно немного больше узнать о программной модели Си.Когда ваша программа компилируется, она сводится к части кода и части данных.
Что входит в часть данных?Такие вещи, как строковые литералы.Каждый строковый литерал выложен где-то в памяти.Если ваш компилятор хорош, и если вы используете один и тот же литерал дважды, ваш компилятор не будет иметь двух копий, но будет использовать их повторно.
Вот небольшая программа для демонстрации.
#include <stdio.h>
int main(void) {
char *name1 = "foo";
char *name2 = "foo";
char *name3 = "bar";
printf("The address of the string in the data segment is: %d\n", (int) name1);
printf("The address of the string in the data segment is: %d\n", (int) name2);
printf("The address of the string in the data segment is: %d\n", (int) name3);
return 0;
}
Вот как все выглядит, когда я запускаю эту программу:
$ ./a.out
The address of the string in the data segment is: 134513904
The address of the string in the data segment is: 134513904
The address of the string in the data segment is: 134513908
Когда вы запускаете программу на C, часть данных вашей программы (а также часть кода вашей программы, конечно),загружается в память.Любой указатель, который ссылается на местоположение в данных, является хорошим, если ваша программа продолжает работать.Указатель на где-то в данных действителен при вызовах функций, в частности.
Посмотрите на результаты более внимательно.name1 и name2 являются указателями на одно и то же место в данных, потому что это одна и та же буквенная строка.Ваш компилятор C часто очень хорошо сохраняет данные компактными и нефрагментированными, поэтому вы можете видеть, что байты для "bar" хранятся прямо по сравнению с байтами для "foo".
(Что мыЭто низкоуровневая деталь, и, возможно, не всегда тот случай, когда компилятор будет упаковывать строковые литералы бок о бок: у вашего компилятора есть свобода помещать представление этих строк практически в любом месте. Но приятно видеть, чтоздесь это делается.)
Как примечание, вот почему для C-программы вполне нормально делать что-то вроде этого:
char* good_function() {
char* msg = "ok";
return msg;
}
, но не нормально делать что-то вроде этого:
char* bad_function() {
char msg[] = "uh oh";
return msg;
}
Эти две функции имеют совершенно разные значения!
- Первая говорит компилятору: «Сохраните эту строку в сегменте данных. Когда вы запустите эту функцию, верните мнеадрес в сегмент данных ".
- Вторая плохая функция здесь говорит:" Когда вы запускаете эту функцию: создайте временную переменную в стеке с достаточным пространством для записи"О, о"Теперь удалите временное пространство и верните адрес в стек ... о, подождите, этот адрес никуда не указывает, это хорошо ... "