C语言学习笔记:scanf与指针的问题


int main(int argc, char* argv[])
{
    int* p2;
    p2 = (int*)malloc(sizeof(int));
    scanf("%d", p2);//5
    printf("%d\n", *p2);//5
    int* p3;
    int i = 5;
    p3 = &i;
    printf("i=%d,p3=%d\n", i, *p3);
    printf("i的地址=%p   p3的地址=%p", i, p3);
} 

**问题1:为什么不分配动态内存就不能用scanf给p2赋值,明明p2就是个指针变量,用scanf给他一个值的地址这样的理解是不是出错了?还是我对scanf的理解有问题,如果可以还请麻烦你详细解释一下
问题2: p3=&i,的意思是是将i的变量地址给p3吗?如果是,为什么两个地址输出的不一样,如果不是,请问这段p3=&i是什么意思?
**

问题1:p2是个指针变量,是用来存放地址值的一个变量,只有4个字节的空间。
用scanf()输入的时候,如果没用malloc()分配一个空间地址给它,它里面就
是一个随机值,对这个随机值的操作就是非法的。
p2 = (int*)malloc(sizeof(int));这句与:p3 = &i; 一个意思,就是将
一个变量的地址值存入 p2 或 p3 里,也就是让指针 p2 p3 指向两个变量。
问题2:把 printf("i的地址=%p p3的地址=%p", i, p3);修改为:
printf("i的地址=%p p3里的值=%p p3自身的地址=%p", &i, p3, &p3);看看。

  • 正常输入int类型是定义一个int a,然后scanf("%d", &a);
    但是指针变量你在创建的时候只是开辟了一个空间来存放指针变量,这个指针变量并没有指向的内容,它是一个野指针。如果不进行动态内存分配后再scanf输入的话,会对内存造成非法访问
  • p3=&i是把i的地址赋值给指针变量p3,至于为什么打印结果不一样,你打印%p的时候应该打印&i而不是i

如果对你有帮助,还请点个采纳,万分感谢!