如何仅使用指针变量(例如int * a,* b,* add)将两个数字相加;

时间:2019-05-26 09:56:55

标签: c pointers

我在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 个答案:

答案 0 :(得分:2)

scanf("%d%d",a,b);告诉scanf从输入中读取数字并将其值写入内存中ab指向的位置。但是ab不能正确指向任何地方,因为您没有初始化它们。它们在int *a,*b,*add;中的定义或在scanf中的使用都没有为它们指向的位置设置值。

要使abadd指向实际的int对象,必须定义或分配int对象,然后分配其对象地址到abadd

例如,您可以使用:

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 ++中“有效”,则可能是因为未初始化的abadd所具有的值恰好在内存中而恰好指向可用内存。这不是可靠的行为,如果对该程序进行任何更改,它很容易中断。使用指针和其他对象之前,请务必对其进行初始化。

使用完malloc分配的内存后,通常应该释放它,您可以使用free进行释放:

free(add);
free(b);
free(a);

答案 1 :(得分:2)

首先需要为变量分配内存。当您仅调用“ 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;
}

您还应该在分配后检查指针是否为null,因为这样您的变量空间不足,您应该退出程序。您还可以malloc并在一行中检查错误,例如:if ((a = malloc(sizeof(int))) == NULL) {perror("allocate pointer a");};

当不需要指针时,应释放它们,否则会发生内存泄漏。