我在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 ++中,它可以正常工作。
答案 0 :(得分:2)
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);
答案 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");};
当不需要指针时,应释放它们,否则会发生内存泄漏。