Второе точно такое же утверждение
str1 = (char*) malloc(sizeof(char*));
является излишним, неуместным и бесполезным. Тем самым вы выделяете другое пространство памяти, на которое указывает str1
; оставляя предыдущее выделенное пространство из-за отсутствия free()
заброшенного, но существующего в памяти.
char *str1;
str1 = (char*) malloc(sizeof(char*));
При этом вызове malloc()
вы выделяете память размера указателя на char
обычно 4 байта в большинстве современных систем, а не место, необходимое для хранения строки типа "Computer Engineer"
. С этим определением можно хранить только строку 3
символов плюс автоматически добавляемый завершающий строку нулевой символ (4 символа на 4 байта).
Путем ввода строки длиной более 3 символов при вызове scanf()
:
scanf(" %s", str1);
программа запишет за пределы выделенной памяти, что вызывает undefined Поведение (как это было с высокой вероятностью, вероятно, произошло в вашем случае).
Вам нужно выделить достаточно места для хранения предоставленных строк - в случае fe "Computer Engineer"
это должно иметь не менее 18 байт (обратите внимание, что sizeof(char) == 1
):
char *str1 = malloc((sizeof(char) * 18);
или альтернативно:
char *str1 = malloc((sizeof(*str1) * 18);
Обратите внимание, что вы не можете вставить слово, разделенное пробелами, используя %s
спецификатор формата. Для этого используйте %[
вместо:
scanf("%[^\n]", str1);
Или еще лучше используйте более надежный и безопасный fgets()
:
fgets(str1,18,stdin);
Если вы хотите выделить память в зависимости от ввода пользователя, вам нужно добавить еще один запрос ввода и переменную перед распределением:
int len;
printf("How many characters the string should have?");
scanf("%d",&len);
char *str1 = malloc((sizeof(*str1) * (len + 1)); // +1 element for null character.
printf("Enter a sentence:(Ex: Computer Engineer)");
fgets(str1,len,stdin);
Примечание:
Вам не нужно приводить возвращенный указатель из malloc
-> Я разыграю результат Малло c?