Ошибка передачи массива C в качестве параметра функции char * - PullRequest
2 голосов
/ 19 сентября 2010

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

#include <stdio.h>
#include <ctype.h>

char* to_up(char* str_); 

int main()
{
    char any_phrase[] = "This is a phrase";
    printf("%s\n", to_up(any_phrase));
    printf("%s\n", to_up("this is another phrase"));
    return 0;
}

char* to_up(char* str_) 
{
    int i;
    for (i=0; str_[i]; i++) 
        str_[i] = toupper(str_[i]);
    return str_;
}

Ответы [ 4 ]

3 голосов
/ 19 сентября 2010

Причина ошибки заключается в том, что когда вы передаете строку как «это другая фраза» сама по себе, как, например, она не содержится в переменной, строка называется так называемым строковым литералом.Помимо прочего, это означает, что строка является константой: вам просто не разрешено изменять.

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

2 голосов
/ 19 сентября 2010

Строковый литерал обычно находится в постоянной памяти. Что касается стандарта, попытка изменить его приведет к неопределенному поведению независимо от того, где он находится в памяти. По этой проблеме уже задано много вопросов.

1 голос
/ 19 сентября 2010

Код компилируется для меня нормально, но выдает ошибку шины (дамп ядра) во время выполнения.

Проблема в том, что строковый литерал может храниться в памяти только для чтения, поэтому вы не можете изменить строковый литерал, как это делает ваш код. Если включено достаточное количество предупреждений компилятора, ваш компилятор предупредит вас (GCC требует -Wwrite-strings - по крайней мере, в GCC 4.4 и выше).

1 голос
/ 19 сентября 2010

В этом звонке

printf("%s\n", to_up("this is another phrase"));

Вы пытаетесь изменить строковый литерал.

...