2015-03-08 2 views
-1

Итак, я работаю над этой игрой палача. У меня небольшие проблемы с массивами и указателями. Это то, что у меня есть:Возврат элемента из массива в функции C

char* getword(int index); 
int main (void) { 

char *secword = getword(1); 
printf("%s ", *secword); 
} 

char *getword(int index) 
{ 
char *words[8]= {'bye', 'hi','what', 'cat', 'dog', 
        'bird', 'air', 'water', 'fire'}; 
return words[index]; 
} 

Я продолжаю получать ошибку сегментации (сброс ядра).

+4

Строки в C используют двойные кавычки. В этом массиве также есть 9 строк, а не 8. –

+1

Да, как вам удалось добраться до segfault ?? –

+1

используйте 'char const *' вместо 'char *', и вам либо нужно использовать 'printf ("% s ", secword);' или 'printf ("% c ", * secword);'. Обратите внимание на сообщения компилятора; если есть какие-либо предупреждения или ошибки, даже не беспокойтесь о запуске вашей программы - сначала исправьте ошибки. –

ответ

1

У вас есть четыре важных ошибок

  1. Вы не можете использовать words вне функции getword() быть причиной он выделяется в кадре стека функции.

    Итак, когда функция возвращается, массив освобождается, и таким образом происходит неопределенное поведение.

  2. Ваш массив не содержит строк, а вместо этого multicharacter contants. Константы Multicharacter действительны, но определены в реализации, поэтому вы не можете полагаться на них для переносимой программы.

    Ваш код компилируется, потому что вы не включали предупреждения, а затем целочисленное значение, которое зависит от реализации констант с несколькими символами, присваивается пуантам массива при попытке доступа к адресам при этих значениях для печати происходит то неопределенное поведение.

  3. printf() ожидает char указателя для каждого "%s" спецификатора *secword имеет тип char так что это тоже неправильно, это снова компиляцию, потому что вы не включили предупреждения компилятора.

  4. Вы инициализируете массив словами 9 вместо 8, еще одной проблемой, о которой сообщалось бы предупреждениями компилятора.

У вас есть 2 варианта

  1. Сделать words статичным в функции getword()

    const char *getword(int index); 
    int main (void) 
    { 
        char *secword = getword(1); 
        printf("%s\n", secword); 
    } 
    
    const char *getword(int index) 
    { 
        static const char *words[9] = {"bye", "hi", "what", "cat", "dog", 
                "bird", "air", "water", "fire" 
        }; 
        return words[index]; 
    } 
    
  2. Объявить words в основном, и передать его в getword()

    const char *getword(int index, const char *words[]); 
    int main (void) 
    { 
        const char *words[9] = {"bye", "hi", "what", "cat", "dog", 
              "bird", "air", "water", "fire" 
        }; 
        char *secword = getword(1, words); 
        printf("%s\n", secword); 
    } 
    
    const char *getword(int index, const char *words[]) 
    { 
        return words[index]; 
    } 
    

Я пишу c-программы некоторое время, и я использую столько предупреждений, сколько может дать мой компилятор, если бы я был новым программистом, изучающим c. Я бы включил еще больше предупреждений, если это возможно.

+0

Имейте upvote - я задавался вопросом, когда кто-то в конце концов предложит const. –

+0

'static' не требуется - в то время как' words' недействителен после возврата, 'words [index]' is (строковые литералы имеют статическую продолжительность хранения). И, по моему опыту, обращать внимание на предупреждения - это более важная часть, чем предлагать больше запросов - за исключением 3. компилятор уже предупреждал (если это не предварительный ANSI-компилятор, что я предполагаю). – mafso

0
char* getword(int index); 

int main (void) { 
     char *secword = getword(1); 
     printf("%s ", secword); 
} 

char *getword(int index) 
{ 
    static char *words[9]= {"bye", "hi","what", "cat", "dog", 
        "bird", "air", "water", "fire"}; 
    return words[index]; 
} 

Должно быть что-то вроде этого ...

0

Несколько вещей неправильно с вашей программой:

  1. При использовании char* переменных (или каких-либо указателей), вы должны всегда выделить их память сначала с malloc.Не забудьте также освободить его. Альтернативой распределению памяти вручную является использование массивов с фиксированными размерами.

  2. Не печатайте строки при печати (printf("%s ", *secword)).

  3. Убедитесь, что вы указали правильное количество элементов при объявлении массива (есть 9, а не 8), и не забудьте проверить степень перехода по границам массива.

  4. В C все строки имеют двойные кавычки; одиночные кавычки обозначают символьные константы.