C程序的赋值问题,为什么b输出不了

#include <stdio.h>
#include <stdlib.h>

void setint(int*, int); 
int main() 
{ 
   int a; 
   setint(&a, 10); 
   printf("a: %d\n", a);

   int* b=NULL;
   setint(b, 10);
   printf("b: %d\n", *b);

   return 0; 
} 

void setint(int* ip, int i)
{
   *ip = i; 
}

为什么b输出不了的?明明看上去int* b对应 int* ip,10对应于int i,感觉没什么毛病啊。大佬们问题在哪,怎么修改b才能输出。。。
为什么a没有初始化就能赋值成功输出,a都不是指针类型啊
新手脑壳疼中。

先让我来一个一个回答你的疑问
为什么b输出不了的?
上面两位仁兄说的也很清楚,
int* b=NULL;
b是一个空指针(这里你顺便可以查一下空指针与野指针的区别),空指针指向一个空地址,一个存在的地址,但是其实是没有实际物理地址映射的
所有用他直接去存内容,程序会崩溃。
明明看上去int* b对应 int* ip,10对应于int i,感觉没什么毛病啊。
这里确实没什么毛病,用指针保存地址去改变其地址指向的内容,这是常用的方法之一(如果学c++,推荐顺便看看引用)
在哪,怎么修改b才能输出。。。
其实解决很简单,让b指向一段可以读写的地址空间,回答你的疑问,在看看我的代码。
为什么a没有初始化就能赋值成功输出,a都不是指针类型啊
a为什么没有初始化就可以成功?尽管a没有初始化,但是a作为一个局部变量,在计算机中是存在.stack,也就是栈空间的,栈空间是可读可写的,而且合法
主要用来保存局部变量的,所有在栈空间的变量也是合法的。
具体的数据存储,你可以查查,例如,.data .text .bss .stack 。.rodata 还有堆空间,例如为什么字符串常量不能修改呢?“123”一个指针后不能修改
也是同样的道理,因为字符常量,及一些你用的常量1,2之类的,也是数据,也需要存储,就存在.rodata区,而。rodata区是只可以读不可以写的,所有
不能修改。至于为什么这样安排,建议你查查冯.诺依曼架构和哈佛架构
如有错误,或者不解,欢迎一起讨论,修改代码在下面

#include <stdio.h>
#include <stdlib.h>

void setint(int*, int); 
int main() 
{ 
   int a; 
   setint(&a, 10); 
   printf("a: %d\n", a);

   int* b=&a;//简单省空间,而且不需要额外开销
   setint(b, 10);
   printf("b: %d\n", *b);

   return 0; 
} 

void setint(int* ip, int i)
{
   *ip = i; 
}

你b是空指针,未分配内存

#include <stdio.h>
#include <stdlib.h>

void setint(int*, int); 
int main() 
{ 
   int a; 
   setint(&a, 10); 
   printf("a: %d\n", a);

   int* b=NULL;
     //添加东西
   b = (int*)malloc(sizeof(int)); 
   setint(b, 10);
   printf("b: %d\n", *b);

   return 0; 
} 

void setint(int* ip, int i)
{   
   *ip = i;
}

int a=NULL;
*&a=8; //等价a=8;
printf("a: %d\n", a);

int *b=NULL;
b=10;
printf("b: %d\n", b);
printf("b: %p\n", &b);
printf("b: %d\n", *&b);

// *b 是指针指向一个内存地址 &b 不能对地址赋值 int 类型
//a 是int变量  a的地址就是&a  *&a是可以赋值的 

void setint(int* ip, int i)
{

ip = i; //ip是个指针 你写在这里的 ip=&ip 是个值
}