Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 自学指针，做图，看我的理解是否正确。

回复:
user: user-1
content: 正确。 其它程序的地址不会和自己一起编址，可以看看分段和分页。不过和这指针不是一回事，理解没问题

user: user-2
content: 地址通常不会是那样，其他应该没问题

user: user-3
content: 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！ 不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！）  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）  想要从本质上理解C指针，必须学习汇编以及C和汇编的对应关系。 从汇编的角度理解和学习C语言的指针，原本看似复杂的东西就会变得非常简单！ 指针即地址。“地址又是啥？”“只能从汇编语言和计算机组成原理的角度去解释了。” 但我又不得不承认：  有那么些人喜欢或者适合用“先具体再抽象”的方法学习和理解复杂事物；  而另一些人喜欢或者适合用“先抽象再具体”的方法学习和理解复杂事物。 而我本人属前者。  不要企图依赖输出指针相关表达式...的值【比如printf("%p\n",...);或者cout<<...】来理解指针的本质， 而要依赖调试时的反汇编窗口中的C/C++代码【比如void *p=(void *)(...);】及其对应汇编指令以及内存窗口中的内存地址和内存值来理解指针的本质。  这辈子不看内存地址和内存值；只画链表、指针示意图，画堆栈示意图，画各种示意图，甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗？本人深表怀疑！ 这辈子不种麦不收麦不将麦粒拿去磨面；只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头，压面条，烤面包，……能从本质上理解面粉、理解面食吗？本人深表怀疑！！  提醒： “学习用汇编语言写程序” 和 “VC调试(TC或BC用TD调试)时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 （Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。） 想要从本质上理解C指针，必须学习C和汇编的对应关系。” 不是一回事！  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！  电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  十字链表交换任意两个节点C源代码（C指针应用终极挑战）http://download.csdn.net/detail/zhao4zhong1/5532495

user: user-0
content: 引用 2 楼 user-5 的回复:告诉楼主一个小知识，字符指针可以引用字符串， char *p ="dhhshwj", p是字符串的首地址！  谢谢。如此就只能通过指针p找到这段字符串。可心里难受，觉得任何一段数据都应当既有普通变量又有指针变量。

user: user-4
content: 正确的。  不是实际程序中地址不会从0x0000开始，数据是放在程序的数据区里面的。

user: user-5
content: 告诉楼主一个小知识，字符指针可以引用字符串， char *p ="dhhshwj", p是字符串的首地址！
user-0 提问: 运行结果不对

回复:
user: user-1
content: 因为你用的是while(100-x-y>0) 第一次循环的时候就满足，然后在while循环里既没有修改x,y的值，也没有break所以陷入了死循环 你这个应该用if就行了吧？  #include<iostream> using namespace std; int main(){ 	int x, y; 	for (x = 0; x < 100; x++){ 		for (y = 0; y<50; y++){ 			if (100 - x - y>0){ 				if (0.5*x + 2 * y + 3 * (100 - x - y) == 100){ 					cout << x << " " << y << " " << 100 - x - y << endl; 				} 			} 		}  	} 	return 0; }
user-0 提问: 请教一个scanf语句的问题？

回复:
user: user-1
content: 就是判断是否输入了两个数据，scanf返回输入数据的个数

user: user-2
content: 就是判断是否成功读入两个数据

user: user-3
content: scanf返回的是正确输入参数的个数，这里判断是否为2，因为你是接收两个参数  http://en.cppreference.com/w/c/io/fscanf  Return value 1-3) Number of receiving arguments successfully assigned, or EOF if read failure occurs before the first receiving argument was assigned. 4-6) Same as (1-3), except that EOF is also returned if there is a runtime constraint violation.

user: user-4
content: 查MSDN是Windows程序员必须掌握的技能之一。

user: user-5
content: 1. scanf 函数是有返回值的，它的返回值可以分成三种情况   1) 正整数，表示正确输入参数的个数。例如执行 scanf("%d %d", &a, &b);        如果用户输入"3 4"，可以正确输入，返回2（正确输入了两个变量）；       如果用户输入"3,4"，可以正确输入a，无法输入b，返回1（正确输入了一个变量）。       2) 0，表示用户的输入不匹配，无法正确输入任何值。如上例，用户如果输入",3 4"，返回0。   3) EOF，这是在stdio.h里面定义的常量（通常值为-1），表示输入流已经结束。在Windows下，用户按下CTRL+Z（会看到一个^Z字符）再按下回车（可能需要重复2次），就表示输入结束；Linux/Unix下使用CTRL+D表示输入结束。

user: user-6
content: int imin(int n,int m); int main() {  int evil1,       evil2;  printf("Enter a pair of integers(q to quit):\n)");  while(scanf("%d%d",&evil1,&evil2)==2)  {   printf("The lesser of %d and %d is %d.\n",evil1,evil2,imin(evil1,evil2));   printf("Enter a pair of integers(q to quit):\n)");  }  printf("Bye.\n");    return 0;     // 提问区域可用时间    alog && alog('speed.set', 'c_ask', +new Date); alog.fire && alog.fire("mark");        F.context('answers')['1190817758'] = {uid:"734719339",imId:"6bed6c6f7665536c696d6c6565ca2b",isBest:"1",id:"1190817758",userName:"loveSlimlee",userNameEnc:"loveSlimlee",user:{sex:"1",iconType:"6",gradeIndex:"2",grAnswerNum:"3",carefield: [{cid:"866",cname:"C/C++"}],isAuth:"0",authTitle:"",isUserAdmin:"0",userAdminLevel:"",userAdminTitle:"",userAdminType:"",isFamous:"0",isMaster:"0",goodRate:"60",applyExcType:"0"},isAnonymous:"0",isCurrentUser:"0",mapUrl:"",refer:"",replyAskNum:"",threadId:"4763271033",hasComment:"0",qid:"476406884",raid:"",recommendCanceled:"0"};                	F.context('relateWords')['best-content-'+'1190817758'] = ["\u51fd\u6570\u539f\u578b","\u503c\u7c7b\u578b"];              2012-09-13 11:23 提问者采纳    scanf这个函数式有返回值的，函数原型为int scanf( const char *format, ... );可见其返回值类型为int类型的，返回值得含义是你成功读入数据的个数。具体到你的问题中就是，当你成功输入两个数字的时候，循环继续，当你输入的数字小于两个的时候就会跳出循环。多谢采纳。

user: user-7
content: scanf返回正确输入的参数个数，scanf("%d%d", &a, &b)在正常输入时返回2；若只输入一个整数，尝试输入第二个整数时遇到EOF（例如文件结尾），则返回1。程序输入失败返回EOF。建议使用while(EOF != scanf("%d%d", &a, &b))判断是否输入成功。

user: user-8
content: int n,m,a,b; a=scanf（“%d %d”，&n，&m）；//你只输入n的值，不给m值 b=scanf（“%d %d”，&n，&m）；//给m，n都赋值 printf（“%d %d”，a,b）； 看看结果就好了。

user: user-4
content: 在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 int c; scanf("%c",&c); //时，都改为 char s[2]; int c; scanf("%1s",s); c=s[0];

user: user-9
content: scanf: Return value     Number of receiving arguments successfully assigned, or EOF if read failure occurs before the first receiving argument was assigned.
user-0 提问: 为什么这个自动代码格式化出来的效果怪怪的呢？

回复:
user: user-1
content: 可能他这功能实现的问题，你自己按退格吧...

user: user-2
content: astyle自动整理c,c++,java源代码格式命令行工具源代码。 用astyle --help查看使用帮助。 http://download.csdn.net/detail/zhao4zhong1/5605415
user-0 提问: 为什么一直提示函数声明有问题啊，刚学

回复:
user: user-1
content: int rec=(n2+add(n1+n2));// add函数声明的是两个参数，这里却只传入了n1+n2这一个参数。  改成int rec=(n2+add(n1,n2));

user: user-2
content: 建议你详细看一下函数的参数，和返回值！

user: user-2
content: 你在函数里面，递归调用的时候add只有一个参数 n1+n2是一个参数，还有你打印res，但是你之前定义了它，并没有初始化，这样程序会崩溃，
user-0 提问: 程序的一个BUG

回复:
user: user-1
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-2
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。
user-0 提问: 关于opengl  2d纹理贴图 背景透明的问题

回复:
user: user-0
content: 引用 4 楼 glunoy 的回复:楼主这个问题，启用alphaBlend就能解决。我懒得去整固定管线的开开关关。  你在frag里面 gl_FragColor =clr_tex1; 顶点不赋任何颜色即可。  如果用固定管线的做法，大概是： glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 感谢回答 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); 把这句去掉就好了或者换成 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GLREPLACE);

user: user-0
content: 引用 3 楼 lishunihaoa 的回复:简单载入PNG的话，用opencv好 嗯嗯，多谢

user: user-0
content: 引用 1 楼 lovesmiles 的回复:我没看懂你想问什么， 不过我猜颜色混合可能适合你  glBlendFunc()  你查一下这个函数 的用法，祝好运 感谢回答 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); 把这句去掉就好了或者换成 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GLREPLACE);

