LINUX.ORG.RU

С и символьные массивы

 


0

2

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

Есть в С символьные массивы и функции, и вот в той самой книге K&R описано поведение и вот к примеру код:

#include <stdio.h>
#include <string.h>
void change_a(char b[]);

int main() {
    char a[] = "test\n";
    printf(a);
    
    change_a(a);
    
    printf(a);

    return 0;
}

void change_a(char b[]) {
    int i;
    for (i = 0; i < strlen(b) -1; i++)
        b[i] = '3'; 
    
}

Этот код можно запуститьи увидеть что a[] изменяется. Я понимаю как это работает, я разобрался, да. Но почему оно так работает? Мы передаем массив в функцию, которая ничего не возвращает. Мы не переприсваем новые данные этому массиву в основной функции. Итого передав массив в качестве аргумента к какой-либо функции этот самый аргумент может быть изменен? Я не дошел еще до ссылок, но это не похоже на ссылки. Может кто-то объяснить почему так? Я могу и путать конечно, но разве этой не основа основ? То что передается в качестве аргумента не должно быть изменено, если нет явного присваивания.



Последнее исправление: beastie (всего исправлений: 1)
Ответ на: комментарий от registrant27492

Так же. void foo(const char ** s)

и как использовать такую функцию?

char **data;
...
foo(data);

так? а что делать с варнингами? а если у меня варнинги трактуются как ошибки? какие бест практисес на этот случай?

vvviperrr ★★★★★
()
Последнее исправление: vvviperrr (всего исправлений: 3)
Ответ на: комментарий от t1nman

да я тут царя потроллить решил) как-то плохо он троллится. тугой попался.

на мой взгляд в этом случае не стоит использовать квалификатор const.

vvviperrr ★★★★★
()
Последнее исправление: vvviperrr (всего исправлений: 1)
Ответ на: комментарий от vvviperrr

и как использовать такую функцию?

Что тебе помешает?

а что делать с варнингами?

Понятия не имею. Кастуй, вырубай конкретный варнинг в этом месте.

а если у меня варнинги трактуются как ошибки?

Это твоя проблема, а не моя. Что там низшие формы жизни мира сего себе «надумали» - мне не важно.

какие бест практисес на этот случай?

Понятия не имею.

registrant27492
()
Ответ на: комментарий от vvviperrr

да я тут царя потроллить решил) как-то плохо он троллится. тугой попался.

Естественно плохо - каким образом ты вообще меня можешь затралить. Я помню ещё твои убоги потуги с тредов про указатели.

Да и поймать меня не получиться. Но ты попытался.

на мой взгляд в этом случае не стоит использовать квалификатор const.

И как только ты это выклал - ты проиграл, ибо а) не я говорил про const и б) я всегда говорил, что const для даунов, ибо смысла в сишке не имеет, кроме как для борьбы с конпелятором. Пруфцов на лоре тыщи - ищи.

registrant27492
()
Ответ на: комментарий от vvviperrr

Ну а дальше? Ну какрукнул ты это и что? Царь никогда не не говорил, что он разбирается в каких-то плебейских «бест практисес». И ему интересные ваши потуги со всякой хернёй назначение и причины которой вы объяснить не можете, а только обделаться, либо слиться в жалких попытках рассказать о том, что «я не могу писать код - это надо для ламерков», но мне насрать.

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

registrant27492
()
Ответ на: комментарий от vvviperrr

функция принимает указатель на указатель на данные. я хочу защитить сами данные (не указатели) от случайного изменения. как быть?

registrant27492
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.