首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么这个指针在scanf()之后变成默认值10?

这个问题涉及到C语言中指针和scanf()函数的使用。

在C语言中,指针是一种特殊的变量类型,用于存储内存地址。当我们使用指针时,需要先为其分配内存空间,并将其指向某个变量的地址。

而scanf()函数是C语言中用于从标准输入(键盘)读取数据的函数。它可以根据指定的格式字符串将输入的数据存储到相应的变量中。

在这个问题中,如果一个指针在scanf()函数之后变成默认值10,可能是由于以下原因:

  1. 未正确初始化指针:在使用指针之前,需要先为其分配内存空间,并将其指向有效的地址。如果指针未经初始化或指向无效的地址,那么在scanf()函数中将无法正确存储数据,导致指针的值变为默认值。
  2. scanf()函数的输入格式错误:scanf()函数使用格式字符串来指定输入的数据类型和存储位置。如果格式字符串与实际输入的数据类型不匹配,那么scanf()函数可能无法正确解析输入,导致指针的值变为默认值。
  3. 内存越界或内存错误:如果在scanf()函数中发生内存越界或其他内存错误,可能会导致指针的值变为默认值。

针对这个问题,可以采取以下措施来解决:

  1. 确保指针在使用之前正确初始化,并指向有效的地址。
  2. 检查scanf()函数的格式字符串,确保与实际输入的数据类型匹配。
  3. 避免内存越界和其他内存错误,可以通过合理的内存管理和错误处理机制来预防和解决这些问题。

需要注意的是,以上解决方案是一般性的建议,具体情况可能因代码实现和环境而异。在实际开发中,可以根据具体情况进行调试和排查错误。

关于指针和scanf()函数的更详细信息,可以参考腾讯云的C语言开发文档:

相关搜索:为什么这个程序在第一次scanf之后会进入无限循环?为什么在填充数组值之后会变成null?为什么在if之后第一个整数值变成零为什么这个函数组件在setState之后没有重新渲染?当指针在图标上时,为什么这个按钮不能正常工作?为什么在collection.replaceOne之后,我的res.statusCode从200变成了404?为什么在修改了FirebaseUser用户的photoUrl之后,recyclerView的头像没有变成新的头像?为什么这个while循环在第一个循环之后不执行?为什么这个赋值函数方法在调用之后仍然返回一个错误?在Activity.onDestroy()方法之后,为什么我仍然可以得到这个活动的实例?我不明白为什么在.reduce javascript方法之后会收到这个输出为什么这个CSS在应用到我的DOM之后会有不同的表现?为什么Heroku应用程序在H10之后崩溃,以及如何发现问题?为什么这个指针在计算sum时传递的是一个值而不是地址?为什么这个程序打印"Hello"?(在Java中,函数指针是如何转换为Runnable.run()的)为什么这个自定义属性在序列化之后会在事件观察器中丢失?为什么这个简单的sql事务在持有X锁之后更想要一个S锁呢?为什么在2019年10月25日之后,基于会话的上传到OneDrive失败-使用Android API为什么我不能从这个链接获得XML文档,为什么在字符串中我可以把所有的标记括号变成引号?为什么我在构建之后会有这个obj\Debug\TempPE文件夹?[肯定不是复制品]
相关搜索:
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Redis为什么6.0之后变成了多线程

每天早上七点三十,准时推送干货 Java 开发当中,我们用到的关于缓存使用的比较较多的就是 Redis,而关于 Redis 的面试题,也是我们面试的过程中,会经常性的被问到,比如,Redis 为什么这么快...既然我们提到了6.0之前不引入多线程,那么 Redis6.0 之前为什么不引入消息队列呢? Redis6.0 之前为什么不引入消息队列呢?...Redis为什么会在6.0版本引入多线程呢?... Redis 中,我们知道,对于存储小数据量来说,Redis的响应十几件非常的短,甚至可以到纳秒级别,而且针对小的数据量来说,他的 QPS 可以保持 6万到8万之间,而这个 QPS 对于单线程的 Redis...关于 Redis6.0 为什么使用多线程,你了解了么?

28610

【C++】命名空间&缺省参数&函数重载&引用&内联函数

类型的变量 //但是C语言的局部优先原则,这里的两个scanf都是int类型的变量,所以出错 //小结:如果我就是想要达成我的本意的这个目的,C语言明显做不到(有命名冲突的问题),所以C++就使用...namespace命名空间域来完善C } 这是将int scanf=10;放在了局部,定义int scanf的时候还是可以的,但是使用scanf("%d",&scanf);时出现错误; 但是如果将scanf...,函数调用的时候,如果没有指定实参则采用该默认值....为什么会有extern "C"? 写项目的时候,有的时候会用到中间件程序(配合可执行程序的一些组件): 通常我们就会把它编译成静态库或动态库(比如.dll)....(组件)中的函数的时候就会表示找不到.这时extern "C"的作用就凸显出来了. 6-1-2-2.extern "C"的作用和为什么可以通过extern "C" 解决这个问题?