user: user-1
content: 楼主这个问题，启用alphaBlend就能解决。我懒得去整固定管线的开开关关。  你在frag里面 gl_FragColor =clr_tex1; 顶点不赋任何颜色即可。  如果用固定管线的做法，大概是： glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

user: user-2
content: 简单载入PNG的话，用opencv好

user: user-3

user: user-4
content: 我没看懂你想问什么， 不过我猜颜色混合可能适合你  glBlendFunc()  你查一下这个函数 的用法，祝好运
user-0 提问: exit(1)可代替close(fd)和return 0吗?

回复:
user: user-0
content: 引用 17 楼 hijack00 的回复:exit(1)是以一种简单粗暴的方式直接退出程序执行，会打乱程序的正常执行流程。而close(fd)和return 0则显得较温和。假如exit语句在子函数中，exit将直接中断程序运行，主程序中的其他语句不会被执行；而return则会返回主程序，之后的语句会继续执行。建议尽量使用return，exit一般用在程序发生严重错误的情况下。参考我这篇博客[利用python cmd模块开发小型命令行应用程序](http://blog.csdn.net/hijack00/article/details/52224372) 谢谢 谢谢

user: user-1
content: 不要用exit代替return函数。  一个是退出进程的，一个是退出函数的。

user: user-2
content: 不一样吧

user: user-3
content: exit(1)是以一种简单粗暴的方式直接退出程序执行，会打乱程序的正常执行流程。而close(fd)和return 0则显得较温和。假如exit语句在子函数中，exit将直接中断程序运行，主程序中的其他语句不会被执行；而return则会返回主程序，之后的语句会继续执行。建议尽量使用return，exit一般用在程序发生严重错误的情况下。参考我这篇博客[利用python cmd模块开发小型命令行应用程序](http://blog.csdn.net/hijack00/article/details/52224372)

user: user-4
content: 1. exit用于结束正在运行的整个程序，它将参数返回给OS，把控制权交给操作系统；而return 是退出当前函数，返回函数值，把控制权交给调用函数。 2. exit是系统调用级别，它表示一个进程的结束；而return 是语言级别的，它表示调用堆栈的返回。 3. 在main函数结束时，会隐式地调用exit函数，所以一般程序执行到main()结尾时，则结束主进程。exit将删除进程使用的内存空间，同时把错误信息返回给父进程。

user: user-5
content: 不能

user: user-6
content: 引用 11 楼 paschen 的回复:exit 是一个函数， 后者是一个语句  exit 可在任何时候终止程序，return只是返回当前函数  [quote=引用 8 楼 Xiongzhizhu 的回复:] [quote=引用 2 楼 paschen 的回复:] exit 是一个函数， 后者是一个语句  exit 可在任何时候终止进程，return只是返回当前函数  如果用主函数return后也会去调用exit 谢谢，系统是在return之后自动调用exit吗？[/quote]  不是系统调用，而是你程序在main函数结束后会调用  [/quote] ++ C++ 运行时库中，另有程序启动点，他会调用 main 函数

user: user-7
content: 顶6楼

user: user-8
content: 没有return 0的话编译可能过不了。

user: user-9
content: exit 是一个函数， 后者是一个语句  exit 可在任何时候终止程序，return只是返回当前函数  引用 8 楼 Xiongzhizhu 的回复:[quote=引用 2 楼 paschen 的回复:] exit 是一个函数， 后者是一个语句  exit 可在任何时候终止进程，return只是返回当前函数  如果用主函数return后也会去调用exit 谢谢，系统是在return之后自动调用exit吗？[/quote]  不是系统调用，而是你程序在main函数结束后会调用

user: user-6
content: 在我记忆中，VC  的库代码中-------VC6,VC8,VC9 都是这样的--------- 调用main 函数的方法是:  exit (main(__argc,__argv)); 并不是main 函数调用 exit  而是exit 的退出参数是main 的返回值 相当于 int n =main(__argc,__argv); exit(n); 确实是 main 退出后，在调用 的exit 退出程序执行。  具体可以参考mainCRTStartup,wMainCRTStartup,WinMainCRTStartup, wWinMainCRTStartup, 这四个函数的实现，这四个函数是VC c,c++ 程序缺省的入口点  他们可能被定义为  _tmainCRTStartup, _tWinMainCRTStartup 之类的宏

user: user-0
content: 引用 5 楼 lm_whales 的回复:exit 是少数几个，可以控制程序流程的函数之一 exit 的参数，就是程序退出码 其他的 有  1) signal,raise 对 signal raise 2)abort 3)setjmp,longjmp 对 setjmp longjmp  此外，还有些 加载执行别的程序的函数。  谢谢，补充了

user: user-0
content: 引用 2 楼 paschen 的回复:exit 是一个函数， 后者是一个语句  exit 可在任何时候终止进程，return只是返回当前函数  如果用主函数return后也会去调用exit 谢谢，系统是在return之后自动调用exit吗？

user: user-0
content: 引用 1 楼 Equim 的回复:没有return 0的话编译可能过不了。  异常退出是exit(1)就可以啊，没有写return 0

user: user-10
content: exit(1)是退出程序 close(fd)是关闭文件 return 0是函数返回  功能不一样，要看场合

user: user-6
content: exit 是少数几个，可以控制程序流程的函数之一 exit 的参数，就是程序退出码 其他的 有  1) signal,raise 对 signal raise 2)abort 3)setjmp,longjmp 对 setjmp longjmp  此外，还有些 加载执行别的程序的函数。

user: user-6
content: exit  虽然是一个函数，并不返回被调函数，而是退出程序的运行

user: user-6
content: exit  可以关闭所有打开的文件。。。。 ----------------至少 C FILE * 类型文fopen 打开的文件都能关闭----------- return 不可以

user: user-9
content: exit 是一个函数， 后者是一个语句  exit 可在任何时候终止进程，return只是返回当前函数  如果用主函数return后也会去调用exit
user-0 提问: 关于sscanf的问题

回复:
user: user-1
content: Mark，学习了。

user: user-0
content: 引用 6 楼 zhao4zhong1 的回复:“多一少一”问题占程序员常犯错误的10%以上！ 避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断，搬手指头心算验证一下程序到底应该写为 x、x-1、x+1中的哪个？ <、<=、==、>、>=中的哪个？指教的很对啊，单步调试的时候看的不是太懂。通过单步调试是可以发现这个问题的

user: user-2
content: 把fopen 里的参数改成rb看看

user: user-3
content: “多一少一”问题占程序员常犯错误的10%以上！ 避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断，搬手指头心算验证一下程序到底应该写为 x、x-1、x+1中的哪个？ <、<=、==、>、>=中的哪个？

user: user-4
content: 你的Name[0]之所以变成了0是因为你的ID越界了一个字节（最后的'\0'可能覆盖到了Name[0]） 改成char ID[9]就可以了

user: user-3
content: char    Name[4], ID[9], Age[3]; if((sscanf(Str, "%3s%8s%2s", Name, ID, Age))!=3)

user: user-0
content: 引用 1 楼 user-5 的回复:帮你测试可以读出  我是VC6.0，该不会是软件自身的问题？？？

user: user-5
content: 帮你测试可以读出
user-0 提问: 编写程序运行时提示触发一个断点

回复:
user: user-1
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。  printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。  在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 int c; scanf("%c",&c); //时，都改为 char s[2]; int c; scanf("%1s",s); c=s[0];

user: user-2
content: scanf读入%d需要取地址 同时要注意scanf_s读入%c或者%s的时候需要多加一个参数用来指定读取的字符的长度

user: user-3
content: scanf里是要变量的地址，也是就是改成 &number

user: user-4
content: scanf需要输入指针...不然怎么输出

user: user-5
content: &number
user-0 提问: 请问可以怎样修改，以至于不会Time Limit Exceeded！！！！

回复:
user: user-1
content: 利用标准模板库中的算法，先sort再unique

user: user-2
content: ＜1000个元素，冒泡排序 ＜100000个元素，qsort函数 ＜10000000个元素，放数据库中，建索引，（B+树排序） ≥10000000个元素，没用到过。

user: user-0
content: 使用了scanf和printf还是不行，看来只能使用其他排序方法了 #include<iostream> using namespace std; int main(){ 	int a[100001],n,m,min; 	scanf("%d",&n); 	for(int i=0;i<n;i++){ 		scanf("%d",&m); 		a[i]=m; 	} 	for(int i=0;i<n;i++) 	  for(int j=n-1;j>i;j--){ 	  	if(a[j]<a[j-1]){ 	  		min=a[j-1]; 	  		a[j-1]=a[j]; 	  		a[j]=min; 		  } 	  } 	for(int i=0;i<n;i++){ 		if(a[i]!=a[i+1]) 		  printf("%d ",a[i]); 	}  }

user: user-3
content: 1.考虑采用O(nlogn)的排序方法，像快排，堆排，归并之类的。你用的是O(n2)的选择排序，效率比较低。 2.去重和排序一起做，没必要单独做一遍去重工作，这样可以将去重的时间复杂度压为O(nlogn)。前提是你采用nlong的排序法 比如做归并排序的时候，“并”的过程中忽略重复元素。 3.如果这样还超时，那就将使用printf，scanf来进行输入输出。    如果还不行那就打读入优化吧（用getchar()来将输入数据一个一个读下来，再转化成你所需要的数据类型，相当与手写一个printf）  如果你不知道什么叫快排，堆排，归并。那你可以去可以找找别人写的文章，除了快速排序的优化有些难做以外，归并排序和堆排序并不算难。 还有就是，写算法题最好少用STL。

