qq_43390459 2019-11-07 16:38 采纳率: 50%
浏览 240
已采纳

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都不是指针类型啊
新手脑壳疼中。

  • 写回答

3条回答 默认 最新

  • @矛盾综合体 2019-11-07 21:24
    关注

    先让我来一个一个回答你的疑问
    为什么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; 
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 MCNP里如何定义多个源?
  • ¥20 双层网络上信息-疾病传播
  • ¥50 paddlepaddle pinn
  • ¥20 idea运行测试代码报错问题
  • ¥15 网络监控:网络故障告警通知
  • ¥15 django项目运行报编码错误
  • ¥15 请问这个是什么意思?
  • ¥15 STM32驱动继电器
  • ¥15 Windows server update services
  • ¥15 关于#c语言#的问题:我现在在做一个墨水屏设计,2.9英寸的小屏怎么换4.2英寸大屏