Прежде всего, это объявление не работает:
char* p[]; // how much stack memory should the compiler reserve?
p=concancate_string(name,subject); // can't assign to an array
Вместо этого сделайте это:
char **p = concancate_string(name, subject); // you can assign to pointers, though
Также эта подпись неверна:
char* concancate_string(char* name,char* subject);
Он принимает и возвращает массивы char*
, а не один char*
, поэтому должно быть:
char **concancate_string(char **name, char **subject);
Кроме того, вы не можете объединить указатель, которому вы присвоили строковый литерал.Они указывают на двоичный файл вашей программы, который доступен только для чтения.Вместо этого функция должна выглядеть следующим образом:
char **concancate_string(char **name, char **subject)
{
char **pointers = malloc(MAX * sizeof(char*));
for (int i = 0; i < MAX; i++) {
pointers[i] = malloc(strlen(name[i]) + strlen(subject[i]) + 4);
sprintf(pointers[i], "%s : %s", name[i], subject[i]);
}
return pointers;
}
Обратите внимание, как мы выделяем массив для указателей, затем выделяем память для каждой отдельной строки, затем используем sprintf
для их сборки (вы также можетеиспользуйте, конечно, strcpy
и strcat
.
Наконец, ваш отпечаток неверный.Вы делаете p
, но вместо этого вы печатаете name
.Вместо этого должно быть:
printf("name and subject[%d] = %s\n", i, p[i]);
И когда вы закончите, память должна быть освобождена:
for (int i = 0; i < MAX; i++) {
free(p[i]);
}
free(p);
Я предлагаю вам написать ваши программы одну часть времени, только начиная со следующей части, когда последняя часть протестирована и работает хорошо.Если вы просто напишите всю программу без тестирования, и тогда она не будет работать, потому что повсюду есть ошибки, их будет намного сложнее найти.