user: user-4
content: TLE的根本原因是排序时间复杂度太高了。一般而言，使用诸如冒泡、选择、插入这些简单的排序方法，其时间复杂度都是O(n^2)，n<=1000时，n^2就是10^6，不会有什么问题。但一旦达到10^7，就会TLE了，题目中n=100001，n^2已经达到10^10，所以肯定超时。优化建议：使用O(nlogn)的排序方法。

user: user-5
content: 输入输出用scanf printf会减少运行时间 如果改了还超时，就要考虑算法的复杂度 可以考虑使用map
user-0 提问: 问下C语言代码是不是一行一行，逐行执行的？

回复:
user: user-1
content: 多线程环境下不一定

user: user-2
content: 单线程环境也不一定，编译器有一种优化叫乱序优化

user: user-3
content: printf后用fflush看看

user: user-4
content: 一行一行的？那不是  int a = 0; int b = 0;  的效率比  int a = 0; int b = 0;  的高。。。
user-0 提问: sqlite的page中的cell的结构

回复:
user: user-1
content: 帮顶

user: user-0
content: 引用 1 楼 woshirenjun12 的回复:表示cell的个数和偏移？ 就你一个人答  分给你吧   我自己查出来了   07代表payload有7个bytes（payload是03 11 11 74 74 74 74，正好7个bytes） 03代表rowid，也就是行号，这是我插入的第三行 payload由key和data构成，data是74 74 74 74 ，代表 tt tt，key是sqlite内部自动找到的一个不重复的键值，在本例中key是03 11 11 还有一种情况是integer是主键的情况，和这个又不一样了

user: user-2
content: 表示cell的个数和偏移？
user-0 提问: wdm驱动无法安装

回复:
user: user-1
content: cat  和  sys 需要签名吧

user: user-0
content: 用2楼贴出来的inf文件，用inf2cat来创建cat文件无报错，但是还是无法安装

user: user-2
content: Windows驱动开发 http://www.osronline.com/

user: user-0
content: 我nt 驱动用DriverMonitor可以正常加载。另外，下面的是使用signtool修改后的inf文件，选的 "inf文件签名"但是最后一次生成cat文件，跳出消息框"参数没有正确设置",但是在同目录下生成了一个mydriver3i64.cat文件》   ; ; MyDriver3.inf ;  [Version] Signature="$WINDOWS NT$" Class=huanDevice ClassGuid={3F82AC59-FDE7-4407-9E48-DBC375D2A7D0} Provider=Huan DriverVer=08/19/2016,0.0.0.0 CatalogFile=MyDriver3.cat CatalogFile.NTx86=MyDriver3X86.cat CatalogFile.NTAMD64=MyDriver3X64.cat CatalogFile.NT=MyDriver3I64.cat  [DestinationDirs] DefaultDestDir = 12   [SourceDisksNames] 1 = "MyDriver2",Disk1,,""  [SourceDisksFiles] MyDriver2.sys = 1,MyDriver_Check,  [Manufacturer] %ManufacturerName%=Standard,NTamd64,NTIA64  [Standard.NTamd64]  [Standard.NTIA64]  [Strings] ManufacturerName="" ClassName="" DiskName="MyDriver3 Source Disk"
user-0 提问: 第一次发帖好激动啊！-----关于标准IOfgetc()的小问题

回复:
user: user-0
content: 引用 1 楼 user-1 的回复:usleep的参数单位是微秒吧，5000微秒是5毫秒 sleep(5); 暂停5秒    我知道原因了，是因为输出缓冲流，printf（）没有\n,改成usleep（300 0000）也没用，她的输出都存在输出缓冲区了，只有遇到换行符或者满了才打印，fflush刚好刷新缓冲区，加上fflush可以间隔5s打印了。

user: user-1
content: usleep的参数单位是微秒吧，5000微秒是5毫秒 sleep(5); 暂停5秒
user-0 提问: 求助大神看看程序哪有问题！！！！！

回复:
user: user-1
content: 会不会是因为缓冲区输入的问题。

user: user-2
content: 百度百科：由于可以无限读取，所以在2011年12月，ANSI采纳了ISO/IEC9899:2011标准，标准中删除了gets()函数，使用一个新的更安全的函数gets_s()替代

user: user-3
content: 单词的定义，大小写字母表示的连续字符串 最后一个单词，并不是最后一段连续字符串 比如，输入下面字符串，输出应该是多少呢 hello world hello_world

user: user-0
content: 引用 3 楼 iretf的回复:单词的定义，大小写字母表示的连续字符串 最后一个单词，并不是最后一段连续字符串 比如，输入下面字符串，输出应该是多少呢 hello world hello_world 这个我倒是没考虑，给出的结果里面有一个警告说gets可能会不安全，不知道是不是这个原因

user: user-0
content: 引用 2 楼 user-4的回复:字符串最长有多长？比1023长吗 字符串长度不超过1024

user: user-4
content: 字符串最长有多长？比1023长吗

user: user-0
content: 能测试通过，可是只得90分，提示如下 OJ.c  D:\Project\\\solution\p2290\s1718295\source\OJ.c(10) : warning C4996: 'gets': This function or variable may be unsafe. Consider using gets_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.  D:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\stdio.h(254) : 参见“gets”的声明   这是怎么回事啊   这道题按说很简单，怎么才能得满分啊  满分是150
user-0 提问: fscanf函数不能读入数据

回复:
user: user-0
content: 怎么fgetc,fclose上下矛盾，到底替不替换，按字符读写还是按字节读写，按字节读写是按二进制字节流读写吗

user: user-0
content: 但是我想用fscanf实现

user: user-1
content: 不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了

user: user-0
content: 我好像知道了，fscanf只能读文本文件，fread 用在二进制文件

user: user-2
content: 用 k= fread(&c[i], 1, sizeof(int), fp); 读出 返回值为 1 正常

user: user-0
content: 运行环境是vs2013
user-0 提问: 关于C语言单词统计程序的疑问

回复:
user: user-1
content: 首先你得搞明白，在单词内和单词外是什么意思。例如，china，chi na是怎么统计的。你网上找的代码有可能只适用于别人，你的参考别人的代码改成自己需要的

user: user-2
content: 有多个空格并不会造成统计错误啊。  因为它是先判断if (c == ' ' || c == '\n' || c == '\t')的
user-0 提问: C语言宏定义

回复:
user: user-1
content: 就是把宏替换成 0, 0,  ，具体什么意思得看你代码

user: user-2
content: 调到引用的地方去看看，单纯从这一句看不出什么来

user: user-3
content: VC编译选项加/EP /P（项目、属性、配置属性、C/C++、预处理器、预处理到文件：是，预处理取消显示行号：是），重新编译，查看宏展开后对应的.i文件。gcc加-E http://bbs.csdn.net/topics/391003898

user: user-4
content: 宏只是文本替换, 具体什么意思得看这个宏在哪里用
user-0 提问: c语言中怎样将两个8位的二进制数合成为一个16位的二进制数?

回复:
user: user-1
content: 仅供参考：#include <stdio.h> #include <stdlib.h> #include <string.h> #include <locale.h> int main() {     int i,v;     char bs[33];     char b[33];     char hs[9];     char h[9];     char s[4];     char *e;  // 十进制整数转二进制串；     i=1024;     ltoa(i,b,2);     sprintf(bs,"%032s",b);     printf("i=%d,bs=%s\n",i,bs); // 十进制整数转十六进制串；     i=1024;     ltoa(i,h,16);     sprintf(hs,"%08s",h);     printf("i=%d,hs=%s\n",i,hs); // 十六进制字符串转成十进制数     strcpy(hs,"00000400");     sscanf(hs,"%x",&i);     printf("hs=%s,i=%d\n",hs,i); // 二进制字符串转化为十六进制字符串；     strcpy(bs,"00000000000000000000010000000000");     i=strtol(bs,&e,2);     ltoa(i,h,16);     sprintf(hs,"%08s",h);     printf("bs=%s,hs=%s\n",bs,hs); // 二进制字符串转化为十进制数；     strcpy(bs,"00000000000000000000010000000000");     i=strtol(bs,&e,2);     printf("bs=%s,i=%d\n",bs,i); // 十六进制字符串转成二进制串     strcpy(hs,"00000400");     sscanf(hs,"%x",&i);     ltoa(i,b,2);     sprintf(bs,"%032s",b);     printf("hs=%s,bs=%s\n",hs,bs); // ASC\GBK字符串转十六进制串     strcpy(s,"a汉");     i=0;     while (1) {         if (0==s[i]) break;         sprintf(hs+i*2,"%02X",(unsigned char)s[i]);         i++;     }     setlocale(LC_ALL,"chs");     printf("s=%s,hs=%s\n",s,hs); // 十六进制字符串转成汉字（GBK）及字符(ASC)     strcpy(hs,"61BABA");     i=0;     while (1) {         if (1!=sscanf(hs+i*2,"%2x",&v)) break;         s[i]=(char)v;         i++;     }     s[i]=0;     printf("hs=%s,s=%s\n",hs,s);      return 0;  } //i=1024,bs=00000000000000000000010000000000 //i=1024,hs=00000400 //hs=00000400,i=1024 //bs=00000000000000000000010000000000,hs=00000400 //bs=00000000000000000000010000000000,i=1024 //hs=00000400,bs=00000000000000000000010000000000 //s=a汉,hs=61BABA //hs=61BABA,s=a汉

