在我的visual studio中,这段代码
int *a, *b;
b = a;
a = (int *)malloc(SIZE * sizeof(int));
将收到运行时检查失败:在未初始化的情况下使用变量。 因此,如果指针没有分配内存,那么赋值是无意义的并且是禁止的? 在我看来,在我的开发环境中,指针是一个4字节的数字来描述地址。 所以在想象中,就是这样:
int *a, *b;
b = a;
a = (int *)malloc(SIZE * sizeof(int));
*a = 10;
printf("%d", *b);
然后* b = 10;但显然不是这样...... 所以我感到困惑的是为什么指针a和b没有指向下面的相同内存? 有人可以向我解释一下吗?
答案 0 :(得分:4)
这很糟糕:
int *a, *b;
b = a;
出于同样的原因,这是坏事:
int a, b;
b = a;
您正在阅读未初始化的变量。 a
具有不确定的价值。它实际上不必指向已分配的内存,这没关系:
int* a = 0;
int* b = a; // OK, a was initialized
答案 1 :(得分:1)
正如你在@Matt McNabb看到的一个例子 此
int*a, *b;
b = a;
并不意味着“a”指向的位置,在此分配后始终指向该位置。它只会在第一次任务时完成 即
int *a, *b;
int k = 10;
int m = 20;
a = &k;
b = a; // this will point b to k
a = &m; // this will change a to point to m however b will remains pointing to k
另外,请注意@Barry说,你首先有未初始化的指针,然后你指定b指向未初始化指针指向的地方<<这是一个非常糟糕的编程习惯,因为你永远不会知道首先指向的位置(我不确定它是否依赖于机器和编译器)。它可能会让你一团糟。
答案 2 :(得分:0)
详细说明,
malloc()分配大小字节并返回指向已分配内存的指针。 因此指针将在成功的malloc之后获得新的内存地址,因此在一个&的malloc调用地址之后。 b不同的是,取消引用会给出不同的值。
如果您看到以下程序的输出,您将得到答案。
#include<stdio.h>
#include<stdlib.h>
#define SIZE 1
main()
{
int *a, *b;
b = a;
printf("Address of a:%p\n", a);
printf("Address of b%p\n", b);
a = (int *)malloc(SIZE * sizeof(int));
printf("Address of a:%p\n", a);
printf("Address of b%p\n", b);
b = a; //assigning address of a to b
*a = 10;
printf("%d\n", *b);
}
输出:
Address of a: 0x7fff2f2813c0
Address of b: 0x7fff2f2813c0
将内存分配给指针'a'后,
Address of a: 0x1829010
Address of b: 0x7fff2f2813c0
10