#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int comp(const void *a, const void *b) {
const char *ia = (const char*)a;
const char *ib = (const char*)b;
return (*ia - *ib);
}
int main(int argc, char *argv[]){
char *temp1 = "hello";
char temp[] = "hello";
qsort(temp, strlen(temp), sizeof(char), comp);
printf ("%s\n", temp);
/*
qsort(temp1, strlen(temp1), sizeof(char), comp);
printf ("%s\n", temp1);
*/
}
В этом вызове qsort для сортировки строки показанный здесь код работает так, как показано (я имею в виду, что он сортирует строку «hello»). Но когда я раскомментирую закомментированные последние 2 строки (тем самым сортируя temp1), он падает на Mac Pro с ошибкой шины. Информация о версии на cc показывает:
Apple LLVM версии 10.0.0 (clang-1000.10.44.4) Цель: x86_64-apple-darwin17.7.0 Модель потока: posix
Мне интересно, почему он выдает ошибку шины.
См. Инициализация указателя char в C. Почему считается опасным?. Защитный/безопасный программный ответ на ваш вопрос заключается в том, что вы должны были явно объявить temp1 как указатель на const, то есть const char *temp1 = "hello";, что привело бы к обнаружению нарушения const во время компиляции.



char *temp1 = "hello"; // pointer to a const string
temp1 указывает на строковый литерал. Вы не можете изменить его. qsort() функция пытается изменить его. Вот причина ошибки.
char temp[] = "hello"; //const pointer to a string
Здесь содержимое массива может быть изменено. Вот почему это работает.
Возможно, проблема в том, что в методе qsort() первым аргументом является массив символов или строка, а вы передаете ссылку. Попробуйте передать *temp1, т.е. снова используйте звездочку, которая снова изменит ссылку на объект