user: user-2
content: char 8位 short int 16位 char a,b; short int c; a = 10; b= 3; c = a; c <<= 8; c &=b; 这样就可以了。
user-0 提问: 红外线程序应该怎么写啊？求大神帮忙变一下或讲一下编写思路

回复:
user: user-1
content: 这只是大体的代码，还要根据环境不同进行改动。  #include <stdio.h> #include <windows.h>  int main() { 	HANDLE hSensor1, hSensor2; 	char order[2] = { 0 }; 	int i = 0; 	int iManNum = 0; 	DWORD dwState;  	// hSensor1, hSensor2;要连接设备初始化才可以 	while (1) { 		dwState = WaitForSingleObject(hSensor1, 500);			// 不一定用等待函数 		if (dwState == WAIT_OBJECT_0) { 			order[0] = 1; 			dwState = WaitForSingleObject(hSensor2, 1000);		// 超时时间限定 			if (dwState == WAIT_OBJECT_0) { 				order[1] = 2; 			} 		}  		dwState = WaitForSingleObject(hSensor2, 500); 		if (dwState == WAIT_OBJECT_0) { 			order[0] = 2; 			dwState = WaitForSingleObject(hSensor1, 1000);		// 超时时间限定 			if (dwState == WAIT_OBJECT_0) { 				order[1] = 1; 			} 		}  		if ((order[0] == 1) && (order[1] == 2)) { 			iManNum++; 			pinrtf(_T("进入1人\t")); 		} 		else if ((order[0] == 2) && (order[1] == 1)) { 			iManNum--; 			pinrtf(_T("出去1人\t")); 		} 		pinrtf(_T("目前的人数是:%d\n"), iManNum); 		order[0] = 0; 		order[1] = 0; 	}  	return 0; }
user-0 提问: _WDF_DEVICE_EXTENSION_TYPE_INFO': undeclared 

回复:
user: user-1
content: VS IDE中，在不明白的符号上点鼠标右键，选转到定义。 项目、属性、C/C++、附加包含目录：填写附加头文件所在目录 分号间隔多项

user: user-2
content: 链接时用-l把库加上
user-0 提问: malloc与free 的问题

回复:
user: user-1
content: 引用 5 楼 zhao4zhong1 的回复:判断是否越界访问，可以在数组的最后一个元素之后对应的地址处设置数据读写断点。如果该地址对应其它变量干扰判断，可将数组多声明一个元素，并设置数据读写断点在该多出元素对应的地址上。 #include <time.h> #include <stdlib.h> #include <windows.h> int main() {     int a,b[11];//本来是b[10]，为判断哪句越界，故意声明为b[11]      srand((unsigned int)time(NULL));//按两次F11，等黄色右箭头指向本行时，调试、新建断点、新建数据断点，地址：&b[10]，字节计数：4，确定。     while (1) {//按F5，会停在下面某句，此时a的值为10，b[10]已经被修改为对应0..4之一。         b[(a=rand()%11)]=0;         Sleep(100);         b[(a=rand()%11)]=1;         Sleep(100);         b[(a=rand()%11)]=2;         Sleep(100);         b[(a=rand()%11)]=3;         Sleep(100);         b[(a=rand()%11)]=4;         Sleep(100);     }     return 0; }  赵老师这个方法经典。

user: user-2
content: 判断是否越界访问，可以在数组的最后一个元素之后对应的地址处设置数据读写断点。如果该地址对应其它变量干扰判断，可将数组多声明一个元素，并设置数据读写断点在该多出元素对应的地址上。 #include <time.h> #include <stdlib.h> #include <windows.h> int main() {     int a,b[11];//本来是b[10]，为判断哪句越界，故意声明为b[11]      srand((unsigned int)time(NULL));//按两次F11，等黄色右箭头指向本行时，调试、新建断点、新建数据断点，地址：&b[10]，字节计数：4，确定。     while (1) {//按F5，会停在下面某句，此时a的值为10，b[10]已经被修改为对应0..4之一。         b[(a=rand()%11)]=0;         Sleep(100);         b[(a=rand()%11)]=1;         Sleep(100);         b[(a=rand()%11)]=2;         Sleep(100);         b[(a=rand()%11)]=3;         Sleep(100);         b[(a=rand()%11)]=4;         Sleep(100);     }     return 0; }

user: user-1
content: 同意楼上的说法，free出错一般都是越界访问导致的。 跟踪调试找到越界的地方，改掉就好了。

user: user-3
content: free出错一般都是越界导致的。 你申请的空间周围是有各种内存管理信息的，一旦你不小心覆盖掉了，free就会释放出错

user: user-4
content: 检查访问申请的内存时有没越界，如果越界会破坏了堆，很可能导致free时出错

user: user-5
content: 我觉得应该是freeall函数中free的用法有点缺陷，加一个中间临时变量会更好一点。菜鸡拙见，不知对不对
user-0 提问: 在头文件中定义一个变量，为什么不赋值编译没错，赋初值就报错“重定义”？

回复:
user: user-1
content: 多次声明一个变量没问题，多次定义就会重复  另外可以用#ifndef  #define #endif防止头文件重复包含

user: user-2
content: 只是像是不同源文件#include 同一个头文件一样而已...独立的和函数声明相像. 可以重复声明, 但是不能重复实现

user: user-0
content: 引用 1 楼 user-2 的回复:c/c++是以源文件为单位的, 这两个源文件都会对a初始化, 加上static就没事， 但是加上的话这每个源文件的a变量都是独立的了  为什么不赋值的就不会报错呢

user: user-0
content: 为什么不赋值的时候就不会报错呢？

user: user-2
content: c/c++是以源文件为单位的, 这两个源文件都会对a初始化, 加上static就没事， 但是加上的话这每个源文件的a变量都是独立的了
user-0 提问: 新人报道，求教各位大神一个问题

回复:
user: user-1
content: 引用 1 楼 zhao4zhong1 的回复:代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！ 大神能否帮忙看下这个问题呢 http://bbs.csdn.net/topics/392005561

user: user-0

user: user-2
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！
user-0 提问: 面向对象真的让问题变的更简单吗?我要从程序设计逻辑里不断去寻找类和对象，归类它们的属性和方法，还要考虑类与类之间的关系，反观面向过程，直接去实现就是了。

回复:
user: user-1
content: 引用 26 楼 yyxgs 的回复:[quote=引用 24 楼 zhao4zhong1 的回复:] 我预言，程序开发语言永远追不上自然语言。   我预言赵老师出一本哲理书籍销量肯定高。[/quote] 出书太累，还是偷懒推荐一本书吧：《皇帝新脑》

user: user-2
content: 引用 31 楼 yyxgs 的回复:大家说的对。存在即合理，面向对象肯定有过于面向过程的优势所以才能被广泛应用，谢谢大家指教! 结贴。  你是没学过GOF的人。这个必须学的。自己找找书看看吧。

user: user-0
content: 大家说的对。存在即合理，面向对象肯定有过于面向过程的优势所以才能被广泛应用，谢谢大家指教! 结贴。

user: user-0
content: 引用 28 楼 zanfeng 的回复:[quote=引用 1 楼 yyxgs 的回复:] C代码:  #include <stdio.h>  typedef struct Person {  	char* name; 	int age; };  int main(int argc, char *argv[])  { 	int i = 0;  	Person one = { 0 }; 	one.name = "张三"; 	one.age = 18;  	printf("我是%s, 我今年%d岁!\n", one.name, one.age);  	return 0; }  这样用有啥优势啊。 public class student:person {     }  继承接口才是优势 单纯的定义一个类有或者结构体有啥意义[/quote]   结构体是种类型的，比如一个人有姓名和年龄 继承一个学生的话不是可以将Person定义到学生结构体里去吗?

user: user-0
content: 引用 27 楼 u010165006 的回复:小程序体会不出面向对象的优势。 如果楼主学习了一种类库，理解了类的继承与多态，你会觉得不用面向对象无法想象如何实现，代码量会多出多少！ 面向对象分析与设计是专门的一门课，比较抽象。   原来如此。

user: user-2
content: 引用 1 楼 yyxgs 的回复:C代码:  #include <stdio.h>  typedef struct Person {  	char* name; 	int age; };  int main(int argc, char *argv[])  { 	int i = 0;  	Person one = { 0 }; 	one.name = "张三"; 	one.age = 18;  	printf("我是%s, 我今年%d岁!\n", one.name, one.age);  	return 0; }  这样用有啥优势啊。 public class student:person {     }  继承接口才是优势 单纯的定义一个类有或者结构体有啥意义

