Ошибка сегментации вокруг strcpy?
12743 просмотра
4 ответа
Я знаю, что ты будешь меня стучать по рукам, но.
Почему это делает ошибку сегментации
char* cmd;
strcpy(cmd, argv[0]);
когда это не
char *cmd;
cmd = "plop";
Некоторое время я не тренировался и не могу вспомнить почему.
PS: на самом деле, я знаю, что что-то подобное, до strcpy, было бы лучше
char *cmd = (char*) malloc(strlen(argv[0]));
но мне просто интересно, почему эта ошибка сегментации.
Спасибо !
Автор: roro Источник Размещён: 12.11.2019 09:52Ответы (4)
9 плюса
Когда вы делаете:
char * cmd;
Вы выделяете указатель на стек . Этот указатель не инициализируется каким-либо значимым значением.
Затем, когда вы делаете это:
strcpy(cmd, argv[0]);
Вы копируете содержащуюся строку в argv[0]
указанный адрес cmd
, что ... что-то бессмысленное. Так как вам повезло, это просто segfaults.
Когда вы делаете это:
cmd = "plop";
Вы присваиваете cmd
адрес статически распределенной строковой константе. Поскольку такие строки доступны только для чтения, запись в них - неопределенное поведение.
Итак, как это решить? Выделите память для времени выполнения для записи. Есть два способа:
Первый - разместить данные в стеке, например так:
char cmd[100]; // for instance
Это выделяет массив 100 char
с в стеке. Тем не менее, это не обязательно надежно, потому что вы должны знать заранее, сколько памяти вам нужно. Стек также меньше, чем куча. Что приводит нас к варианту № 2:
char *cmd = malloc(whatever_you_need); // no need to cast, by the way, unless you're in C++
Это выделяет whatever_you_need
char
s в куче. Не забудьте освободить память, free
когда закончите.
5 плюса
Вы получаете сег. ошибка, потому что cmd
в вашем первом примере ничего не указано (или, скорее, оно указывает на что-то, что не определено - поэтому попытка чтения символов или записи символов в указатель, вероятно, приведет к нарушению доступа).
Во втором примере вы устанавливаете cmd для указания на допустимую строку символов.
Автор: Will A Размещён: 22.06.2011 11:343 плюса
Если вы хотите легко сделать копию argv [0],
char* cmd = strdup(argv[0]);
Конечно, вам лучше проверить, что результат strdup равен нулю или нет. :)
Автор: mattn Размещён: 23.06.2011 12:341 плюс
Мне просто интересно, почему эта ошибка сегментации.
Потому что, если cmd
это глобальная переменная, ее значение NULL
, которое не доступно для записи, и если это локальная переменная, то ее значение не определено, и вы не должны использовать его (но он может делать все, что вы делаете, что хуже, чем NULL в много случаев).
Вопросы из категории :
- c Как вы форматируете unsigned long long int, используя printf?
- c What are the barriers to understanding pointers and what can be done to overcome them?
- c Как реализовать продолжения?
- c Как вы передаете функцию в качестве параметра в C?
- c Как получить список каталогов в C?
- c В чем разница между #include <filename> и #include "filename"?
- segmentation-fault Почему я получаю ошибку сегментации при записи в строку, инициализированную "char * s", но не "char s []"?
- segmentation-fault Что такое ошибка шины?
- segmentation-fault В ожидании сбоя отладчика?
- segmentation-fault Почему этот C-код обращения строки вызывает ошибку сегментации?
- segmentation-fault Ошибка сегментации на больших размерах массива
- segmentation-fault Ошибка сегментации в зависимости от длины строки?
- strcpy strcpy против memcpy
- strcpy Как правильно назначить новое строковое значение?
- strcpy Ошибка сегментации вокруг strcpy?
- strcpy C - зачем нужна strcpy ()
- strcpy ошибка сегментации с помощью strcpy
- strcpy Как скопировать или объединить два символа *