Почему мой bzero() вызывает ошибку шины с моим массивом символов?

Я пытаюсь понять, почему мой простой код, использующий bzero или memset, вызывает bus error с clangили gcc, я не нахожу логического объяснения.

Я пробую простой пример из этого сообщения: Правильный способ очистить C-строку

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

int main() {
    char *str;
    printf("%lu\n",strlen(str));
    bzero(str,1); // ok
    str = "bonjour";
    bzero(str,strlen(str)); // bus error
    // memset(str, 0, strlen(str)); // bus error
    return(0);
}

person Knupel    schedule 23.09.2020    source источник
comment
str — это указатель на строковый литерал, их нельзя изменить, используйте char str[8], strlen(str) тоже плохо, так как str не инициализирован.   -  person anastaciu    schedule 23.09.2020
comment
char *str — это указатель без инициализации. Вы просто выполняете операции со случайной памятью. Это не хорошо. Вместо этого сделайте char str[8]; или около того.   -  person JHBonarius    schedule 23.09.2020
comment
Я выбрал два дубликата, по одному для каждой ошибки, упомянутой в комментариях выше.   -  person Lundin    schedule 23.09.2020
comment
str = "bonjour"; не должно работать. stackoverflow.com/a/11864462   -  person JHBonarius    schedule 23.09.2020
comment
Таким образом, обычный порядок изучения C был бы таким: массивы, затем указатели, затем строки. А не наоборот.   -  person Lundin    schedule 23.09.2020
comment
@JHBonarius, это правильное утверждение, оно присваивает строковый литерал указателю str, просто это не работает, как ожидал ОП. Он должен быть точно квалифицирован const, чтобы избежать того, что пытается сделать ОП.   -  person anastaciu    schedule 23.09.2020
comment
@Lundin - если вы не принимаете CS50 :-)   -  person Steve Friedl    schedule 23.09.2020
comment
@SteveFriedl, это одна из тех вещей, которые не следует изобретать :)   -  person anastaciu    schedule 23.09.2020
comment
@JHBonarius и @anastaciu, спасибо, на данный момент я решаю проблему с помощью strcpy(). Я ошибся, когда написал str = "bonjour когда использую printfтерминал пишу bonjourПоэтому я думал, что мой код в порядке, но это не так :( спасибо вообще.   -  person Knupel    schedule 23.09.2020
comment
@anastaciu Я использовал компилятор C++. наверное, поэтому у меня не работало ;)   -  person JHBonarius    schedule 23.09.2020
comment
@JHBonarius, да, в C ++ неконстантные строковые литералы запрещены, к счастью. Хотя gcc и clang выдают предупреждения только из-за расширений C99, к сожалению.   -  person anastaciu    schedule 23.09.2020
comment
@SteveFriedl В таком случае они учат вас становиться безнадежным делом, так что это не имеет значения.   -  person Lundin    schedule 23.09.2020