user: user-3
content: 小程序体会不出面向对象的优势。 如果楼主学习了一种类库，理解了类的继承与多态，你会觉得不用面向对象无法想象如何实现，代码量会多出多少！ 面向对象分析与设计是专门的一门课，比较抽象。

user: user-0
content: 引用 24 楼 zhao4zhong1 的回复:我预言，程序开发语言永远追不上自然语言。   我预言赵老师出一本哲理书籍销量肯定高。

user: user-0
content: 引用 23 楼 anhuizhuanjiao 的回复:还有一种东西叫面向并发，如果你写过Erlang，就会发现那才是最适合人写的语言   好吧，可以说这还是第二次听到。

user: user-1
content: 我预言，程序开发语言永远追不上自然语言。

user: user-4
content: 还有一种东西叫面向并发，如果你写过Erlang，就会发现那才是最适合人写的语言

user: user-0
content: 引用 19 楼 kongl123 的回复:俗话说“反抗不了那就学会去享受”。不的不用那就尝试去理解为什么大家都要用，去尝试看到美好的东西。  你现在说面向对象和面向对象，实际上围绕这两种思想而发明的知名的编译语言不下几十种，它们的优点体现在不同应用场景，当你遇到了这种场景，也许你会觉得非它莫属。一个优秀的公司和技术leader都会选择出一种适合自己情况的语言   好吧，我相信面向对象有它的优点，但我觉得它比面向过程更麻烦。。。

user: user-0
content: 引用 18 楼 user-6 的回复:楼主试试用C语言写个矩阵的加减乘求逆等等。  为什么要我写这个?

user: user-0
content: 引用 17 楼 zhao4zhong1 的回复:[quote=引用 16 楼 yyxgs 的回复:] [quote=引用 13 楼 zhao4zhong1 的回复:] 萝卜白菜，各有所爱。   但有时候必须去接受别人都在用的东西。 作个比喻: 我喜欢用QQ，朋友都喜欢用微信。后来我也就不得不也用微信了。[/quote] 随大溜 和 彰显个性 不矛盾。  为人随和 和 坚持自我 不矛盾。  双重人格不是贬义词。 [/quote]

user: user-5
content: 俗话说“反抗不了那就学会去享受”。不的不用那就尝试去理解为什么大家都要用，去尝试看到美好的东西。  你现在说面向对象和面向对象，实际上围绕这两种思想而发明的知名的编译语言不下几十种，它们的优点体现在不同应用场景，当你遇到了这种场景，也许你会觉得非它莫属。一个优秀的公司和技术leader都会选择出一种适合自己情况的语言

user: user-6
content: 楼主试试用C语言写个矩阵的加减乘求逆等等。

user: user-1
content: 引用 16 楼 yyxgs 的回复:[quote=引用 13 楼 zhao4zhong1 的回复:] 萝卜白菜，各有所爱。   但有时候必须去接受别人都在用的东西。 作个比喻: 我喜欢用QQ，朋友都喜欢用微信。后来我也就不得不也用微信了。[/quote] 随大溜 和 彰显个性 不矛盾。  为人随和 和 坚持自我 不矛盾。  双重人格不是贬义词。

user: user-0
content: 引用 13 楼 zhao4zhong1 的回复:萝卜白菜，各有所爱。   但有时候必须去接受别人都在用的东西。 作个比喻: 我喜欢用QQ，朋友都喜欢用微信。后来我也就不得不也用微信了。

user: user-0
content: 引用 12 楼 kongl123 的回复:这种问题看看就行了。当你发现一个东西的好之前它就是不好的，你不用因为别人说好而勉强自己去用，因为你没发现，所以也用不到它的好。用你已经发现了它的好的东西对你来说利益是最大化的   如果只是我自己肯定随意，但是公司都使用面向对象.....

user: user-0
content: 引用 9 楼 cxyOOOO 的回复:“从程序设计逻辑里不断去寻找类和对象”，这样做是不对的。   那应该怎么去找类和对象呢?
user-0 提问: C语言dll文件，c#调用串口连接总是返回true

回复:
user: user-1
content: 返回值 MarshalAs

user: user-0
content: 引用 4 楼 user-2 的回复:[quote=引用 2 楼 shmily_19900314 的回复:] [quote=引用 1 楼 user-2 的回复:] 把dll的头文件贴出来看看 这个没有问题啊，用c进行测试的时候都能够正常运行。 #include "dll.h" #include <iostream>  #include <stdio.h> #include <stdlib.h> #include <string.h> #include "windows.h" #include <tchar.h> using namespace std;[/quote] 你确定使用“纯C”测试的？ 我说的是"dll.h"贴出来看看，是否符合C的接口约定[/quote] extern "C"_declspec(dllexport) int Sum(int x,int y); extern "C"_declspec(dllexport) int Sub(int x,int y); extern "C"_declspec(dllexport) bool TFI_Init(char* iComID); extern "C"_declspec(dllexport) void _sTFI_Exit(); typedef unsigned char uint8; extern "C"_declspec(dllexport) bool TFI_ShowLine(int nLineNo,int order,int style,int brightness,const char* szText); 我刚刚调试了一下，调用这个dll文件是没有问题的，该返回false的时候是返回false的，但是c#调用dll里面这个函数的返回值的时候就变成true了，我实在是搞不懂其中的原因了。。。。

user: user-2
content: 引用 2 楼 shmily_19900314 的回复:[quote=引用 1 楼 user-2 的回复:] 把dll的头文件贴出来看看 这个没有问题啊，用c进行测试的时候都能够正常运行。 #include "dll.h" #include <iostream>  #include <stdio.h> #include <stdlib.h> #include <string.h> #include "windows.h" #include <tchar.h> using namespace std;[/quote] 你确定使用“纯C”测试的？ 我说的是"dll.h"贴出来看看，是否符合C的接口约定

user: user-0
content: 大神快出来帮帮忙啊！！这个小问题困扰一天了。。。。没办法往下进行了都。。。。。

user: user-0
content: 引用 1 楼 user-2 的回复:把dll的头文件贴出来看看 这个没有问题啊，用c进行测试的时候都能够正常运行。 #include "dll.h" #include <iostream>  #include <stdio.h> #include <stdlib.h> #include <string.h> #include "windows.h" #include <tchar.h> using namespace std;

user: user-2
content: 把dll的头文件贴出来看看
user-0 提问: 结构体指针赋值问题，麻烦指点

回复:
user: user-1
content: 理解正确

user: user-2
content: 看起来-1是指uninitialized状态，真正使用前会有init是吧 @赵4老师 。 单片机内存没用保护模式，所以不用0作nil，这样吧

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:BUF *dsp_buf_addr=(BUF *)-1;//将-1强制类型转换为BUF *类型后作为BUF*类型变量dsp_buf_addr的初始值。这样赋值结构体指针dsp_buf_addr指向的是什么内容呢？

user: user-0
content: 引用 1 楼 kongl123 的回复:BUF *dsp_buf_addr=(BUF *)-1为什么这么定义和dsp_buf_addr怎么使用有关，你可以看看dsp_buf_addr是怎么用的 (long *)dsp_buf_addr==(long *)-1; 后边又进行了这个判断，看不懂是咋回事

user: user-1
content: BUF *dsp_buf_addr=(BUF *)-1;//将-1强制类型转换为BUF *类型后作为BUF*类型变量dsp_buf_addr的初始值。

user: user-2
content: BUF *dsp_buf_addr=(BUF *)-1为什么这么定义和dsp_buf_addr怎么使用有关，你可以看看dsp_buf_addr是怎么用的

user: user-3
content: BUF *dsp_buf_addr=(BUF *)-1  上面这句话与下面这句话的作用是相同的  BUF *dsp_buf_addr=0xFFFFFFFF;  因为在指针里-1 就是0xFFFFFFFF;  利用地址表示两种状态，也是可能存在的，一种是未初始化的，还有一种是失败的。 假如我们用NULL，也就是0表示失败的话，那么有人就喜欢用0xFFFFFFFF表示未初始化的。

user: user-1
content: 引用 3 楼 shiyuzuxiaqianli 的回复:[quote=引用 1 楼 kongl123 的回复:] BUF *dsp_buf_addr=(BUF *)-1为什么这么定义和dsp_buf_addr怎么使用有关，你可以看看dsp_buf_addr是怎么用的 (long *)dsp_buf_addr==(long *)-1; 后边又进行了这个判断，看不懂是咋回事[/quote] 判断 将dsp_buf_addr强制类型转换为(long *)类型后的值 和 将-1强制类型转换为(long *)类型后的值 是否相等。  理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！ 不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！）  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。  电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

user: user-4
content: 我个人的理解，最后一句是定义一个指向结构体类型的指针，赋值号右边把-1强制类型转化为结构体指针类型，-1为十进制数，转化为二进制01组合的时候是没有正负的。个人建议，如有不妥，望指正。

user: user-5
content: 就是把 -1 当作 nullptr （NULL） 使用的 因为 地址 0 是个经常会用到的的内存地址， 不能把0 当作 NULL，nullptr 使用

