Как добавить два числа, используя только переменные указателя, такие как int * a, * b, * add; - PullRequest
0 голосов
/ 26 мая 2019

У меня проблема с указателями в 32-битной архитектуре. Я хочу добавить два числа, используя только переменные-указатели для ex: int * a, * b, * add;но в 32-битном компиляторе, таком как кодовые блоки, не дают выхода.

Но в случае 16-битного компилятора, такого как Turbo C ++, он работает правильно.

Это код, который я пробовал

int *a,*b,*add;
printf("Enter two no.");
scanf("%d%d",a,b);
*add=*a+*b;

в кодеблокировать ничего не возвращает.но в Turbo C ++ он работает правильно.

Ответы [ 2 ]

2 голосов
/ 26 мая 2019

Сначала вам нужно выделить память для переменных. Когда вы вызываете только «int * a», память не резервируется. Так что вам нужно вызвать malloc или calloc.

#include <stdio.h>
#include <stdlib.h>

int main(void) {
  int *a, *b, *add;

  // allocate memory
  a = malloc(sizeof(int));
  b = malloc(sizeof(int));
  add = malloc(sizeof(int));

  // check if there was an error allocating the memory
  if (a == NULL) {perror("allocate pointer a");};
  if (b == NULL) {perror("allocate pointer b");};
  if (add == NULL) {perror("allocate pointer add");};

  // read numbers
  printf("Enter two numbers ");
  scanf("%d%d", a, b);

  printf("a: %d; b:  %d\n", *a, *b);

  // calculate the result and print it
  *add = *a + *b;
  printf("sum: %d\n", *add);

  // free the pointer
  free(a);
  free(b);
  free(add);

  return 0;
}

Вы должны также проверить, равен ли ваш указатель нулю после выделения, потому что тогда у вас недостаточно места для переменной, и вы должны выйти из программы. Вы также можете malloc и проверить на наличие ошибок в одной строке, это будет выглядеть, например, как: if ((a = malloc(sizeof(int))) == NULL) {perror("allocate pointer a");};

Если вам не нужен указатель, вы должны освободить его, иначе вы получите утечки памяти.

2 голосов
/ 26 мая 2019

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...