scanf("%d%d",a,b);
говорит scanf
прочитать цифры из ввода и записать их значения в те места в памяти, куда указывают a
и b
. Но a
и b
нигде не указывают должным образом, потому что вы их не инициализировали. Ни их определение в int *a,*b,*add;
, ни их использование в scanf
не устанавливают значения, на которое они указывают.
Чтобы a
, b
или add
указывали на фактический объект int
, вы должны определить или выделить объект int
, а затем назначить его адрес a
, b
, или add
.
Например, вы можете использовать:
int x, y, z;
int *a = x, *b = y, *add = z;
Или:
int *a, *b, *add;
a = malloc(sizeof *a);
b = malloc(sizeof *b);
add = malloc(sizeof *add);
if (!a || !b || !c)
{
fprintf(stderr, "Error, memory allocation failed.\n");
exit(EXIT_FAILURE); // Include <stdlib.h> for this.
}
Если ваш код «работает» в Turbo C ++, это может быть связано с тем, что неинициализированные a
, b
и add
принимают значения, которые оказываются в памяти и указывают на используемую память. Это ненадежное поведение, и оно может легко сломаться, если в программу будут внесены какие-либо изменения. Всегда инициализируйте указатели и другие объекты перед их использованием.
Когда вы закончили использовать память, выделенную с помощью malloc
, вы обычно должны освободить ее, что вы можете сделать с помощью free
:
free(add);
free(b);
free(a);