指针没有分配内存分配

时间:2015-07-09 03:08:03

标签: c pointers

在我的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没有指向下面的相同内存? 有人可以向我解释一下吗?

3 个答案:

答案 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