Если у вас есть массив, объявленный как
char* names[9];
, то допустимый диапазон индексов для этого массива составляет [0, 9)
.
Так что эти операторы
names[9] = (char *) malloc(4 * sizeof(char*));
strcpy(names[9],"gib");
получить доступ к несуществующему элементу массива с неверным индексом 9
.
Этот l oop
for (i = 0; i < 10; i++) {
free(names[i]);
}
также неверен по той же причине.
Не используйте маги c числа, такие как 9 0r 10. Используйте именованные константы как например
enum { N = 9 };
char* names[N];
//...
for (i = 0; i < N; i++) {
free(names[i]);
}
И нет смысла объявлять массив names
как глобальную переменную. Вы можете объявить это в main.
Хотя выделенная память
names[0] = (char *) malloc(4 * sizeof(char*));
может вместить строку из четырех символов
strcpy(names[0],"foo");
, тем не менее, такое распределение только смущает читателей код. Вместо этого напишите в этом другом аналогичном выражении
names[0] = (char *) malloc(4 * sizeof(char));
^^^^^
или просто
names[0] = (char *) malloc( 4 );
Th функцию diddle
второй параметр имеет тип char *
void diddle(char *names[], char *name) {
но в вызове функции
diddle(&names[0],&name);
используется выражение &name
типа char **
.
В результате этого оператора
strcpy(name,names[j]);
вызывает неопределенное поведение. Даже если переданное выражение имеет правильный тип
diddle(&names[0],&name);
, тем не менее функция снова имеет неопределенное поведение, поскольку переданный указатель является нулевым указателем. Поэтому вы не можете использовать strcpy
с нулевым указателем.
Вместо нулевого указателя
char *name = NULL;
вы можете использовать массив символов, например
char name[4];