user: user-0
content: 引用 6 楼 zhao4zhong1 的回复:理解正确还是不太懂啊，麻烦解释一下吧。没遇到过这样的情况，上网查资料也没找到
user-0 提问: 求大神看看出什么问题了

回复:
user: user-1
content: 代码中Data就不是一个类型。写全struct Data，或者typedef一下就可以。还有就是你的代码想干什么。

user: user-2
content: node *i = (node*)malloc(sizeof(Data));  改成  Data *i = (Data*)malloc(sizeof(Data));

user: user-3
content: 楼主要实现啥？  void Add(node a) { 	struct Data *i = (struct Data*)malloc(sizeof(struct Data)); 	i->data = a; }

user: user-4
content: node *i，i是一个指向整型的指针，哪有i->data，node *和struct Data *弄混淆了
user-0 提问: 关于多个文件的建立，编译

回复:
user: user-1
content: 新建一个项目，然后把你的文件添加到项目，然后VS会帮你编译链接

user: user-2
content: 编译链接vs会帮你搞定

user: user-3
content: 逐个添加到项目资源管理器中的源代码文件夹中？
user-0 提问: vc++中加filetool.dll加不了

回复:
user: user-1
content: 文件类型换一下，就可以找到了。我的找到了但是加载不了，手动注册也出错，直接安装MinGW一样运行c

user: user-2
content: 引用 6 楼 user-4 的回复:你得先把那个dll文件放进AddIns文件夹，到你截图的这个界面时，是你下面的文件类型 选项没有选择Add-ins(.dll)，所以没出现。

user: user-2
content: 引用 8 楼 phoenix06 的回复:换个Visual studio啊，用VC6这种古董做啥。。。一堆兼容问题，还不好用 用WinXP+VC6开发生成的exe程序，放Vista、Win7、Win8、Win10上都立即能用； 反之，令人大失所望！死的心都有！！

user: user-3
content: 换个Visual studio啊，用VC6这种古董做啥。。。一堆兼容问题，还不好用

user: user-4
content: 你得先把那个dll文件放进AddIns文件夹，到你截图的这个界面时，是你下面的文件类型 选项没有选择Add-ins(.dll)，所以没出现。

user: user-2
content: 或者参考下面： 在64位Windows下： 64位exe和dll在目录c:\windows\system32目录下； 32位exe和dll在目录c:\windows\syswow64目录下； 所以要注意：     在win64位系统下注册32位ocx或dll需要将32位ocx或dll拷贝到c:\windows\syswow64\目录下。     且注册要用c:\windows\syswow64\regsvr32 xxxxxxx.ocx或dll     在win64位系统下设置32位程序使用的数据库别名要用c:\windows\syswow64\cliconfg.exe     在win64位系统下设置32位程序使用的系统DSN要用c:\windows\syswow64\odbcad32.exe

user: user-2
content: 引用 3 楼 qq_35798046 的回复:是64位的，我装的是vc++6.0绿色版，32位虚拟机环境怎么搭建呀？！ 用 HyperV 或 VirtualBox 或 VMWare 在其中加载WinXP 再在里面的WinXP下使用VC6

user: user-0
content: 是64位的，我装的是vc++6.0绿色版，32位虚拟机环境怎么搭建呀？！

user: user-2
content: 确保当前OS是32位的。 如果不是，在32位虚拟机环境下使用VC6.

user: user-2
content: FileTool.exe 替换打开和添加到项目中 Visual C++ 的新功能 http://support.microsoft.com/kb/241396/zh-cn
user-0 提问: 关于C两个问题，代码图如下

回复:
user: user-1
content: 1) 不一定总是4，32位程序指针大小为4，64位程序为8 2） 关键是理清逻辑

user: user-2
content: 1) 不一定是4，只不过在现在的很多机器上是4；得到21是因为碰巧 2) 4步：做什么、怎么做、做出来、做对了吗

user: user-3
content: 32位机上，sizeof(指针)恒为4 因为指针存储的是一个32位的地址，并不是所指向的对象本身

user: user-4
content: 在百度搜“C源代码 学生成绩管理系统”
user-0 提问: 为什么内存free两次会使系统崩溃？

回复:
user: user-1
content: 引用 7 楼 akirya 的回复:借一次钱，你喜欢还2次啊。 这个比喻亮

user: user-1
content: 引用 8 楼 zhao4zhong1 的回复:为什么我借了张三100万元后还他第二次100万元会使张三进疯人院？  我就是那个张三，你还我，我不会去疯人院的

user: user-2
content: 我也觉得很奇怪，free貌似就是把申请的空间使用权归还给系统，这个跟malloc不一样。malloc会修改内存里面的数据，这个会导致产生问题，但是free不会修改内存对应的数据，就算被别的系统使用了之后也不会修改数据。就好像，malloc是租房子，free是归还房子，我把房子归还了以后，再归还一遍，感觉没有什么问题呀。为什么系统一定会崩溃？

user: user-3
content: 赵老师 还我 我不疯

user: user-4
content: 为什么我借了张三100万元后还他第二次100万元会使张三进疯人院？

user: user-5
content: 借一次钱，你喜欢还2次啊。

user: user-6
content: 实际free做的不只有你代码中的内容

user: user-7
content: 重复释放 则指这样一种场景：程序分配一块内存之后，经过使用将这块内存释放，但并没有将指向这块内存的所有指针抹零或回收，并在其他部分再次将指向同一块内存单元的指针交给内存分配器去进行释放操作。这种情况下，我们可以断言：程序逻辑并不清楚这块内存已经被释放；并且， 有理由相信，对这块内存进行的写操作，可能已经影响了程序其他部分的行为，因为这块内存可能已经分配作为其他用途。 因此，这应被看作立即停止程序运行的一项致命错误，因为程序行为已经出现了异常，而C函数库拥有的信息不足以纠正这种异常行为，而另一方面，程序可能已经发生了堆缓冲区溢出。为了削弱这类问题带来的实质性安全影响，现代的内存分配器往往会将尺寸接近的内存块放在一起（这样做还能够抑制内存碎片的产生，并提高CPU的数据缓存命中率，因为通常程序会倾向于一次性地访问相近的内存结构），从而能够在一定程度上减轻由于向已经释放的内存块继续写数据导致的损害（因为这些内存很可能被分配给同样的数据结构，这类写操作的危害往往会低于向其他类型的数据结构写数据，特别是当这些数据中包含一部分用户输入的时候）。当然，彻底消除这类问题，需要为程序设计语言增加一些新的基础设施（例如强类型、托管内存等）。

user: user-8
content: 这个主要看free的底层实现。free一次后，系统即知道这块内存已经被释放了，可以再此被申请。若是第二次free，系统虽说知道如何首地址，但空间的大小呢。或许底层设计时每个内存块都有过结束符，释放后就会访问到其他内存块的结束符，就可能造成非法读写内存，造成崩溃

user: user-9
content: free 的实现方法不尽相同  关键在这里，任何一个现成实现的源代码， 都不能说明其他实现的问题 。。。。。。。。。。。。。。。。。。。。。。。。。。。 多数free 实现的时候，要合并相邻内存； 如果内存已经合并了，你再去free 他， 此时他已经是别的内存块的一部分了； 你就会弄乱， 自由内存链表之类的数据结构。 即便本次free 不出问题，以后malloc,free也会出问题。 。。。。。。。。。。。。。。。 但是，free 的任何一个实现，两次 free 会出问题，都说明两次 free 是有问题的。 而有一个或者多个不出问题，不能代表所有的实现，都没有问题。 ///很多未定义，都是类似现象，这个也是未定义吧？。。。。

user: user-10
content: free两次肯定“应该”出问题，因为系统没办法判断你第二次free这块儿内存是否以及被重新分配了，如果没有，那再释放一次也没啥关系，只是空释放了一次，如果已经被重新分配了，那肯定就不能释放了，就因为系统没办法确定是否又重新分配了，所以就一概报错

user: user-11
content: 首先你不能假设所有的free实现都是这样的，另外一个简单的场景就是你第一次free的内存很可能马上再另外一个地方malloc了。这个是你再次free就有问题了。
user-0 提问: 怎么用C语言进行串口连接与数据收发啊，封装成dll文件

回复:
user: user-1
content: http://blog.csdn.net/kingepoch/article/details/8836244

user: user-0
content: char s2[]="////.//"; 	char s[2]; 	char s1[5]="COM"; 	itoa(iComID,s,10); 	strcat(s1,s); 	strcat(s2,s1); 	//将char*转为LPCTSTR 	int num = MultiByteToWideChar(0,0,s2,-1,NULL,0); 	wchar_t *wide = new wchar_t[num]; 	MultiByteToWideChar(0,0,s2,-1,wide,num); 	//LPCTSTR s1=_T("COM1"); 	/*LPCTSTR转char* 	wchar_t widestr[1024] = L"wo shi ni yeye"; 	int num = WideCharToMultiByte(CP_OEMCP,NULL,widestr,-1,NULL,0,NULL,FALSE); 	char *pchar = new char[num]; 	WideCharToMultiByte (CP_OEMCP,NULL,widestr,-1,pchar,num,NULL,FALSE);*/ 	m_hCom = CreateFile(wide,           // 定义串口名    #include <tchar.h>  						GENERIC_READ | GENERIC_WRITE,                // 存取模式（读写）  						0,                               // 共享模式：必须设置为0，表示设备独占使用  						NULL,                        // 保密性  						OPEN_EXISTING,      // 必须设置为OPEN_EXISTING打开不是创建  						FILE_FLAG_OVERLAPPED,                // 文件属性，如果是异步模式，可设置为FILE_FLAG_OVERLAPPED  						NULL                         // 模版，串口设备必须设置为NULL  						); 	if (m_hCom == INVALID_HANDLE_VALUE) 	{ 		return false; 	} 	else 	{ 		return true; 	} 我用这个在程序中提示串口被打开了，但是我用串口调试助手却还是能够打开这个串口。奇怪的是，如果我用串口调试助手先打开了这个串口的话，则这个程序是打不开这个串口的。。。。求解答啊，不要沉下去啊，我还会很多问题需要请教的。。。

