Я пытаюсь понять, почему мой простой код, использующий 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);
}
str
— это указатель на строковый литерал, их нельзя изменить, используйтеchar str[8]
,strlen(str)
тоже плохо, так какstr
не инициализирован. - person anastaciu   schedule 23.09.2020char *str
— это указатель без инициализации. Вы просто выполняете операции со случайной памятью. Это не хорошо. Вместо этого сделайтеchar str[8];
или около того. - person JHBonarius   schedule 23.09.2020str = "bonjour";
не должно работать. stackoverflow.com/a/11864462 - person JHBonarius   schedule 23.09.2020str
, просто это не работает, как ожидал ОП. Он должен быть точно квалифицированconst
, чтобы избежать того, что пытается сделать ОП. - person anastaciu   schedule 23.09.2020str = "bonjour
когда используюprintf
терминал пишуbonjour
Поэтому я думал, что мой код в порядке, но это не так :( спасибо вообще. - person Knupel   schedule 23.09.2020