2014-10-12 2 views
0

Может кто-нибудь объяснить мне, почему этот код не работает?«C» Ошибка сегментации с помощью массива 2d

#include <stdio.h> 
#include <stdlib.h> 

void findAndPrint(char *arr[], int year, int month, int day); 

int main() 
{ 
    char *dayTab[] = { 
     {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, 
     {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} 
    }; 
    findAndPrint(dayTab, 3, 3, 3); 
    getchar(); 
    return 0; 
} 

void findAndPrint(char *arr[], int year, int month, int day){ 
    int d = 0; 
    if(month > 12 || month < 1 || day > 31 || day<1) 
     return; 
    int leap = ((year%4==0 && year%100!=0) || year%400 == 0)?1:0; 
    int i; 
    for(i=0; i<month-1; i++){ 
     d += arr[leap][i]; 
    } 
    d+= day; 
    printf("Day = %d", d); 
} 

IDE (Code :: Blocks) пишет: "Программа получила сигнал SIGSEGV. Неисправность Сегментация."

+0

Компилятор не знает размеры 'char * arr []' внутри функции 'findAndPrint'. Либо передайте его как 'char arr [] [12]' (или как 'char [2] [12]', если вы действительно этого хотите), или просто объявите его внутри функции, поскольку он кажется логически правильным местом для него , Кроме того, объявите его 'static', если вы намереваетесь вызывать его более одного раза, чтобы избежать инициализации при каждом вызове. –

+0

'void findAndPrint (char arr [] [12], int year, int month, int day);', 'char dayTab [] [12] = {' – BLUEPIXY

+0

Вам действительно нужно заботиться о предупреждениях, выпущенных компилятором. Они не предназначены для развлечения ... – alk

ответ

4

Сначала вам нужен 2-й массив символов, не массив указателей на символы.

char dayTab[][12] = { 
    {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, 
    {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} 
}; 

Затем вы должны изменить функцию, чтобы принять этот тип.

void findAndPrint(char arr[][12], int year, int month, int day) ; 

Остальное выглядит нормально.

Попытка с параметрами:

findAndPrint(dayTab, 2014, 10, 12); 

дает нам день: 285

Что является правильным, yaaay!

+0

Как я знаю, я могу создать этот массив как _array указателей на символы_. – user3051029

+0

Потому что вы хотите, чтобы целые числа не указатели. – 2501

+0

Lol, ладно. Я понял. – user3051029

1

Если я правильно понял ваше намерение, вы хотели, чтобы эти вложенные последовательности {31, 28, ... } служили в виде char[] массивов, на которые указывали бы указатели в массиве верхнего уровня.

Несмотря на то, что говорится в другом ответе (ответах), неверно говорить, что вам обязательно нужен литеральный 2D-массив (хотя в этом случае 2D-массив может быть лучшей идеей, чем то, что вы пытались сделать). Исходная попытка тоже будет работать, если вы используете правильный синтаксис.

Теперь вы не можете просто установить последовательность {31, 28, ... } в середине кода и ожидать, что компилятор будет интерпретировать его как массив. Язык не имеет такой функции, но имеет аналогичный язык с немного отличающимся синтаксисом. Единственный способ добиться правильной инициализации вашего массива char *dayTab[] в том, что «встроенный» способ состоит в использовании функции соединения буква. Инициализация будет выглядеть следующим образом

char *dayTab[] = { 
    (char []) { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }, 
    (char []) { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 } 
}; 

Примечания дополнительного (char []) синтаксиса. Это абсолютно необходимо. Это единственное, что вы должны изменить в своем исходном коде, чтобы он скомпилировался по назначению.

То, что вы в настоящее время имеете в своем исходном коде, недействительно C. Если какой-то компилятор принял этот код (GCC в CodeBlocks?), То только из-за некоторого расширения компилятора. В этом конкретном случае это расширение компилятора сыграло с вами жестокую шутку. Я даже не знаю, как это интерпретировалось компилятором, но определенно не так, как вы предполагали, что это будет интерпретироваться.

P.S. В моих экспериментах GCC предоставил стену диагностических сообщений в ответ на наш оригинальный код. Получали ли вы эти сообщения от своего компилятора? Вы просто проигнорировали их?

Смежные вопросы