user: user-0
content: 引用 5 楼 a7716021 的回复:你可以先用带界面的的练习啊， 练完了不让界面显示出来就是了。方便你验证准确性啊 我查了下，界面的话好像是添加了某个串口控件，但是我这个用不到控件。

user: user-2
content: 你可以先用带界面的的练习啊， 练完了不让界面显示出来就是了。方便你验证准确性啊

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:好象你没有界面（即窗口）的话，不好写回调函数之类的。 有没有别的方法了呀？我觉得应该是有的，可是我现在还没有找到方法，帮帮我 啊

user: user-3
content: 好象你没有界面（即窗口）的话，不好写回调函数之类的。

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:搜“串口调试助手源代码” 我看了一下，感觉像是要做一个界面，我不需要做界面的，只要能调用就可以了，还是我理解的不对啊？

user: user-3
content: 搜“串口调试助手源代码”
user-0 提问: c socket 非阻塞 upd交互问题

回复:
user: user-1
content: 引用 2 楼 zhao4zhong1 的回复:如果wireshark不支持本机抓包，试试Socket Sniff谢谢。 先试试不行再来问

user: user-2
content: 如果wireshark不支持本机抓包，试试Socket Sniff

user: user-2
content: 建议楼主先学会使用抓包软件比如wireshark
user-0 提问: 请问在C语言中怎么实现泛型?比如java中可以使用ArrayList任意类型，C怎么实现呢，基本类型可以用void*转换，结构类型又怎么知道内部的基本类型呢？

回复:
user: user-1
content: 参考Variant的实现。

user: user-2
content: C本身没有泛型一说，本身就是比较低级的过程语言。 结构类型常见的是传递结构指针时再传递一个size参数，用大小来区分到底传的什么结构体，前提是你能明确掌控所有可能的结构体且不存在大小相同的结构体；另一种是所有结构体内部的首个变量相同，用来区分结构体类型。

user: user-3
content: 也必须提供结构信息，用void*转换

user: user-1
content: 泛型是一种语法糖。 语法糖越甜，编译调试查错越苦！ 把有限的生命浪费在品尝/品鉴无穷多种的语法糖中，我认为不值当。

user: user-4
content: C++提供了泛型。 vector<int *> abc; abc.push_back(new int);

user: user-5
content: 用C++的STL不好么，兼容C。
user-0 提问: 二维数组 简单的复制数组 但输出数字乱码

回复:
user: user-0
content: 谢谢 不过 是用%lf  因为我用的是double   不过 你后面是对的 我没发现 粗心了 谢谢

user: user-1
content: %.1lf  ==> %.1f for (x=0;x<n;n++) ==> for (x=0;x<n;x++)
user-0 提问: 关于fork的一个疑问。

回复:
user: user-1
content: http://stackoverflow.com/questions/16078188/why-getppid-from-the-child-return-1 在子进程调用 getppid 时，父进程已经退出了

user: user-0
content: 没有判断fork调用失败，返回-1的情况。
user-0 提问: libcurl 获取服务器文件大小

回复:
user: user-1
content: 有些会改变的资源确实是不提供长度的，防止你断点下载，例如github的代码压缩包。用迅雷下一下看看能不能获取到大小吧。

user: user-2
content: 服务器没有提供Content-Length，只能等读完了才知道大小

user: user-3
content: 假定一个最大大小比如200MB？

user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:服务器不一定支持。我猜。 应该是服务器没返回content-length 这个字段 但是不知还有什么其他方法能事先知道attachment的大小？

user: user-4
content: 你用浏览器下载..如果浏览器都不能事先获取到大小..那就别浪费时间了...

user: user-5
content: curl_easy_getinfo你 查下这个函数吧，里面应该有可以获取content-length首部的值的

user: user-0
content: 好久没来了，这论坛 人气变得这么差，这么久了一条回复都没有

user: user-3
content: 服务器不一定支持。我猜。

user: user-0
content: 引用 2 楼 user-5 的回复:curl_easy_getinfo你 查下这个函数吧，里面应该有可以获取content-length首部的值的 返回的头部信息没content-length 这个字段， 无从获取
user-0 提问: c语言程序，从文本文件中提取由特定字符串开头的行，将提取出的行存储在另外一个文件中，程序大部分已经写好，但是输出部分搞不懂了，求改，求指教

回复:
user: user-1
content: 仅供参考：#include <stdio.h> #include <stdlib.h> #include <string.h> #include <io.h> #define MAXFILES 100 char fn[MAXFILES][80]; FILE *f,*fo,*fi; char fno[80],tmp[80]; char ln[1024]; char bk[1024]; int n,i,fs,L,k,st,v; char *p; //char *t; void main() {     system("dir COM3*.log /b >alllog");     f=fopen("alllog","r");     if (NULL==f) {printf("Can not open file:alllog\n");return;}     for (i=0;i<MAXFILES;i++) {         if (NULL==fgets(fn[i],80,f)) break;         L=strlen(fn[i]);         fn[i][L-1]=0;     }     fs=i;     fclose(f);     for (n=0;n<fs;n++) {         strcpy(fno,"WR_");         strcat(fno,fn[n]);         strcat(fno,".txt");         if (!access(fno,0)) continue;         fo=fopen(fno,"w");         if (NULL==fo) {printf("Can not create file:%s\n",fno);return;}         fi=fopen(fn[n],"r");         if (NULL==fi) {printf("Can not open file:%s\n",fn[n]);return;}         st=0;         while (1) {             if (NULL==fgets(ln,1024,fi)) break;//             switch (st) {             case 0:                 if (strstr(ln,"\tIRP_MJ_READ")) {                     fprintf(fo,"%s",ln);                 }                 if (strstr(ln,"\tIRP_MJ_WRITE")) {                     fprintf(fo,"\n%s",ln);                     st=1;                 }             break;             case 1:                 if (strstr(ln,"\tIRP_MJ_READ")) {                     L=strlen(ln);                     ln[L-1]=0;                     if ('\t'==ln[L-2]) ln[L-2]=0;                     if (' '==ln[L-3]) ln[L-3]=0;                     fprintf(fo,"%s",ln);                     st=2;                 }                 if (strstr(ln,"\tIRP_MJ_WRITE")) {                     fprintf(fo,"\n%s",ln);                 }             break;             case 2:                 if (strstr(ln,"\tIRP_MJ_READ")) {                     L=strlen(ln);                     ln[L-1]=0;                     if ('\t'==ln[L-2]) ln[L-2]=0;                     if (' '==ln[L-3]) ln[L-3]=0;                     p=strstr(ln,"Length ");                     sscanf(p+7,"%d",&v);                     if (v>0) {                         sprintf(tmp,"%d",v);                         k=strlen(tmp);                         fprintf(fo,"%s",p+7+k+1);                     }                 }                 if (strstr(ln,"\tIRP_MJ_WRITE")) {                     fprintf(fo,"\n%s",ln);                     st=1;                 }             break;             }          }         fclose(fi);         fclose(fo);     } } //              strcpy(bk,ln); //              t=strtok(bk,"\t"); //              while (t!=NULL) { //                  if (0==strcmp("IRP_MJ_WRITE",t) //                  t=strtok(NULL,"\t"); //              }
user-0 提问: 我想写一个c语言程序，从文本文件中提取由特定字符串开头的行，将提取出的行存储在另外一个文件中，输出部分搞不懂了，求改，求大神指教

回复:
user: user-1
content: 仅供参考：#include <stdio.h> #include <string.h> #define MAXLEN 1000 FILE *f; char ln[MAXLEN]; char fn[256]; int L; int n; int v1; int v2; void main() {     strcpy(fn,"in.txt");     f=fopen(fn,"r");     if (NULL==f) {         fprintf(stderr,"Can not open file [%s]!\n",fn);         return;     }     n=0;     while (1) {         if (NULL==fgets(ln,MAXLEN,f)) break;         n++;          if (NULL==strstr(ln,"object")) printf("%s",ln);          L=strlen(ln);         if ('\n'==ln[L-1]) {             ln[L-1]=0;         } else {             fprintf(stderr,"Too long(>=%d) at line %d:%s...\n",MAXLEN,n,ln);             break;         }          if (2==sscanf(ln,"%d%*s%d",&v1,&v2)) {             if (1<=v1 && v1<=10              && 1<=v2 && v2<=10) {                 printf("%d,%d\n",v1,v2);             } else {                 fprintf(stderr,"Data(%d,%d) Invalid at line %d:%s\n",v1,v2,n,ln);             }         } else {             fprintf(stderr,"Format error at line %d:%s\n",n,ln);         }     }     fclose(f); }

