Почему замена char[] на char* приводит к ошибке шины?

#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

Мне интересно, почему он выдает ошибку шины.

Возможно, проблема в том, что в методе qsort() первым аргументом является массив символов или строка, а вы передаете ссылку. Попробуйте передать *temp1, т.е. снова используйте звездочку, которая снова изменит ссылку на объект

hemant kumar 25.12.2020 05:51

См. Инициализация указателя char в C. Почему считается опасным?. Защитный/безопасный программный ответ на ваш вопрос заключается в том, что вы должны были явно объявить temp1 как указатель на const, то есть const char *temp1 = "hello";, что привело бы к обнаружению нарушения const во время компиляции.

dxiv 25.12.2020 05:58
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
0
2
113
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
char *temp1 = "hello"; // pointer to a const string

temp1 указывает на строковый литерал. Вы не можете изменить его. qsort() функция пытается изменить его. Вот причина ошибки.

char temp[] = "hello"; //const pointer to a string

Здесь содержимое массива может быть изменено. Вот почему это работает.

Другие вопросы по теме