81330
  • 二叉树的建立与遍历

    为什么学二叉树?因为计算机二级会涉及到一部分知识。模拟考试的时候看到就直接跳过去了,心塞。终于花时间在网上找了源码好好看了一下也懂了个一二三。...二叉树计算机中储存通常采用链式储存结构,储存单元里要有左指针域,右指针域和数据。...,就把它读出来 就变成了1 2 4 8 9。...之后4节点也没了,退到2节点,右节点有数 就往下走到10节点停了,退回5节点,5右节点没数,之后退回到2节点,2节点没了,退到1节点,此时是1 2 4 8 9 5 10。...之后1节点右节点有3,之后从3走到6 此时为 1 2 4 8 9 5 10 3 6,之后6节点下无节点,退回到3,3节点有右节点7,读出7.7下面无节点,退回到3,3节点左右都读完了。

    27710

    开发成长之路(2)-- C语言从入门到开发(函数与定制输入输出控制函数)

    ---- 作用域 这个其实应该再编码规范的时候写的,但是那会儿给忘了,现在补上。 全局变量:在所有函数外部的全局变量,通常是程序的顶部。全局变量整个程序生命周期内都是有效的。...那时候还不知道写文档的重要性,现在这个函数怎么用我还得看看 这个函数有什么用呢?为什么我要特地的放在这里?...函数功能: 实现一个用于控制输入输出的函数,可控范围包括: 注入长度、接收输入类型、是否明文输出等 支持回删,回车结束,esc退出 我们后面用C语言写项目的时候会经常用到这个函数,而不是取用默认的scanf...,scanf时不时的还会暴雷!!!...所以希望各位小伙伴看完之后可以自行实现一遍,加深印象。

    45410

    Golang之旅27-Golang知识点总结1

    导入fmt包 使用fmt包中的fmt.Scanln()、fmt.Scanf() fmt.Scanln():获取一行输入 fmt.Scanf():按照指定的format格式输入 func main(){...实际中,保证程序正常运行的情况下,保小不保大,节省空间。...+ 'a' // 107 = 10 + 97 fmt.Println(c1, c2, c3, c4, c5) } 如果保存的值255之内,可以使用byte 如果超出255,使用int 字符常量用单引号括起来...} 字符串一旦赋值,就不能被修改 双引号可以识别转义字符 支持使用反引号``,使得字符串以原生的形式输出,包括换行和特殊字符 使用utf-8,解决中文乱码问题 默认值和强制转换 默认值 当数据类型没有被赋值...如果没有任何变量引用这个地址,由GC进行垃圾回收 指针pointer 切片slice 映射map 管道channel 接口interface

    35820

    指针函数和函数指针「建议收藏」

    为什么会出现上面的结果呢?...其实原因在于,一般的局部变量是存放于栈区的,当函数结束,栈区的变量就会释放掉,如果我们函数内部定义一个变量,使用一个指针去指向这个变量,当函数调用结束时,这个变量的空间就已经被释放,这时就算返回了该地址的指针...因此,使用指针函数的时候,一定要避免出现返回局部变量指针的情况。 那么为什么用了static就可以避免这个问题呢? 原因是一旦使用了static去修饰变量,那么该变量就变成了静态变量。...15); //函数指针的调用 //int ret = (*max)(10,15); //int ret = (*p)(10,15); //以上两种写法与第一种写法是等价的,...(*p)所代表的就是函数指针所指向的值,也就是函数本身,这样调用自然不会有问题。有兴趣的同学可以去试一试。 为什么要使用函数指针? 那么,有不少人就觉得,本来很简单的函数调用,搞那么复杂干什么?

    50320

    【进阶指针二】数组传参&指针传参&函数指针&函数指针数组&回调函数

    2-1 一级指针传参 void test1(int* ptr)//一级指针:存放普通变量的地址 { //... } int main() { int a = 10; int* p = &a;...解引用后就是一维数组的数组名,因为这个数组名不是那两个特殊情况,所以这个数组名又摇身一变,变成数组首元素的地址,到这里就和直接在主函数调用的时候传arr的效果是一样的) void Print1(int...) = &Add;//-函数指针,指向函数的指针 printf("%p\n", p2); return 0; } []和()的运算符优先级都比*高  关于为什么要有函数参数的一点思考:...char* arr1[5]; //整型指针数组 int* arr2[5]; //函数指针数组 //int(*pf[4])(int, int); //没有函数指针数组之前......) = Add; int(*pf2)(int, int) = Sub; int(*pf3)(int, int) = Mul; int(*pf4)(int, int) = Div; //有函数指针数组之后

    86140

    C语言缓冲区之 gets(str);fflush(stdin); rewind(stdin);setbuf(stdin, NULL);

    那么为什么需要清空键盘缓冲区呢?...例如用户输入字符’a’, 打印结果是97,10。这是为什么呢? 【分析】: scanf()和getchar()函数是从输入流缓冲区中读取值的,而并非从键盘(也就是终端)缓冲区读取。...其实这里的10恰好是回车符!这就是为什么这个程序只执行了一次输入操作就结束的原因! 【解决办法】: 清空缓冲区的残留数据。...0; 21 } 上面的实例只适用于Windows系统,Linux环境下上面两种写法都是不起作用的,所以还要换个函数。...同样,前面章节中,对字符指针变量所指向的内存单元进行初始化也可以用 gets(),下面将那个程序也改一下,将 scanf 换成 gets(): # include int main(

    2.8K31

    getchar(),putchar(),EOF的详细解释

    = EOF) { // 处理输入的字符 } ​ 这个while循环一般用来设计成无限循环,直到输出ctrl+z才结束循环(通常用于OJ测试) ​ 实际上,这个参数也可以是一个字符,因为 C 语言中...() { printf("EOF is %d\n", EOF); return 0; } 代码测试,也证明了EOF的默认值为-1 要注意,EOF 不是一个字符,而是I/O中用来表示已到达文件末尾的特殊值...循环体内,首先使用 putchar(c); 输出刚刚读取到的字符。这就是为什么会逐个输出字符的关键步骤,每次循环都会输出一个字符。...而 fgets 函数则会在缓冲区中保留部分已读取的内容,并返回一个特定的指针值。...NULL, 而 fgets函数则会在缓冲区中保留部分已读取的内容,并返回一个特定的指针值。 2.

    3810

    指针详解(const、指针运算、数组名的理解、传址调用和传值调用、一维数组的本质​)(一)

    //虽然达到了效果,但是操作有点不合理 printf("%d\n", a); return 0; } 问:被const修饰后,变量是否变成了常量?...指针减去指针的得到的是他们之间的元素个数的绝对值 指针-指针运算的前提条件的:两个指针指向同一块空间 int main() { //指针 - 指针 = 地址 - 地址 int arr[10...("%d",arr[i]); } return 0; } 代码2(通过指针解引用把值输出): scanf("%d", p + i);使用scanf函数从用户接收一个整数,并将其存储指针p加上i...2.接下来,使用索引i对指针进行偏移。C语言中,一个指针偏移n个元素就是移动指针到从起始位置开始的第n个元素。因此,通过偏移i个元素,你可以找到数组中第i个元素的位置。...; int len = my_strlen(arr);//传的是数组首元素的地址 //数组名是数组首元素的地址 printf("%zd\n", len); return 0; } 6.2为什么有传址和传值两种调用方式

    17010

    c语言scanf函数用法详解_c语言输入scanf格式

    但是这样写功能比较弱,因为这个值就变成一个“死值”了,它只能是 10,不可能是其他值,除非在程序中修改。很多时候我们希望这个值不是由程序员程序中指定的,而是程序运行的过程中由用户从键盘输入的。...程序中为什么 i=–858993460?这个为什么要初始化变量》中讲过,当变量没有初始化的时候就会输出这个值。...为什么输入 a,变量 i 却显示未初始化呢? scanf 中,从键盘输入的一切数据,不管是数字、字母,还是空格、回车、Tab 等字符,都会被当作数据存入缓冲区。...3) 使用 scanf 之前使用 printf 提示输入 大家想一想,前面写的 scanf 程序有没有不足的地方? 程序写好之后,编译、链接、执行,然后弹出黑窗口,出现一个光标在那不停地闪。...只要掌握了以上五点,scanf 的使用基本上就没什么问题了。至于其他注意点,到后面讲数组和指针的时候再介绍。 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。

    3.8K31

    C++入门

    • 这⾥我们没有包含,也可以使⽤printf和scanf包含间接包含了。vs系列 编译器是这样的,其他编译器可能会报错。...• 所谓临时对象就是编译器需要⼀个空间暂存表达式的求值结果时临时创建的⼀个未命名的对象, C++中把这个未命名对象叫做临时对象 int main() { const int a = 10; // 编译报错...• 引⽤初始化时引⽤⼀个对象后,就不能再引⽤其他对象;⽽指针可以不断地改变指向对象。 • 引⽤可以直接访问指向对象,指针需要解引⽤才是访问指向对象。...• inline对于编译器⽽⾔只是⼀个建议,也就是说,你加了inline编译器也可以选择调⽤的地⽅不展开,不同编译器关于inline什么情况展开各不相同,因为C++标准没有规定这个。...// 为什么要加外⾯的括号? // 为什么要加⾥⾯的括号?

    8910

    动态内存管理(2)

    ;同时,动态申请的内存空间没有释放,存在内存泄漏的问题(而且出了GetMemory函数之后想释放也释放不了,因为p所在的那块内存空间已经被销毁了,已经还给操作系统了)。...GetMemory这个函数就被销毁了,str变成了野指针,它指向的空间里的内容变成了随机值,所以打印出来就是随机值(这里也相当于是非法访问了) 可以这样修改: #include #include...("%d\n", *p); return 0; } 这里的p就变成了野指针,但是有可能还能打印出10,这是因为可能这块空间还没有被用掉 如果改成这样: #include int..., *p); return 0; } 这样就打印不出来10了,这里涉及到函数栈帧: 当只有第二个printf语句时,我test函数返回后迅速先通过*p来找到10,然后开辟了printf的函数栈帧来打印它...用户调用free可以释放结构体,但是用户并不知道这个结构体内的成员也需要free,所以你不能指望用户来发现这个事。

    12010

    指针详解(冒泡排序、qsort、回调函数、转移表)(三)

    回调函数就是一个通过函数指针调用的函数。 如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,被调用的函数就是回调函数。...1、先定义一个函数calc,这个函数接受一个函数指针pf作为参数。 2、calc函数内部,首先定义了三个整数变量:x、y和ret。...2、主函数中,使用scanf()函数读取用户输入的操作符。 3、使用转移表查找相应的操作函数,并将其调用。 4、将结果存储一个变量中,并将其打印出来。 为什么要用NULL?...如果第一个元素应该排在第二个元素之前,那么这个函数应该返回负数。如果两个元素相等, 那么这个函数应该返回0。如果第一个元素应该排在第二个元素之后,那么这个函数应该返回正数。...如果第一个元素应该排在第二个元素之前,那么这个函数应该返回负数。如果两个元素相等, 那么这个函数应该返回0。如果第一个元素应该排在第二个元素之后,那么这个函数应该返回正数。

    11910

    初识C语言

    而限定这个名字的可用性的代码范围就是这个名字/变量名称的作用域。 局部变量的作用域就是所在局部的范围。 全局变量的作用域就是整个工程。...\0之前abc之后可以是任意的数字,符号,汉字。而char arr2[] 中加了\0所以只输出abc不会像上面一样输出一些奇奇怪怪的值。...解释: // static修饰的局部变量时候,局部变量就变成了静态的局部变量 // 出了局部范围,不会销毁,下一次进入函数依然存在 // 其实是因为:static修饰的局部变量是存储静态区的...printf("%d", a); return 0; } 指针大小 //指针大小 int main() { int a = 10; int* pa = &a; printf("%d",sizeof...(pa)); return 0; } 结论:指针大小32位平台是4个字节,64位的平台是8个字节。

    17620

    聊聊golang的make和new函数

    今天聊make和new函数之前,咱们先来看一种现象 当然如果你对golang的指针还不是很了解,可以先看看这篇文章,以做到无缝连接 看完这个,我彻底理解了golang的指针 case1 var a...不出意外会输出10对不对,但是咱们运行之后,命令行却输出 panic: runtime error: invalid memory address or nil pointer dereference...简单说说原因 因为我们var p *int,只是把p变量定义为了指针类型,p的默认值为nil,「并没有在内存上分配对应的空间」,既然没有空间,那给p变量赋值自然就会报错,当然p任然是占空间的,只不过...p的值为nil 如果我们把代码改成下面这样 var p *int = new(int) *p = 10 fmt.Println(*p) //输出结果 //10 结果就可以正常输出,为什么加个new...,所以可以直接进行赋值操作 小结 对于int,string,float,rune,byte,bool等类型,定义变量的时候系统已经给申请了内存,而且给了对应的默认值(int的默认值为0,string的默认值

    29320

    C进阶:通讯录(动态版本 + 文件操作)附源码

    contact.c 中) 1.添加联系人 addcontact 添加联系人之前,我们先要判断通讯录是否已满,若已满则调用增容函数,之后进行联系人信息的添加; 增容函数 inccapacity...,防止使用野指针 } 六.退出通讯录 (即input==0时) 1.退出通讯录之前需要保存通讯录的数据,写一个保存函数 savecontact; 2.保存好后销毁通讯录,写一个销毁函数 destroycontact...destroycontact //销毁通讯录 void destroycontact(contact* pc) { pc->sz = 0; pc->capacity = DEFAULT_SZ; //容量回复默认值...NULL; } //销毁通讯录 void destroycontact(contact* pc) { pc->sz = 0; pc->capacity = DEFAULT_SZ; //容量回复默认值...free(pc->data); //释放之前开辟的内存 pc->data = NULL; //指针置空,防止野指针的出现 } //动态初始化联系人 void Innitcontact(contact

    11410
    领券