user: user-2
content: 自己调试下呗！
user-0 提问: 求助：报错，P.J.Plauger的C标准库书里面拷贝的测试stdio.h头文件 代码报错

回复:
user: user-1
content: Assertion failed: strcmp(buf, " a|-4 |0010|0XC")== 0, file d:\itcast install pac

user: user-2
content: %#lX  %#X|   ?

user: user-3
content: 导致出现这样的原因有：     1.非法指针访问和内存泄漏     2.大家再查查吧，一定是指针出现问题了。设置的指针范围跟你运行的不对     3.指针访问内存越界出现问题。     4.是因为不支持中文。     5.内存不够分配     6.当时后来检查发现的问题应该是多线程访问资源出的问题。     7.检查一下exe和dll是否混用的不同版本的crt     解决方法：     第一：检查申请的空间没有释放     第二：检查堆栈空间是否已经被全部分配满，建议每次内存分配尽量不要太大，并且记得释放     第三：指针指向了不可预期的内存位置

user: user-4
content: 点重试、再点中断，然后通过调用堆栈、变量窗口定位与分析原因

user: user-1
content: 仅供参考：#include <stdio.h> char buf[30]; int L; int main() {     L=sprintf(buf, "%2c|%-4d|%.4o|%#lX",'a', -4, 8, 12L);     printf("L:%d,buf:[%s]\n",L,buf);     return 0; } //L:16,buf:[ a|-4  |0010|0XC] //
user-0 提问: 新人对斐波那基数列的输出有了点问题

回复:
user: user-1
content: int： -2147483648～2147483647  long long的最大值：9223372036854775807 更大的数可以用数组来存储。

user: user-2
content: 引用 2 楼 qq_34763772 的回复:那int的上限是多少？ http://www.cnblogs.com/xiangshancuizhu/archive/2010/12/12/1903719.html  如果需要表示很大的数，可以用long long

user: user-0
content: 那int的上限是多少？

user: user-3
content: 溢出了 结果超出了变量能表示的范围
user-0 提问: 新人报到顺便求教一个基础问题

回复:
user: user-1
content: 函数定义与函数声明： http://blog.csdn.net/haiyan0106/article/details/3043998

user: user-2
content: 一个是声明，一个是实现，不过声明的后面还要加上一个分号一个是声明，一个是实现，不过声明的后面还要加上一个分号

user: user-3
content: C语言教程（附带C语言100例）http://download.csdn.net/detail/zhao4zhong1/8830817

user: user-4
content: 你学的是什么书？我学的时候用的是谭浩强的《C程序设计》，适合初学者学习。先把基础打牢，再向深处扩展。

user: user-0
content: 嗯， 懂了，谢谢你的解答

user: user-5
content: int leap(int a) 是函数头部加个分号是函数声明。   下面这个是函数定义 包括函数头部，和函数体的语句组。     int leap()             {                 int a;             } 这里有个问题，没写返回语句，又返回值的函数，要写返回语句。   前面一个int a 是函数参数表中的形参声明， 在函数定义时候，声明形参a， 在函数调用时候（定义）初始化形参a（通常是复制一份实参的值）  后面一个int a  是（函数中的）语句组内部定义的变量，属于局部变量定义。 这时候， 没有初始化的变量，内部类型值不确定，类类型， 跟他的 ，构造函数有关。
user-0 提问: not found in current context

回复:
user: user-1
content: 是否是 linux 环境 gdb调试，如果是检查编译条件是否加了 -g，不要加优化选项

user: user-2
content: 估计你看的时候程序已经执行结束了 在main函数内设置断点，程序停到断点处，观察变量的值
user-0 提问: 初学c++的小题

回复:
user: user-1
content: 调试一下看看效果

user: user-2
content: 仅供参考： windows里常见的内存填充数据含义 * 0xABABABAB : Used by Microsoft's HeapAlloc() to mark "no man's land" guard bytes after allocated heap memory * 0xABADCAFE : A startup to this value to initialize all free memory to catch errant pointers * 0xBAADF00D : Used by Microsoft's LocalAlloc(LMEM_FIXED) to mark uninitialised allocated heap memory * 0xBADCAB1E : Error Code returned to the Microsoft eVC debugger when connection is severed to the debugger * 0xBEEFCACE : Used by Microsoft .NET as a magic number in resource files * 0xCCCCCCCC : Used by Microsoft's C++ debugging runtime library to mark uninitialised stack memory * 0xCDCDCDCD : Used by Microsoft's C++ debugging runtime library to mark uninitialised heap memory * 0xDEADDEAD : A Microsoft Windows STOP Error code used when the user manually initiates the crash * 0xFDFDFDFD : Used by Microsoft's C++ debugging heap to mark "no man's land" guard bytes before and after allocated heap memory * 0xFEEEFEEE : Used by Microsoft's HeapFree() to mark freed heap memory

user: user-3
content: 第一个问题：do...while先做后判断，while...do先判断后做。判断的条件必须要有初始值，就像3楼和5楼的，i要初始化一个值。 第二个问题：switch(条件) case值1....break  case值2...break。条件不能是变量，还有每种情况做不同的处理，最好加个break。否则当条件满足值1的时候，后面的语句也会被执行。 这两个都是基础问题，还是多看看C语言基础知识吧

user: user-4
content: Microsoft C++编译器会发生访问冲突，它会把定义但未初始化的值设为0XCDCDCDCD（前提是Debug）

user: user-5
content: 1.i没有初始化的情况下，很多编译器都不会把它初始化成0，而是一个随机值 2.case后面必须跟的是常量

user: user-6
content: 第一个程式 变量 i 不初始化，会是一个随机值，楼主测不到想要的结果

user: user-6
content: 版主大大说的对，对变量初始化，养成良好习惯，第二个 case 后不能是变量  第一个程式过程先执行循环内语句再判断循环条件，直至不满足退出，楼主找个环境单步执行看看就明白。

user: user-7
content: 两个程序都不对  第一个没有对 i 进行初始化  第二个没有对a b 初始化，另外不能写成case (int)x

user: user-8
content: 咦，论坛不能编辑吗？1<=5是笔误

user: user-8
content: 一，相当于： int i=0; int s=0; start_of_do_while: s=s+i; i++; if(1<=5)goto start_of_do_while;  二，你没有编译环境吗？试一试不就知道了？ 没记错的话，switch里面case后面的值不能是变量。
user-0 提问: 关于c语言数组定义问题

回复:
user: user-1
content: 定义数组的时候需要是常量，使用数组的时候可以是变量

user: user-2
content: 1）C99 以前，定义数组（元素个数），要用常量表达式。 2）C99级以后 只要是初始化过的变量，都可以。（没初始化的，不论编译通过没有，都是不对的） 注意 仅仅使用变量的当前值定义数组的元素个数是多少， 数组的大小，不是随着变量变化的。 如果变量没初始化，结果就会出问题。  3)读写数组元素，可以用变量作为下标，也可以用常量。

user: user-3
content: 原则上说是使用常量，但是实际上整形的变量也可以通过编译。

user: user-4
content: 其实电脑开机后物理内存的每个字节都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。

user: user-2
content: 越界访问，当然就容易出事情了 Ｎ个元素的数组 第N元素（从第０开始算）的位置在数组之外

user: user-5
content: 引用数组元素时[ ]内可以写任何整数类型表达式
user-0 提问: 关于C语言代码能不能直接在PB上使用

回复:
user: user-1
content: 没用过PB，但是，C的代码肯定是可以在其他编译器上使用的。 就是编译器自带的库的不同会造成代码移植的时候回有不少麻烦。
user-0 提问: 关于整数溢出的问题

回复:
user: user-1
content: 因为溢出并不是马上变成未知值，就像环一样，最小值的后面又连着最大值，因此溢出之后会回到最大值

user: user-2
content: 只要 char 在 0～127

user: user-2
content: 格式符号，和数据类型要一一对应  %c,int %d,char,short  是没有问题的，可以保证的结果是对的 只要int 在0~127 因为 char 在 0～127  这是因为 printf 参数传递，有个隐形的类型提升 %f 对 float,double 也是可以的，这个其实固然有类型提升在内， 其实标准的奇葩，才是主要的因素。 标准里莫名其妙的取消了对%lf 输出 double 的支持，虽然后来补上了，终归有点怪异。 至于 long long 对应 %lld 如果用 %d 就会发生截断输出的情况。

user: user-3
content: 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！ 不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！）  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。

user: user-4
content: int 及比 int 更窄的类型使用 %d 可能不会出错，因为在传递给可变参数列表时进行默认整形提升到 int long 没有出错可能是因为你的环境中 long 和 int 等长 long long 出错是因为 %d 和 long long 不匹配，在解析可变参数列表时无法正确取到对应的值

user: user-0
content: 为什么结果会这样？而且long long类型的打印-1?