cities[i]=(char*)calloc(3,sizeof(char));
название города может содержать не более 2 символов, заканчивающихся нулевым символом, после того как поведение не определено, возможно, вам нужно более длинное имя
но в
scanf("%s",cities[i]);
возможно, вы вводите более 2 символов ...
Вы вызываете sort , не указывая, сколько было введено цитирований, поэтому sort работает в 3 городах, даже если введено только 2, и доступ к третьей строке до ее инициализации, с неопределенное поведение, когда strcmp обращается к нему
В
temp = (char*)calloc(30, sizeof(char));
вы создаете утечку памяти, потому что не освобождаетесь temp ,
нет причин выделять в куче для обмена: поменяйте указатели, а не содержимое
Вы также не освобождаете названия городов в конце основного
Предложение из вашего кода, управляющее любым количеством городов, ввод заканчивается на EOF (control-d), название города ограничено 30 символами (см. Защиту в scanf )
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void sort(char** cities, int n)
{
int i, j;
// Perform sort operation using bubble sort
for (i = 0; i < n - 1; i++) {
for (j = 0; j < n - i - 1; j++) {
if (strcmp(cities[j], cities[j + 1]) > 0) {
char* temp = cities[j];
cities[j] = cities[j + 1];
cities[j + 1] = temp;
}
}
}
}
int main() {
char ** cities = malloc(0);
char name[31];
int n = 0, i;
while (printf("Give City %d:\n", n), (scanf("%30s", name) == 1))
{
cities = realloc(cities, (++n) * sizeof(char *));
cities[n - 1] = strdup(name);
if (n == 1)
printf("%s\n",cities[0]); //1st case of nothing to compare
else {
sort(cities, n);
printf("\nArray after sorting %d time:\n", n);
for (i = 0; i < n; i++)
printf("%s\n", cities[i]); //print current array of cites sorted
}
}
for (i = 0; i < n; i++)
free(cities[i]);
free(cities);
return (EXIT_SUCCESS);
}
Компиляция и исполнение:
pi@raspberrypi:/tmp $ gcc -pedantic -Wextra -Wall c.c
pi@raspberrypi:/tmp $ ./a.out
Give City 0:
qsd
qsd
Give City 1:
aze
Array after sorting 2 time:
aze
qsd
Give City 2:
wxc
Array after sorting 3 time:
aze
qsd
wxc
Give City 3:
<control-d>
Исполнение под valgrind :
pi@raspberrypi:/tmp $ valgrind ./a.out
==23191== Memcheck, a memory error detector
==23191== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==23191== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info
==23191== Command: ./a.out
==23191==
Give City 0:
qsdqsdqsd
qsdqsdqsd
Give City 1:
aze
Array after sorting 2 time:
aze
qsdqsdqsd
Give City 2:
wxcwxcwxcwxcwxc
Array after sorting 3 time:
aze
qsdqsdqsd
wxcwxcwxcwxcwxc
Give City 3:
<control-d>
==23191==
==23191== HEAP SUMMARY:
==23191== in use at exit: 0 bytes in 0 blocks
==23191== total heap usage: 9 allocs, 9 frees, 2,102 bytes allocated
==23191==
==23191== All heap blocks were freed -- no leaks are possible
==23191==
==23191== For counts of detected and suppressed errors, rerun with: -v
==23191== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 6 from 3)