首页
学习
活动
专区
工具
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 为什么使用多线程,你了解了么?

32610

【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" 解决这个问题?

81730
  • 深入理解并打败C语言难关之一————指针(2)

    20; return 0; }   这个时候p就是一个野指针,这是常出现的原因,所以我们创建指针变量的时候记着进行初始化,不然会变成指针的 1.2.2指针进行了越界访问 这个指针的出现多伴随着数组的进行的...("%d",*(p + i)); } return 0; }   在上面这几行代码中,可以很清晰的看出指针进行了越界访问,它越界到了arr[10]这个元素,这个时候指针已经变成了野指针,...,所以此时的他已经变成了野指针这个时候除非把它设置成为空指针,不然会有着很大的风险。  ...,避免被引用   这个之前,先来说明一下NULL是个什么东西,NULL代表的是空的意思,意思为什么都没有,所以我们指针不在使用的时候,可以把它设置成空指针,意在说明这个指针并没有指向任何地址,指的是空地址...3.2传址调用   讲传址调用之前,先来解释一下传值调用为什么不能实现两个函数之间的调换,因为我们知道,调用函数的时候函数里面的参数是实际参数,之后定义函数的时候,函数里面的参数是形式参数,所以形式参数是实际参数的一份临时拷贝

    8310

    初识C语言·函数

    细心的人会发现scanf那里有警告,那么这个警告是因为scanf的返回值没有int类型的变量接受,给它一个int类型的接收就行了。 3 形参,实参,比较好理解,形式参数和实际参数。...那么 为什么a,b,c是形式参数呢?因为如果你不调用这个函数的话,这几个数实际是不存在的,没有向内存申请空间。不信?看看 你看,还没执行到这一步的时候,a,b,c是没有申请空间的。...执行了之后,a,b,c,有了自己的空间,只不过是还没有接收到实参的值而已。 这是已经实现的这个函数,又重新进入到主函数里面了,但是可以发现a,b,c的值变灰了。...因为传的是地址,地址是指针64位环境下,指针的值是8,8 / 2 肯定就是4咯,那个警告其实就是说咱们用另一个值除指针的大小值。 那么我们该怎么自定义函数里面求得数组的大小呢?...既然传的是地址,就免不了使用指针,所以这里不进行介绍,最好的办法就是主函数里面求完了,传过去。 如图 看,好了。谨记数组传参传的是首元素地址。

    6710

    二叉树的建立与遍历

    为什么学二叉树?因为计算机二级会涉及到一部分知识。模拟考试的时候看到就直接跳过去了,心塞。终于花时间在网上找了源码好好看了一下也懂了个一二三。...二叉树计算机中储存通常采用链式储存结构,储存单元里要有左指针域,右指针域和数据。...,就把它读出来 就变成了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节点左右都读完了。

    28210

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

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

    45710

    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

    36320

    C语言:指针2(超详细讲解)

    一维数组中我们需要通过数组首元素地址来访问全部元素 这⾥我们使⽤ &arr[0] 的⽅式拿到了数组第⼀个元素的地址,但是其实数组名本来就是地址,⽽且 是数组⾸元素的地址,我们来做个测试 下面这个代码我们可以看到地址是一样的说明...sz计算数组有多少个元素 但是为什么一维数组传参给函数会变成1呢 因为传给函数的是数组首元素地址这个地址是int类型int是4个字节 4 / 4 = 1 void add(int arr[]) { int...//打印 day(arr, sz); } 这代码我们可以看到输入10个数值然后进行排序然后打印 输入10个数值 下面我们可以看到这个为什么是sz-1呢 因为我们排序到第9个数值就已经排序好了 最后的一个数值没必要排序...1 2 3 4 5 6 7 8 9 10 这第二个for循环 sz-1和上面一样 - i 是当我们排序完这个数值就不用排序了 这个是j是第1数值,j+1是第二个数值 这2个数值进行比较第一个数组大于第二个数值的话这...2个数值进行交换 最后就是打印了 指针数组 指针就是存放指针的数组 当我们需要创建很多个指针,总不能一个一个创建吧 我们就需要创建个指针数组把这些指针放进去就行了 下面这个就是把a,b,c的指针放到指针数组里

    8810

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

    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; //有函数指针数组之后

    87440

    C语言:指针3(超级详细讲解)

    字符指针变量 指针的类型中我们知道有⼀种指针类型为字符指针char* p指向了a的地址解引⽤拿到了w然后打印 来自剑指offer笔试题 我们可以看到str1和str2的内容一样但是空间不一样,所以走else...int(*p)[10] 如果不加()的话p会和[10]结合就不是指针了,所以要加()。...二维数组中也可以理解为多个一维数组 那么形参也是可以写成指针形式的 函数指针 函数指针是用来存放函数地址的,未来可以通过地址调用函数 那么函数是否有地址呢 我们做个测试: 我们可以看到函数是有地址的...函数指针创建 函数指针变量的写法其实和数组指针⾮常类似 可以写成&arr也可以不写都是等价的 这2个打印方式都是可以的p( 5 , 6) 编译器会变成(*p)(5 , 6) 两段有趣的代码 ( *...int(*)(int ,int)函数指针重命名为ahh我们可以这样写 函数指针数组 我们要将int(* [10])(int ,int)重命名为att我们可以这样写 把函数的地址存放到数组里,那这个数组就叫函数指针数组

    9510

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

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

    50920

    【C语言】带你手把手拿捏指针(3)(含转移表)

    那数组指针变量应该是:存放的应该是数组的地址,能够指向数组的指针变量 我们来看下面两个,哪个是数组指针变量: 1.int *p1[10]; 2.int (*p2)[10]; 思考一下p1、p2分别是什么...因为[]操作符的优先级是比 * 号高的,也就导致了p1和[10]结合, * 和int结合, 变成了一个类型为int*,数组名为p1,元素个数为10指针数组,如图: 所以这里p1并不是一个数组指针...就是我们之前学习的 &数组名,如下: int arr[10] = {0}; int (*p)[10] = &arr;//得到的就是数组的地址 数组指针类型解析: int (*p) [10] = &arr...⾸先我们再次理解⼀下⼆维数组,⼆维数组其实可以看做是每个元素是⼀维数组的数组,我们传参时会传这个二维数组的数组名,我们也都知道一个数组的数组名是首元素的地址,那么二维数组的首元素地址是什么呢?    ...1.函数指针数组    数组是⼀个存放相同类型数据的存储空间,我们已经学习了指针数组,比如: int * arr[10]; //数组的每个元素是int*    那要把函数的地址存到⼀个数组中,那这个数组就叫函数指针数组

    8410

    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.

    4910

    指针详解(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为什么有传址和传值两种调用方式

    18510

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

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

    4K31

    动态内存管理(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,所以你不能指望用户来发现这个事。

    12410
    领券