Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 大家探讨一些“编程好比盖房子”这个话题

回复:
user: user-1
content: 我看過一本書,內容有一句話,寫得好,寫得快  本來認為寫得快,代碼自然沒那麼好,注解沒那麼多  然後,我就試試慢慢寫,排位,代碼,注解,都慢慢得寫,寫清楚,寫好它  最後發現,還真的快多了,DEBUG少了,每個功能清晰,整個代碼有條理,方便維護,修改及理解  如果應用到盖房子上,就是要打好地基,不然再建上去就會~倒!!!!!!!!!!!!!!!!!!!!

user: user-2
content: 说的很对,理论上是这样的

user: user-3
content: 软件设计上的很多很多思想都是从建筑上得来的。

user: user-4
content: 代码大全上有各种 metaphor.  软件可以推倒重来, 建筑不行.  模块化的思想差不多吧, 又何止建筑呢.

user: user-5
content: 埃！现在这个社会本来就是浮躁的！

user: user-6
content: 我们为什么都会问这样的一些自己可以想到的话题.  因为我们不太自信,或者太屌丝,或者没有或者了,,,

user: user-7
content: 有相似之处，任何事物都有其共性，也有其独特的一面，不能捕风捉影，看到一点相似性就认为两个事情是相通的。 要弄清楚这个问题，必须深入了解

user: user-8
content: 有一点不同，就是搬砖在这里不累，一个ctrl-c和ctrl-v就能搬好多

user: user-9
content: 计算机领域中“隐喻”总是不那么给力。

user: user-10
content: 依稀记得有本书上说过，说编程好比任何一样事物都不够贴切。 而且以盖房子、XXX、XXX至少三个比喻为例做了逐一分析。

user: user-11
content: 一语中的！  引用 楼主 N_sev7 的回复:RT 我总听到有人说编程好比盖房子 像使用java的人员只管了解结构功能， 然后像建筑师一样设计好房子的结构 然后就是调用就OK了 像我们这些写底层的，就有点造砖，造建材的一样 随着编程技术的发展，貌似越来越多人看中的不在是建材的质量 更注重楼房的好看与否  以上是给我的感觉，总结：比如完全不恰当  大家说说自己的看法
user-0 提问: 浮点计算 高精度

回复:
user: user-1
content: 有定点数的库。

user: user-2
content: 要求很准确就使用double 或者自定义高精度数

user: user-3
content: (double)1 + (double)0.1  引用 楼主 asdwt123 的回复:大家都知道浮点运算。c语言里float有效位是5或6，现在编写一个浮点程序。比如就计算1+0.1，怎么让它自动转换成高精度运算的程序使得输出尽可能精确

user: user-4
content: 转换成 int 类型计算

user: user-5
content: 用10进制小数不能精确表示某些三进制小数0.1(3)=0.33333333333……(10) 同理，用二进制小数也不能精确表示某些10进制小数。

user: user-6
content: 引用 1 楼 turingo 的回复:(double)1 + (double)0.1  引用 楼主 asdwt123 的回复:大家都知道浮点运算。c语言里float有效位是5或6，现在编写一个浮点程序。比如就计算1+0.1，怎么让它自动转换成高精度运算的程序使得输出尽可能精确 引用 2 楼 worldy 的回复:要求很准确就使用double 或者自定义高精度数++++
user-0 提问: （数据压缩）RAR算法的原理以及用C的实现与执行。

回复:
user: user-1
content: 如果要强行研究可口可乐配方，可以自己研究下分子结构看看，(*^__^*) 嘻嘻……

user: user-2
content: 引用 1 楼 gqjjqg 的回复:RAR是一种专利文件格式，基本不可能直接拿到压缩算法，可以发邮件问下作者压缩算法原理。 解压缩的算法估计可以拿到，最多也就出一个RAR解压算法的报告。  你的导师 布置的这个任务不太合理，7-ZIP 比RAR好用很多，压缩比也高多了。而且还是个开源的，有源码，有原理，要研究也研究这个。 是的，如果要强行研究，可以自己研究下反汇编看看，(*^__^*) 嘻嘻……

user: user-3
content: 引用 4 楼 zhao4zhong1 的回复:建议反问老师要可口可乐配方！这个才叫有挑战性！！  这个要顶，哈哈，一个导师无聊的想法说不定误了学生一辈子...

user: user-1
content: 建议反问老师要可口可乐配方！这个才叫有挑战性！！

user: user-4
content: 引用 2 楼 zhao4zhong1 的回复:[quote=引用 1 楼 gqjjqg 的回复:] RAR是一种专利文件格式，基本不可能直接拿到压缩算法，可以发邮件问下作者压缩算法原理。 解压缩的算法估计可以拿到，最多也就出一个RAR解压算法的报告。  你的导师 布置的这个任务不太合理，7-ZIP 比RAR好用很多，压缩比也高多了。而且还是个开源的，有源码，有原理，要研究也研究这个。 英雄所见略同。[/quote]  有可能他们老师认为开源的没有难度

user: user-1
content: 引用 1 楼 gqjjqg 的回复:RAR是一种专利文件格式，基本不可能直接拿到压缩算法，可以发邮件问下作者压缩算法原理。 解压缩的算法估计可以拿到，最多也就出一个RAR解压算法的报告。  你的导师 布置的这个任务不太合理，7-ZIP 比RAR好用很多，压缩比也高多了。而且还是个开源的，有源码，有原理，要研究也研究这个。 英雄所见略同。

user: user-3
content: RAR是一种专利文件格式，基本不可能直接拿到压缩算法，可以发邮件问下作者压缩算法原理。 解压缩的算法估计可以拿到，最多也就出一个RAR解压算法的报告。  你的导师 布置的这个任务不太合理，7-ZIP 比RAR好用很多，压缩比也高多了。而且还是个开源的，有源码，有原理，要研究也研究这个。
user-0 提问: 求帮画个仿真图   在线等

回复:
user: user-0
content: [quote=引用 1 楼 turingo 的回复:] Keil环境本身就是可以软件仿真的。  我想要proteus的仿真图   能不能帮我连下

user: user-1
content: Keil环境本身就是可以软件仿真的。  引用 楼主 u012887645 的回复:#include<reg52.h> //头文件 unsigned char key=0xff;   //定义一个变量用于存放按键值 void readkey();   //读按键子函数,获取键值 void main()    //主函数 { while(1) {    readkey(); //读按键值 if(key!=0xff) //判断是否有按键按下 P2=~key;//这里取反：是因为LED为共阴，显示所按下的值    } } void readkey() //读键盘子函数 { P0=0xfe; //将第一列拉低，扫描是否有按键按下，第一列键值为：0，4，8，C key=P0;  //读取键盘值 if(key!=0xfe) //若key！=0xfe，说明有按键按下，则返回 return;    //否则继续扫描下一列 P0=0xfd; key=P0; if(key!=0xfd) return; P0=0xfb; key=P0; if(key!=0xfb) return; P0=0xf7; key=P0; if(key!=0xf7) return; key=0xff; }
user-0 提问: C语言左移右移操作符算法反推

回复:
user: user-1
content: 秒的精度为2秒

user: user-1
content: http://bbs.csdn.net/topics/390660970 date = ((year - 1980)<<9) + (month <<5) + day;  其中：year >=1980  time = (hour <<11) + (minute <<5) + (second >>1);   现在我知道，date = 17273, time = 33976 17273(10)                 33976(10) 100001101111001(2)        1000010010111000(2) 100001 1011 11001(2)        10000 100101 11000(2)     33-  11-   25              16:    37:   24  +1980                                      <<1   2013-  11-   25              16:    37:   48

user: user-0
content: 引用 1 楼 user-2 的回复:date = ((year - 1980)<<9) + (month <<5) + day; 其中：year >=1980 time = (hour <<11) + (minute <<5) + (second >>1);  year=date>>9+1980 month=date & mMask>>5;//mMask的看Moth占几位，占的位上写上1，就是mMask day=date & mMaskA;//mMaskA同上  谢谢，month 那里 是应该 date >> 5 & nMask ?还是像你写的。这样。 还有 那个second 为什么是 右移一位，那数不就不对了吗

user: user-2
content: date = ((year - 1980)<<9) + (month <<5) + day; 其中：year >=1980 time = (hour <<11) + (minute <<5) + (second >>1);  year=date>>9+1980 month=date & mMask>>5;//mMask的看Moth占几位，占的位上写上1，就是mMask day=date & mMaskA;//mMaskA同上
user-0 提问: 关于结构的赋值问题

回复:
user: user-1
content: Designated Initializer是C99引入的新特性，用于初始化稀疏（Sparse）结构体和稀疏数组很方便。有些时候结构体或数组中只有某一个或某几个成员需要初始化，其它成员都用0初始化即可，用Designated Initializer语法可以针对每个成员做初始化（Memberwise Initialization），例如：  struct complex_struct z1 = { .y = 4.0 }; /* z1.x=0.0, z1.y=4.0 */  所以说，这样语法是没错的，应该是你的编译器不支持这样特性。

user: user-1
content: gcc下编译通过，运行输出0 估计是楼主的编译器不支持这样赋值。

user: user-0
content: 看的是 c primer 这本书。里面就是这么说的。

user: user-2
content: struct book p1 = { 0}; p1.c = 10; p1.b = 20;    换一个本书

user: user-3
content: 楼主看的什么书？这种结构体初始化方法不是标准的，GNU带这样的扩展

user: user-4
content: 编译器 没支持这个特性呗
user-0 提问: typedef可以同时为一个类型起两个别名？

回复:
user: user-1
content: 不跟其它关键字标志符一样。  引用 5 楼 chybeyond123456789 的回复:[quote=引用 3 楼 max_min_ 的回复:] 这个，多个都没有问题的阿！只要不重复就好！ 不重复是什么意思啊，不跟其它关键字的别名重复吗？[/quote]

user: user-2
content: 定义100个都可以

user: user-3
content: #include<stdio.h>  typedef int my_int1, my_int2;  int main(){ 	my_int1 a = 1; 	my_int2 b = 2; 	printf("%d,%d",a,b); 	return 0; }  输出： 1,2 typedef只是起了别名而已，编译器实际编译的时候，不是通过别名编译的，而是通过别名找到 typedef sometype alias1, alias2; 这个声明里的sometype进行编译。  typedef struct {     int x;     int y; }name1, name2; name1 a;  实际编译的是： struct{int x, int y} a;  -----------------------------

user: user-4
content: 引用 3 楼 max_min_ 的回复:这个，多个都没有问题的阿！只要不重复就好！ 不重复是什么意思啊，不跟其它关键字的别名重复吗？

user: user-5
content: 类型别名，有时候方便代码逻辑理解

user: user-6
content: 这个，多个都没有问题的阿！只要不重复就好！

user: user-7
content: 楼主好奇心很强

user: user-1
content: 别名没有限制的，例如： typedef unsigned char int8u_t; typedef unsigned char u8; typedef unsigned char byte;  引用 楼主 syrchina 的回复: typedef struct {     int x;     int y; }name1, name2;//同时声明两个也可以？编译器是具体怎么操作的？   typedef struct {     int x;     int y; }name1, *pname1;//以前常用这种方式，想来应该是类似的   请高手指点迷津，谢谢

user: user-0
content: 引用 10 楼 zhao4zhong1 的回复://char (*(*x[3])())[5];//x是什么类型的变量? // //分析C语言声明，关键是搞清楚这个变量是个什么东西（函数、指针、数组）， //是函数那么剩下的就是他的参数和返回值， //是指针那剩下部分是说明他指向什么， //是数组剩下的部分就是说明数组的成员是什么类型。 //解析C语言声明规则： //从左侧第一个标识符开始，按照优先级进行结合。*表示是..的指针，const表示只读的，volatile表示可变的，[]表示是数组，()表示是函数。   感谢赵老师大公无私亲力亲为不厌其烦勤勤恳恳兢兢业业的指点

user: user-8
content: //char (*(*x[3])())[5];//x是什么类型的变量? // //分析C语言声明，关键是搞清楚这个变量是个什么东西（函数、指针、数组）， //是函数那么剩下的就是他的参数和返回值， //是指针那剩下部分是说明他指向什么， //是数组剩下的部分就是说明数组的成员是什么类型。 //解析C语言声明规则： //从左侧第一个标识符开始，按照优先级进行结合。*表示是..的指针，const表示只读的，volatile表示可变的，[]表示是数组，()表示是函数。 // //x和[3]结合说明是一个大小为3的数组，该数组指向了一个指针，该指针指向一个函数，该函数的无参数，返回一个指针，该指针指向一个大小为5的char型数组 #include <stdio.h> #include <typeinfo.h> char num[5]; char (*x00())[5] {     return # } int main() {     char (*x000)[5];//返回值     char (*(x00)())[5];//函数原型，参数为空，返回值为指针     char (*(*x0)())[5];//数组的元素，是个函数指针     char (*(*x[3])())[5];//是个数组，大小为3      x0 = x00;     x[0] = x0;     x[1] = x0;     x[2] = x0;     printf("typeid(x).name() is %s\n",typeid(x).name());     return 0; } //typeid(x).name() is char (* (__cdecl**)(void))[5]

user: user-9
content: 借宝地问一个相关问题，为什么下了语句在VS2008中编译通不过？  typedef struct{} (*PFUN)();
user-0 提问: SAPI中SetOutput调用问题

回复:
user: user-0
content: 好吧，C的接口实在没有调通，只有封了一层，改用C++调用了

user: user-1
content: 直接从MSDN上查找答案吧，参考http://msdn.microsoft.com/en-us/library/ms720410(v=vs.85).aspx  引用 楼主 tnt230 的回复:SAPI的C接口调用。  代码如下  ISpStream *pWavStream; ISpVoice *pVoice; CoInitialize(NULL); if(  S_OK != CoCreateInstance(&CLSID_SpVoice,  					NULL,  					CLSCTX_ALL,  					&IID_ISpVoice,	 					(void **)&pVoice) 					 	) { 	apt_log(APT_LOG_MARK, APT_PRIO_DEBUG, "pVoice init failed");				 }  if( S_OK != CoCreateInstance(&CLSID_SpStream,  					NULL,  					CLSCTX_ALL,  					&IID_ISpStream,	 					(void **)&pWavStream) 					 	) {     apt_log(APT_LOG_MARK, APT_PRIO_DEBUG, "pWavStream init failed");	 }  hr =pVoice->lpVtbl->SetOutput(pVoice,pWavStream,TRUE);    SetOutput调用的返回码是0x80045001。 找不到对应的错误原因，这样调用有问题吗？ pWavStream这个参数用法是否正确？

user: user-0
content: 引用 1 楼 turingo 的回复:直接从MSDN上查找答案吧，参考http://msdn.microsoft.com/en-us/library/ms720410(v=vs.85).aspx  [quote=引用 楼主 tnt230 的回复:] SAPI的C接口调用。  代码如下  ISpStream *pWavStream; ISpVoice *pVoice; CoInitialize(NULL); if(  S_OK != CoCreateInstance(&CLSID_SpVoice,  					NULL,  					CLSCTX_ALL,  					&IID_ISpVoice,	 					(void **)&pVoice) 					 	) { 	apt_log(APT_LOG_MARK, APT_PRIO_DEBUG, "pVoice init failed");				 }  if( S_OK != CoCreateInstance(&CLSID_SpStream,  					NULL,  					CLSCTX_ALL,  					&IID_ISpStream,	 					(void **)&pWavStream) 					 	) {     apt_log(APT_LOG_MARK, APT_PRIO_DEBUG, "pWavStream init failed");	 }    hr =pVoice->lpVtbl->SetOutput(pVoice,pWavStream,TRUE);    SetOutput调用的返回码是0x80045001。 找不到对应的错误原因，这样调用有问题吗？ pWavStream这个参数用法是否正确？[/quote]      不明白为什么，C++的版本调用时OK的，但用C接口调用不行。 我只是想重新定位音频流到内存而已
user-0 提问: 请问下面这个程序，除了ctrl+z结束循环外，怎样正常退出循环？

回复:
user: user-0
content: 引用 6 楼 wusuopuBUPT 的回复:引用 3 楼 aoshuanghanmei 的回复:我这是HOJ上的题，题目里没有说遇到什么特定字符结束循环，只是说输入在end of file时结束。所以很困扰该怎样结束循环，除了强制结束的方法。OJ的题目多数是这样做的。但我这样做是不能跳出循环，给数据结果的啊。。。

user: user-1
content: 引用 3 楼 aoshuanghanmei 的回复:我这是HOJ上的题，题目里没有说遇到什么特定字符结束循环，只是说输入在end of file时结束。所以很困扰该怎样结束循环，除了强制结束的方法。OJ的题目多数是这样做的。

user: user-1
content: 因为scanf函数是有返回值的，他的返回值是读入数据的个数，操作系统里EOF默认是int的1，所以可以这样判断： while(scanf("%c", &c)==1){  }  也可这样判断： while(scanf("%c", &c) != EOF){ }  都是一个道理。  怎样让操作系统知道你已经输入完毕了呢？ --通过向OS发送控制信号： SIGINT   ^C   (default action: terminate the process) SIGQUIT  ^\   (default action: terminate the process and dump to a core file) SIGSUSP  ^Z   (default action: suspend the process)  OS会捕获信号，然后判断并作出处理。

user: user-2
content: while(scanf("%c", &c)==1){  .... }

user: user-0
content: 我这是HOJ上的题，题目里没有说遇到什么特定字符结束循环，只是说输入在end of file时结束。所以很困扰该怎样结束循环，除了强制结束的方法。

user: user-3
content: while(scanf("%c", &c) != EOF) //这里的判断就是遇到EOF结束循环的阿  //可以在输入的时候判断c的值   while(scanf("%c", &c) != EOF) {   //do something    if( c== 'q')   {      break;   } }

user: user-4
content: ctrl + c ... ctrl + d ...
user-0 提问: 简单的hook，求指导，新手求学

回复:
user: user-0
content: 搞定了，入门还是得从全局钩子开始，第一个参数MSDN上有，我用了鼠标钩子和键盘钩子，第二个参数是钩子处理函数名，第三个参数可以用getmoudelhandle("dll的文件名")，第四个参数0，然后具体的操作在钩子的处理函数里面写，比如键盘函数里面按一下F2就退出就可以if(wparam==VK_F2){ unhookwindowshookex(setwindowshook的返回值)； }

user: user-1
content: 不明觉厉，马克

user: user-0
content: 引用 4 楼 u012982053 的回复:[quote=引用 1 楼 zhao4zhong1 的回复:] 在http://www.codeproject.com搜“hook” 实例网上很多的。 学会在网上找资源。 同新手。出校门才发现在学校的时间真心爽啊。。。表找我要联系方式啊。 我羞愧得很 菜鸟一个 还是初级菜鸟。。。[/quote]嘿嘿，网上虽然资料多，但是不能让我了解一个大的层次架构，仅仅就是想验证怎么挂接上某个进程

user: user-2
content: MFC的 我喜欢先在网上搜出要使用的函数  再看msdn 如果没怎么弄懂就看中文版的

user: user-2
content: 引用 1 楼 zhao4zhong1 的回复:在http://www.codeproject.com搜“hook” 实例网上很多的。 学会在网上找资源。 同新手。出校门才发现在学校的时间真心爽啊。。。表找我要联系方式啊。 我羞愧得很 菜鸟一个 还是初级菜鸟。。。

user: user-0
content: 引用 2 楼 u012982053 的回复:http://msdn.microsoft.com/en-us/library/windows/desktop/ms644990%28v=vs.85%29.aspx 怀恋才学hook的时候， 跟同学开玩笑， 直接黑了他的键盘和鼠标消息这个我看了，不过他没有个完整的例子，新手学嘛，很吃力，大哥，方便留个联系方式吗？

user: user-2
content: http://msdn.microsoft.com/en-us/library/windows/desktop/ms644990%28v=vs.85%29.aspx 怀恋才学hook的时候， 跟同学开玩笑， 直接黑了他的键盘和鼠标消息

user: user-3
content: 在http://www.codeproject.com搜“hook”
user-0 提问: C 指针问题

回复:
user: user-1
content: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  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",...)】来理解指针的本质， 而要依赖调试时的反汇编窗口中的C/C++代码【比如void *p=...】及其对应汇编指令以及内存窗口中的内存地址和内存值来理解指针的本质。  这辈子不看内存地址和内存值；只画链表、指针示意图，画堆栈示意图，画各种示意图，甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗？本人深表怀疑！ 这辈子不种麦不收麦不将麦粒拿去磨面；只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头，压面条，烤面包，……能从本质上理解面粉、理解面食吗？本人深表怀疑！！  提醒： “学习用汇编语言写程序” 和 “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-2
content: 这点是不是与指针的定义有冲突呢？亲？ --这要看你的编译平台。  我分别在window x64 和linux gentoo下编译： 都会报这样的warning： gcc -O0 -g3 -Wall -c -fmessage-length=0 -o main.o "..\\main.c"  ..\main.c:2:6: warning: return type of 'main' is not 'int' [-Wmain] ..\main.c: In function 'main': ..\main.c:7:4: warning: assignment from incompatible pointer type [enabled by default] ..\main.c:8:2: warning: format '%ld' expects argument of type 'long int', but argument 2 has type 'long int *' [-Wformat] ..\main.c:10:2: warning: format '%ld' expects argument of type 'long int', but argument 2 has type 'long int *' [-Wformat]  不过，运行结果就不同了 1.windows: please input a number: 2 the result 1 is 2686744 the result 2 is 2686748 //地址相差4字节  2.linux： please input a number: 2 the result 1 is 140737002356916 the result 2 is 140737002356924 //地址相差8字节   所以，这还是要取决于你的编译器中long型的size。

user: user-3
content: 根据"ILP32"数据模型，int。long。和point都是32位4字节，你在编译的时候如果打开警告选项，编译器会提示类型不符，但可以编译。

user: user-4
content: 你可以做一个强制类型转换。 p=(long *)&i;  long和int是否都是4个字节，这个取决于编译器。

user: user-5
content: 不会冲突的，long只是说明指针指向的类型。不管什么类型的指针，长度都是4（对一般编译器来说）。你那两句打印出的是个地址！
user-0 提问: 写了一段代码，提示段错误，核心已转存

回复:
user: user-1
content: gdb 调试

user: user-2
content: 看不懂你要做什么，你定义的stu[n]是干嘛用的？ 另外： 在第30行  if(p[m].birthday!=NULL){printf("指针p[%d].birthday内存分配成功\n",m);}else {printf("指针p[%d].info内存分配失败\n"),m;}  编译时出现 警告： 格式 ‘%d’ expects a matching ‘int’ argument [-Wformat]  这里的m不是int类型吗……gcc编译器在这里究竟发生了什么   看清楚这里写的语句，m实在printf的外边，怎么跟%d匹配？正确的语句：if(p[m].birthday!=NULL){printf("指针p[%d].birthday内存分配成功\n",m);}else {printf("指针p[%d].info内存分配失败\n",m）;}

user: user-3
content: 非法读写内存

user: user-0
content: 修改了一下 现在不会出现核心已转存问题，但是出现了低级错误  #include <stdio.h>//基本 #include <stdlib.h>//malloc #include <string.h>//strcmp  struct data{ 	int year,month,day; 	long tel; 	int add; };  struct student{ 	char name[20]; 	int num; 	char sex[2]; 	struct data* birthday; 	struct data* info; };  int main(){ 	int i,m,n; 	//--------输入人数-------- 	printf("输入一维数组的个数: \n"); 	scanf("%d",&n); 	struct student* p,stu[n]; 	//--------内存分配-------- 	p=malloc(sizeof(struct student)*n); 	if(p!=NULL){printf("指针p内存分配成功\n");}else {printf("指针p内存分配失败\n");} 	for(m=0;m<n;m++){ 	p[m].birthday=malloc(sizeof(struct data)); 	if(p[m].birthday!=NULL){printf("指针p[%d].birthday内存分配成功\n",m);}else {printf("指针p[%d].info内存分配失败\n"),m;} 	p[m].info=malloc(sizeof(struct data)); 	if(p[m].info!=NULL){printf("指针p[%d].info内存分配成功\n",m);}else {printf("指针p[%d].info内存分配失败\n",m);} 	} 	printf("-----------检测分配完成------------\n"); 	//--------数据输入-------- 	for(m=0;m<n;m++){ 		printf("正在输入第%d个学生的信息: ",m+1); 		printf("输入名字:\n"); 		scanf("%s",p[m].name); 		printf("输入学号:\n"); 		scanf("%d",&p[m].num); 		printf("输入性别M/F:\n"); 		scanf("%s",p[m].sex); 		printf("输入出生年月日:\n"); 		scanf("%d%d%d",&p[m].birthday->year,&p[m].birthday->month,&p[m].birthday->day); 		printf("输入电话号码:\n"); 		scanf("%ld",&p[m].info->tel); 		printf("输入地区号码:\n"); 		scanf("%d",&p[m].info->add); 	} 	//------输出内容 	printf("\n------现在打印所有信息------\n"); 	printf("\t姓名\t学号\t性别\t年月日\t\t电话号码\n"); 	for(i=0;i<n;i++){ 		printf("第%d个:",i+1); 		printf("%5s\t%d\t%s\t%d\\%d\\%d\t%d-%ld\n",(p+i)->name,(p+i)->num,(p+i)->sex,(p+i)->birthday->year,(p+i)->birthday->month,(p+i)->birthday->day,(p+i)->info->add,(p+i)->info->tel); 	} 	//------释放，清空 	for(m=0;m<n;m++){ 	free(p[m].birthday); 	free(p[m].info); 	p[m].info=NULL; 	p[m].birthday=NULL; 	} 	free(p); 	p=NULL; 	return 0; }     在第30行  if(p[m].birthday!=NULL){printf("指针p[%d].birthday内存分配成功\n",m);}else {printf("指针p[%d].info内存分配失败\n"),m;}  编译时出现 警告： 格式 ‘%d’ expects a matching ‘int’ argument [-Wformat]  这里的m不是int类型吗……gcc编译器在这里究竟发生了什么

user: user-0
content: 稍微改进了一下 p=malloc(sizeof(struct student)); 改成 p=malloc(sizeof(struct student)*n);  不过运行时出现的结果还是一样……

user: user-4
content: gdb 'your program' core .... gdb> bt  然后找到你的函数代码行，分析

user: user-0
content: 噢第59行漏了个. 	free(p[m].info); 不过这样还是出现同样错误

user: user-5
content: 进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’ 使用命令 gdb 运行程序名 core或core.数字 进入gdb然后使用bt命令 可以查看进程意外退出前函数调用的堆栈，内容为从上到下列出对应从里层到外层的函数调用历史。 如果进程意外退出不产生core文件，参考“ulimit -c core文件最大块大小”命令
user-0 提问: 为什么用了getch（）函数，还是一闪而过

回复:
user: user-1
content: 赞同楼上！！！

user: user-2
content: 引用 2 楼 max_min_ 的回复: scanf("%d",&pause); getchar(); //这里用getchar的话，会吃掉你上次scanf输入的回车符的，所以会认为你已经            //输入的一个字符，  getchar();// 在加一个的话，就是在等待输入了 //while(1); //很多方法的@ 赞同

user: user-3
content: 如果，你想看到图形，在 closegraph();前面暂停。

user: user-4
content: while (1) {  if (kbhit()) getch(); else break; } getch();

user: user-5
content: system("pause"); 确定程序运行到了上句？

user: user-6
content: scanf("%d",&pause); getchar(); //这里用getchar的话，会吃掉你上次scanf输入的回车符的，所以会认为你已经            //输入的一个字符，  getchar();// 在加一个的话，就是在等待输入了 //while(1); //很多方法的@

user: user-7
content: 多用几个getch，可能有多余的换行符。
user-0 提问: 关于initgraph（）函数路径的问题

回复:
user: user-1
content: 就是说TC是DOS下的东西，已经过时很久了，现在要用的话，只有通过虚拟机来安装DOS系统。  引用 2 楼 snailagg 的回复:一下子懵了，新手，能再仔细点指导下吗。

user: user-2
content: http://www.easyx.cn

user: user-0
content: 一下子懵了，新手，能再仔细点指导下吗。

user: user-1
content: 1、在Windows下安装DOS6.22虚拟机； 2、在DOS下安装Turbo C 2.0； 3、用TC编译运行你的程序。  引用 楼主 snailagg 的回复:我用的是绿色版tc ，把它放在E盘当前目录下，运行 #include<graphics.h> int main() {    int gdriver,gmode;    gdriver=DETECT ;    initgraph(&gdriver,&gmode,"E:\\TC");    line(100,100,200,200);    getch();    closegraph();    return 0;      } 提示initgraph，line（）等函数都没有定义， 这个路径怎么设置好。
user-0 提问: c语言问题

回复:
user: user-1
content: 引用 2 楼 buyong 的回复:十进制负数转成2进制也是负数。 所以直接把这两个数相加，结果转为二进制输出。把问题简单化，++

user: user-2
content: 可以用位操作符<< 和 >>来达到二进制输出 #include <stdio.h>  typedef struct  { 	int Int1; 	int Int2; 	int IntAdd; } mInt;  void outPrintf(int a) { 	int rMove = 0x01; //移位后与整数位与得到对应二进制位的数 	int k = 8;//这是二进制的位数 	for (k = k-1;k>=0 ;k-- ) 	{ 		printf("%01x",(a&(rMove<<k)) && 1); 	} 	printf("\n"); }  int main(int argc, char *argv[]) {	 	mInt inInt; 	printf("请输入第一个整数"); 	scanf("%d",&inInt.Int1); 	printf("请输入第二个整数"); 	scanf("%d",&inInt.Int2); 	inInt.IntAdd = inInt.Int1 + inInt.Int2; 	printf("第一个整数的二进制是\t"); 	outPrintf(inInt.Int1); 	printf("第二个整数的二进制是\t"); 	outPrintf(inInt.Int2); 	printf("两个整数和的二进制是\t"); 	outPrintf(inInt.IntAdd);  	 	return 0; }

user: user-3
content: 十进制负数转成2进制也是负数。 所以直接把这两个数相加，结果转为二进制输出。

user: user-4
content: /2   %2   ，二进制放到数组中，做+法和进位处理。

user: user-5
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-0 提问: 求看下我打的程序，提交时wrong answer，求AC。。。

回复:
user: user-1
content: The average score of course 1 is:72.25

user: user-0
content: 这个也是错误的。。。

user: user-0
content: 有一个空行打漏了，，我填上去以后也是错误的。。。 这个错误请忽略。。。
user-0 提问: 16进制用int 保存 怎么保存？

回复:
user: user-1
content: 电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……

user: user-2
content: 引用 2 楼 turingo 的回复:进制的问题，以0x开头的是16进制数，参考：  #include "iostream" using namespace std;   typedef unsigned long ULONG;    int main() {     char* l_cpTemp = "0x12345678";      ULONG u = strtoul(l_cpTemp, 0, 16);       cout<<u<<endl;       return 0; }   [quote=引用 楼主 aaadddzxc 的回复:] 0x0f  怎么保存下来？ 0x0f 字符串读取出来后，atoi转换后 保存到int 里面  我打印后 int %X 是0 为什么？[/quote] +1

user: user-3
content: atoi默认只转10进制遇到非数字的则退出，所以Ox0F才会返回0， 使用strtol 可以按进制转换

user: user-4
content: atoi转的是int吧！需要额外处理的！

user: user-5
content: 进制只是一种表现形式，实际都是以二进制存储的。

user: user-6
content: 楼主要保存"0x0f"？ 它整体不是一个16进制表示 因此没法直接转换成int的

user: user-6
content: 。int。 好像没有x 4位表示不了它啊。。。。。。 楼主 直接字符串吧

user: user-7
content: 整数就是整数，没什么几进制的，几进制只是表达形式，存储层面都是二进制

user: user-8
content: 进制的问题，以0x开头的是16进制数，参考：  #include "iostream" using namespace std;   typedef unsigned long ULONG;    int main() {     char* l_cpTemp = "0x12345678";      ULONG u = strtoul(l_cpTemp, 0, 16);       cout<<u<<endl;       return 0; }  引用 楼主 aaadddzxc 的回复:0x0f  怎么保存下来？ 0x0f 字符串读取出来后，atoi转换后 保存到int 里面  我打印后 int %X 是0 为什么？

user: user-9
content: atoi只能转10进制的字串吧
user-0 提问: 看了C语言的书，接下来看什么？

回复:
user: user-1
content: 下面内容是我之前看到的一位程序员的建议（不记得在哪里看到的了），分享给你，希望对你有帮助。  另，欢迎大家对这个路径图进一步完善和补充。  学习路径图  1、C语言-数据结构-编译  2、C语言-数据结构-汇编-计算机组成与体系结构  3、C语言-数据结构-面向对象程序设计-数据库-网络

user: user-2
content: 看完C != 掌握C  还需要项目实践。

user: user-3
content: 写小程序了连连了

user: user-4
content: 看看数据结构
user-0 提问: 数组作为函数参数的疑问

回复:
user: user-1
content: 函数声明时： 有3种方法可以把数组当做函数参数： 1.直接传指针： void myFunction(int *param){ } 2.传带size的数组： void myFunction(int param[10]){ } 3.传不带size的数组： void myFunction(int param[]){ }  原理都是一样的，都是告诉编译器接受一个int 型的指针。  If you want to pass a single-dimension array as an argument in a function, you would have to declare function formal parameter in one of following three ways and all three declaration methods produce similar results because each tells the compiler that an integer pointer is going to be received  参考：http://www.tutorialspoint.com/cplusplus/cpp_passing_arrays_to_functions.htm  函数调用时： int param[10]; myFunction(param) 直接传递函数名（即数组地址）当做实参即可。

user: user-2
content: 一维数组，传a,a[],&a[0]，或传指针。

user: user-3
content: 引用 3 楼 u010334406 的回复:引用 1 楼 turingo 的回复:传如a即可，也就是数组的首地址。  [quote=引用 楼主 u010334406 的回复:] 在函数nzp的定义中，整型数组a作为函数nzp的参数时，分别定义int nzp(a[8])、int nzp(a[])、是不是都是正确的？意思是不是一样的？参数a[8]和a[]都表示数组的第一个元素的地址？ 还有个疑问，如果没声明数组a，是不是参数要写成我说的那两种形式呢？直接参数写a，程序如何知道是数组名还是变量呢？[/quote]函数形参定义成数组和指针，效果是一样的，通常直接定义成指针，调用时传入数组名和指针都是可以的

user: user-0
content: 引用 1 楼 turingo 的回复:传如a即可，也就是数组的首地址。  引用 楼主 u010334406 的回复:在函数nzp的定义中，整型数组a作为函数nzp的参数时，分别定义int nzp(a[8])、int nzp(a[])、是不是都是正确的？意思是不是一样的？参数a[8]和a[]都表示数组的第一个元素的地址？ 还有个疑问，如果没声明数组a，是不是参数要写成我说的那两种形式呢？直接参数写a，程序如何知道是数组名还是变量呢？

user: user-4
content: 竟然没分了竟然没分了竟然没分了，我要问问题啊，   int dc_3DesEncryption(unsigned int Lenght, unsigned char Index, unsigned char *Soure, unsigned char *ENC_Data)； 这个函数，在里面运行的时候，结果是对的。            int  redx; 	  unsigned int Lenght = 0x09; 	  unsigned char Index = 0x02; 	  unsigned char Soure[] = {0x71, 0x61, 0x51, 0x41, 0x31, 0x21, 0x11, 0x01}; 	  unsigned char ENC_Data[500];    	  redx = dc_3DesEncryption(Lenght, Index, Soure, ENC_Data);  但是当他运行完毕后，为什么ENC_Data里面没有值？

user: user-5
content: 传如a即可，也就是数组的首地址。  引用 楼主 u010334406 的回复:在函数nzp的定义中，整型数组a作为函数nzp的参数时，分别定义int nzp(a[8])、int nzp(a[])、是不是都是正确的？意思是不是一样的？参数a[8]和a[]都表示数组的第一个元素的地址？
user-0 提问: 用rand() 函数去100 个随机的整数的问题

回复:
user: user-1
content: 1.rand()函数返回什么 rand()函数式stdlib.h里声明的函数。 它生成一个[0, RAND_MAX]的均匀随机整数。 其中，RAND_MAX至少为32767（2^15-1） returns a pseudo-random number 0 through 32767. 2. (double) rand() / (double) RAND_MAX): 这是把生成的随机数范围缩小到[0,1]，double/double得出结果不是0，而是double型数据  3. 要是 去 100 个 随机 整数，这个程序对吗？ 不对。 乘以RANGE_MAX是让随机数的范围扩大到[0, RANGE_MAX],加上RANGE_MIN是让随机数的范围限制到[RANGE_MIN, RANGE_MAX]

user: user-2
content: 参考C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\rand.c /*** *rand.c - random number generator * *       Copyright (c) Microsoft Corporation. All rights reserved. * *Purpose: *       defines rand(), srand() - random number generator * *******************************************************************************/  #include <cruntime.h> #include <mtdll.h> #include <stddef.h> #include <stdlib.h>  /*** *void srand(seed) - seed the random number generator * *Purpose: *       Seeds the random number generator with the int given.  Adapted from the *       BASIC random number generator. * *Entry: *       unsigned seed - seed to seed rand # generator with * *Exit: *       None. * *Exceptions: * *******************************************************************************/  void __cdecl srand (         unsigned int seed         ) {         _getptd()->_holdrand = (unsigned long)seed; }   /*** *int rand() - returns a random number * *Purpose: *       returns a pseudo-random number 0 through 32767. * *Entry: *       None. * *Exit: *       Returns a pseudo-random number 0 through 32767. * *Exceptions: * *******************************************************************************/  int __cdecl rand (         void         ) {         _ptiddata ptd = _getptd();          return( ((ptd->_holdrand = ptd->_holdrand * 214013L             + 2531011L) >> 16) & 0x7fff ); }

user: user-3
content: 取100个要循环执行100次，这只是一个

user: user-3
content: rand()返回值是int RANGE_MAX取值应该为100，这样就是一个0-100范围内的随机数
user-0 提问: C如何获取函数地址?

回复:
user: user-1
content: 再一次证明： 对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！

user: user-2
content: 要么用函数指针，或者汇编吧！

user: user-1
content: 改用Release模式即可。我猜。

user: user-3
content: 获取函数地址的最佳方式是用函数指针。  引用 楼主 xlrtx 的回复: #include <stdio.h> typedef unsigned long DWORD; int main() { 	DWORD lpMain = 0; 	lpMain = (DWORD)main; 	return 0; }  这是测试的c代码..  可是debug的时候,发现获取的地址不正确..  情况很奇葩,如图:   内存中的地址没有问题,可是赋值的时候值突然变了..  仔细看了一下,获取的内容好像是IAT表对应main函数的地址.   不知道有没有什么方法能够直接得到main函数在内存中的地址..

user: user-0
content: turingo: 谢谢你,不过可能我问题没有描述清楚..  我的意思是,程序在debug的时候获取的函数地址是IAT表中的地址,而不是真正的入口地址..因为需要计算函数大小,所以当用iat表地址相减的时候,得到的差总是5.  zhao4zhong1: 谢谢,这个方法很好用..  _DEBUG时候要加上5(一个jmp xxxx命令的长度),因为两个跳转指令并不是在一个地址上. 所以debug时函数的大小是(int *)((int)fun2+1)-*(int *)((int)fun1+1) + 5; release情况下本地函数没有IAT跳转直接减就可以.   刚才又吧debug和release两种情况的代码反汇编看了下..总结下.. 1.不管是debug还是release,函数都是16字节对齐的,空着的地方会被填充烫烫烫 2.debug的函数比release的函数体积大,仔细看了下,仿佛debug的函数会将堆栈填满0xcc,并且在调用一个函数后会检查堆栈. 3.release的函数体积会小很多,没有堆栈检查..  我这是想写一个可以将自己代码插入其他程序运行的程序..想着用api重定位就行了,可是写到现在发现C还有个C库,想要脱离它还要考虑其他问题..略麻烦..考虑用汇编了..

user: user-1
content: 仅供参考//仅对VC6 #include <stdio.h> void fun1() {     int f1=1;     printf("fun1\n");     printf("fun1\n"); } void fun2() {     int f2=2;     printf("fun2\n"); } void fun3() { } void main() { #ifdef _DEBUG     printf("sizeof(fun1)==%d\n",*(int *)((int)fun2+1)-*(int *)((int)fun1+1));     printf("sizeof(fun2)==%d\n",*(int *)((int)fun3+1)-*(int *)((int)fun2+1)); //sizeof(fun1)==59 //sizeof(fun2)==43 #else     printf("sizeof(fun1)==%d\n",(int)fun2-(int)fun1);     printf("sizeof(fun2)==%d\n",(int)fun3-(int)fun2); //sizeof(fun1)==32 //sizeof(fun2)==16 #endif }

user: user-0
content: 找到解决的方法了  链接器加上/INCREMENTAL:NO即可将IAT中本模块的函数跳转取消,只保留系统函数调用 (不知道这样叫好不好,IAT本意是pe头里的数据结构,这里表示程序中调用函数的跳转表)  还有一个问题就是不知道如何取消函数间的int3,记得是debug用的,但是可不可以在debug编译的同时消除这些int3啊..影响计算函数体积..

user: user-3
content: #include <stdio.h>  typedef int (*entry_t)(int argc, char *argv[]);   int main(int argc, char *argv[]) { 	entry_t addr = main; 	printf("%p\n", main); 	printf("%p\n", addr);  	return 0; }  /** 输出信息 */ // 0x80483c4 // 0x80483c4  引用 5 楼 xlrtx 的回复:函数指针不能够获取函数真正的地址,只能够得到函数在IAT表中的地址啊..

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:改用Release模式即可。我猜。  想要吧那些int3去掉..并且debug,求解..  因为需要计算函数的长度,但是debug模式下函数长度包括了许许多多的int3

user: user-0
content: 函数指针不能够获取函数真正的地址,只能够得到函数在IAT表中的地址啊..
user-0 提问: 关于结构体自引用的问题

回复:
user: user-1
content: 引用 1 楼 turingo 的回复:只要最终能找到类型定义即可，不过提前声明是比较好的习惯，这里还有另外的写法：  typedef struct tag_2 {   	int value;   	struct tag_2 *link;       }NODE;     [quote=引用 楼主 missheaven2011 的回复:] 看到几个帖子，关于使用typedef实现结构体自引用，模板如下 struct tag_2;  //这里进行结构体不完整的声明 typedef struct tag_2 NODE;   struct tag_2{       int value;       NODE *link;       };    但是我看到有一个实际例子 typedef struct tag_2 NODE;   struct tag_2{       int value;       NODE *link;       };   缺少了struct tag_2;  //这里进行结构体不完整的声明，但是依然能编译成功，这是为什么？难道不是必须的么[/quote]+1这种做法是常用的

user: user-2
content: 只要最终能找到类型定义即可，不过提前声明是比较好的习惯，这里还有另外的写法：  typedef struct tag_2 {   	int value;   	struct tag_2 *link;       }NODE;   引用 楼主 missheaven2011 的回复:看到几个帖子，关于使用typedef实现结构体自引用，模板如下 struct tag_2;  //这里进行结构体不完整的声明 typedef struct tag_2 NODE;   struct tag_2{       int value;       NODE *link;       };    但是我看到有一个实际例子 typedef struct tag_2 NODE;   struct tag_2{       int value;       NODE *link;       };   缺少了struct tag_2;  //这里进行结构体不完整的声明，但是依然能编译成功，这是为什么？难道不是必须的么
user-0 提问: 求大神帮助！

回复:
user: user-1
content: 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 fopen("...","...");fscanf,fprintf,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fread,fwrite,fclose  //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了  电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……

user: user-0
content: 可惜我都不知道去哪copy。呜呜。。。 求大神帮忙啊！

user: user-2
content: 引用 2 楼 u011609505 的回复:我能看懂可是遇见这个问题就是写不出来啊！ 求大神帮忙！  那就copy, 改改

user: user-0
content: 我能看懂可是遇见这个问题就是写不出来啊！ 求大神帮忙！

user: user-3
content: 参考http://c.chinaitlab.com/basic/892627.html  引用 楼主 u011609505 的回复:有一个文件shop.dat，在该文件中以二进制方式存放了50个用于表示超市商品销 售记录的结构体类型数据。结构体的声明如下： struct Sales {     int ID;//商品编码     char name[30];//商品名称     int  num;//商品数量     float price;//商品单价 } 编写一个函数，将shop.dat 文件中的数据读出，并且构建1 个商品销售记录数组A； 编写一个函数，删除上述所生成数组A 中单价小于4000 元的商品销售记录； 编写一个函数，将经过上述处理的数组A 按照商品编码进行递增排序，并 将排序后的全部结果显示在屏幕上，每种商品的数据占一行，显示格式为： 111 IPad2 2 4688.00 122 Iphone4S 3 5899.00  求大神帮忙实习简单的代码！
user-0 提问: C、C++竞赛题（简单）

回复:
user: user-1
content: 这作业，百度一下吧

user: user-2
content: 这是C，C++作业题吧？，。。。

user: user-3
content: 自己做哦，出现什么问题再提哦

user: user-4
content: 楼主自己应该可以做出来吧，不难...

user: user-5
content: 1. 156
user-0 提问: 请问有没有谭浩强C程序设计题解与上机指导第三版，可以复制的版本

回复:
user: user-1
content: 谭浩强还有需求( ⊙ o ⊙ )啊！

user: user-2
content: 谭浩强的书害了不少人,还是看别的好书吧
user-0 提问: 请教一下各位关于学习C语言该看什么书

回复:
user: user-0
content: OK，谢谢各位了，确实平时实践比较少。

user: user-1
content: 写代码出错，就说明你平时写的代码太少了。不是看书多就行的，就算你看的懂代码，自己写也是另外一回事，建议你多敲代码，多写写例子。

user: user-2
content: 如果复杂算法都能看懂的话,那就自己多练习吧,写多了就很多都懂了

user: user-3
content: The c programming language

user: user-4
content: 我记得刚学那会儿是看教程的 然后边看遍敲代码比较快

user: user-5
content: 从基础开始看吧，C++ Primier 从简入深，本人经历。

user: user-6
content: C和指针

user: user-7
content: http://download.csdn.net/detail/user-7/6333711 这本基础指针入门书，看看

user: user-7
content: 函数传参数都是值拷贝的形式完成的！ 你这里传递的是值而已！本身没有改变， 传指针也是传地址值过去，修改内存地址上的内容达到修改的目的的！
user-0 提问: 有谁在写程序？单片机 SOP-8的

回复:
user: user-1
content: 推荐你一个软件 KEIL C51

user: user-2
content: 何不自己动动手，又不难

user: user-3
content: SOP-8的单片机很多，用汇编指令写就好。  引用 楼主 lvjianjun 的回复:我想得到一个程序，就是SOP-8的单片机，用在LED分段上面，开关一次，3脚输出高电平，再开关一次，6脚输出高电平 有酬代写
user-0 提问: VS2013新建文件出错

回复:
user: user-1
content: 似乎安装的不对，或安装文件不对

user: user-2
content: 用“以管理员身份运行setup.exe”的方法重装试试。

user: user-0
content: 楼上的不好意思 我是小白.... 我是刚装好VS2013 然后新建文件出错 没有命名不合法吧？

user: user-3
content: 这错误怎么看的懂 创建文件  	FILE *f = fopen("d:/1.txt","w"); 	if (f) 	{ 		char *pData = "aaaaa"; 		int len = fwrite(pData , sizeof(pData) , 1 , f ); 		if (len <= 0 ) 		{ 			cout<<"write is faild!"<<endl; 		} 		fclose(f); 	}

user: user-4
content: 是不是命名不合法，用纯英文的试试看。  引用 楼主 u013043054 的回复:刚装的VS2013新建文件出错，如下弹出窗口，请问这是怎么回事？
user-0 提问: 求教关于interlocked的问题

回复:
user: user-1
content: 《Windows核心编程》

user: user-0
content: 引用 1 楼 user-2 的回复:这涉及多线程同步处理机制，每种机制都不同   临界区（Critical Section）、互斥量（Mutex）、信号量（Semaphore）、事件（Event）  《秒杀多线程第六篇 经典线程同步 事件Event》已经发布，欢迎参阅。  《秒杀多线程第七篇 经典线程同步 互斥量Mutex》已经发布，欢迎参阅。  《秒杀多线程第八篇 经典线程同步 信号量Semaphore》已经发布，欢迎参阅。   http://blog.csdn.net/morewindows/article/details/7442333  不是多线程的同步问题 就是关于interlocked函数本身的工作情况

user: user-2
content: 这涉及多线程同步处理机制，每种机制都不同   临界区（Critical Section）、互斥量（Mutex）、信号量（Semaphore）、事件（Event）  《秒杀多线程第六篇 经典线程同步 事件Event》已经发布，欢迎参阅。  《秒杀多线程第七篇 经典线程同步 互斥量Mutex》已经发布，欢迎参阅。  《秒杀多线程第八篇 经典线程同步 信号量Semaphore》已经发布，欢迎参阅。   http://blog.csdn.net/morewindows/article/details/7442333
user-0 提问: C语言 两张表合成一张表？

回复:
user: user-1
content: 用excel吧，把第一个文本的文件copy到新建的xls文件，第一行第一咧，粘贴；把第二个文件的内容copy，粘贴到第一行第二列，OK；

user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:比如将3楼代码编译生成了test.exe，连同TWspellToChinaSpeel.txt和ChinaToChinaSpeel.txt都在d:\mydir目录下  开始、运行、cmd  在弹出的黑色窗口中输入以下命令： cd /d d:\mydir test >Result.txt notepad Result.txt   大哥 你怎么不编译呢。。。好吧，我当作参考了。。你怎么写那么多代码啊。。。

user: user-2
content: 比如将3楼代码编译生成了test.exe，连同TWspellToChinaSpeel.txt和ChinaToChinaSpeel.txt都在d:\mydir目录下  开始、运行、cmd  在弹出的黑色窗口中输入以下命令： cd /d d:\mydir test >Result.txt notepad Result.txt

user: user-2
content: 没实际编译链接调试，不一定对，仅供参考： #include <stdio.h> #include <string.h> #define MAXPY 20000 #define MAXL 10 char dlpy[MAXPY][MAXL]; char twpy[MAXPY][MAXL]; char py[MAXL]; char ln[80]; int i,n; FILE *f; int main() {     f=fopen("TWspellToChinaSpeel.txt","r");     fgets(ln,80,f);//跳过第一行//大陆拼音对台湾拼音     i=0;     while (1) {         if (2!=fscanf(f,"%9s%9s",dlpy[i],twpy[i])) break;         i++;         if (i>=MAXPY) break;     }     fclose(f);     n=i;     f=fopen("ChinaToChinaSpeel.txt","r");     while (1) {         if (2!=fscanf(f,"%2s%9s",ln,py)) break;         printf("%s %s ",ln,py);         for (i=0;i<n;i++) {             if (0==strcmp(py,dlpy[i]) {                 printf("%s\n",twpy[i]);                 break;             }         }     }     fclose(f);     return 0; }

user: user-3
content: 看的不是太明白，如果是想做简体繁体读音的翻译软件，把不同的与简体拼音的规则，一一匹配.   用2个std::map存储一下对应关系.  typedef std::map<std::string , std::string>  Map_Type  汉语拼音对应汉语汉字 汉语拼音对应台湾拼音

user: user-4
content: 定义三个结构体数组 其中两个用来存放源文件 然后遍历，遍历结果存在第三个结构体数组中 然后保存  请别人写代码 不如请个思路 然后自己写
user-0 提问: 关于hash函数的设计的问题

回复:
user: user-1
content: 哈希算法和哈希数据结构是彼此独立的，所以需要研究各种哈希算法以便适应不同类型key的应用场景。

user: user-2
content: http://www.baidu.com/s?wd=%E6%9A%B4%E9%9B%AAhash&rsv_bp=0&ch=&tn=baidu&bar=&rsv_spt=3&ie=utf-8&rsv_sug3=4&rsv_sug1=4&rsv_sug4=155&rsv_sug=0&oq=%E6%9A%B4%E9%9B%AA+hash&rsp=0&f=3&rsv_sug2=1&rsv_sug5=0&inputT=8985

user: user-3
content: 写错了，rc4不是。

user: user-3
content: 书嘛，举例子。  你要复杂的也可以，比如rc4 md5 sha1 sha256 Tiger

user: user-4
content: <The Art of Computer Programming 2nd> Vol. 3  Chapter 6.4  Hashing

user: user-0
content: 有没有更专业点的？

user: user-5
content: 用素数可以减小冲突！

user: user-6
content: 哈希表的数组是定长的，如果太大，则浪费，如果太小，体现不出效率。合适的数组大小是哈希表的性能的关键。哈希表的尺寸最好是一个质数，最小的质数尺寸是17
user-0 提问: VC++6.0调试问题

回复:
user: user-0
content: 引用 6 楼 baichi4141 的回复:理由很简单 b[0x09]和b[0x10]之间隔了6个变量 b[0x0A]、b[0x0B]、b[0x0C]、b[0x0D]、b[0x0E]、b[0x0F] 这应该也不对，如果是b[0x10]的话，也不应该是  引用 6 楼 baichi4141 的回复:理由很简单 b[0x09]和b[0x10]之间隔了6个变量 b[0x0A]、b[0x0B]、b[0x0C]、b[0x0D]、b[0x0E]、b[0x0F] 谢谢，原来是这么回事！！ 回去验证结果如下  原来以十六进制表示时，变量也的系数也是要十六进制的。 以下是在十进制下查看的

user: user-1
content: 不要企图依赖输出指针相关表达式的值【比如printf("%p\n",...)】来理解指针的本质， 而要依赖调试时的反汇编窗口中的C/C++代码【比如void *p=...】及其对应汇编指令以及内存窗口中的内存地址和内存值来理解指针的本质。

user: user-2
content: 理由很简单 b[0x09]和b[0x10]之间隔了6个变量 b[0x0A]、b[0x0B]、b[0x0C]、b[0x0D]、b[0x0E]、b[0x0F]

user: user-3
content: VC6.0太古老了，即便在WindowsXP下也有不兼容的情形。  引用 楼主 lihuaxiong 的回复:运行程序时，进入调试状态，查看a,b变量的存储情况，发现在b变量中，看到是变量b的存储数据不一样。  但是，在屏幕中输出时，a，b变量的输出是一样的。无论是b是以指针*（b+i）输出，还是以数组b[i]输出，在屏幕上的输出结果都是一样。 左边是a变量，右边是b变量 我个人的猜测，可能是VC6.0的调试模式，在显示变量情况时，存在问题。因为看到问题都是出现在b[10]开始出现乱码（乱码可能是变量地址） 请大神指点。。 #include <stdio.h> #include <string.h>   int main(int argc, char *argv[]) {	int i,j; 	unsigned  char a[64] = {0x01,0x23,0x45,0x67,0x01,0x23,0x45,0x67,0x01,0x23,0x45,0x67,0x01,0x23,0x45,0x67,\ 							0x23,0x45,0x67,0x01,0x23,0x45,0x67,0x01,0x23,0x45,0x67,0x01,0x23,0x45,0x67,0x01,\ 							0x45,0x67,0x01,0x23,0x45,0x67,0x01,0x23,0x45,0x67,0x01,0x23,0x45,0x67,0x01,0x23,\ 							0x67,0x01,0x23,0x45,0x67,0x01,0x23,0x45,0x67,0x01,0x23,0x45,0x67,0x01,0x23,0x45}; 	unsigned int * b=a; 	for(i=0,j=0;i<64/4;i++) 	{printf("%x%x%x%x\t%x\n",a[j+3],a[j+2],a[j+1],a[j],b[i]);j+=4;} 	 	return 0; }

user: user-0
content: 引用 3 楼 focuslight 的回复:b指针变量， [i]就是 乱码但是在屏幕输出是正常输出的

user: user-4
content: b指针变量， [i]就是 乱码

user: user-0
content: 不知用别的开发平台会不会也出现这种情况，本人只用过VC++6.0

user: user-5
content: 有可能
user-0 提问: 文件如何读取结构体，并进行相应操作

回复:
user: user-1
content: 如何是在同一个机器上，看你的代码应该不会有问题，你再GDB一下吧

user: user-0
content: 为什么我这样读出来的数据  全是乱码呢，应该怎样读取二进制中的多个结构体数据？小白求解

user: user-2
content: 这道题和我的毕设有点像啊，大神，能不能把代码给我发过来！ 十分感谢！

user: user-3
content: 根据写进去的协议，怎么写进去，然后读出来通过结构体解析出来就好！ 匹配读写！

user: user-4
content: 所谓修改删除文件a某位置的内容，其实是读打开文件a，再将‘a中修改删除位置之前的内容＋修改删除的内容＋a中修改删除位置之后的内容’保存到文件b，关闭文件a，删除文件a，将文件b改名为与之前文件a相同的名字，仅此而已。

user: user-4
content: 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 fopen("...","...");fscanf,fprintf,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fread,fwrite,fclose  //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了

user: user-5
content: 该文件中以二进制方式 这需要规格书，或者打开文件分析二进制吗

user: user-6
content: 参考http://c.chinaitlab.com/basic/892627.html  引用 楼主 xiaolanghh 的回复:有一个文件shop.dat，在该文件中以二进制方式存放了X个用于表示超市商品销 售记录的结构体类型数据。结构体的声明如下： struct Sales {     int ID;//商品编码     char name[30];//商品名称     int  num;//商品数量     float price;//商品单价 } 编写一个函数，将shop.dat 文件中的数据读出，并且构建1 个商品销售记录数组A； 编写一个函数，删除上述所生成数组A 中单价小于4000 元的商品销售记录； 编写一个函数，将经过上述处理的数组A 按照商品编码进行递增排序，并 将排序后的全部结果显示在屏幕上，每种商品的数据占一行，显示格式为： 111 IPad2 2 4688.00 122 Iphone4S 3 5899.00  写出关键的语句即可！如何读入结构体，要设置偏移量吗？如何删除记录等等！
user-0 提问: 如何学习c语言?

回复:
user: user-1
content: 真心建议你去搜索郝斌的C语言视频，在看视频前先用浩强的书先预习，事半功倍。 我刚考完C语言，这个方法让我轻松掌握一些较浅的C语言知识。当你在短时间内学习忘谭浩强的C,你可以去寻找一些外国教材，这时候，你再花时间看外国教材就会更加有价值，要不你直接学习外国教材会很吃力。。 具体办法一定要多提疑问，Google里面对初学者的问题一般都会有比较好的解释，关键是你能不能提出有建设性的问题来帮助自己学习。 提出疑问的最好办法就是打代码，这不是自然科学，只是国外史前一群超级大牛定下的代码协定，规矩都是他们定，所以在打代码的时候要不断地提出疑问，就算今日不解决，随着深入学习原理，你会早晚会懂得的。 假如楼主是刚接触代码的，希望你能一路顺利，尽早发现代码的乐趣，那时候就会有源源不断的动力去支撑你去学习新的知识来满足自己。 还有，不懂的问题多上CSDN，这里卧虎藏龙，一定可以解决你的问题~

user: user-2
content: 先看书,后写代码,理解了就上手了

user: user-3
content: 我觉得C语言不适合0基础学习，你需要同时考虑业务逻辑与底层资源管理，这对初学者太麻烦了。 建议你先学python一类的，对编程有了概念再接触底层。

user: user-4
content: 先看看浩强哥《c语言设计》，入门，知道什么是c语言，然后再看《c_program》,等你发现浩强哥的书有问题了，你就真正开始c语言了。

user: user-5
content: http://download.csdn.net/detail/max_min_/6333711 http://download.csdn.net/detail/max_min_/6333663 两本书，好好钻研钻研，入门了先！后面就开朗了

user: user-6
content: C程序设计语言，多动手试验

user: user-0
content: 怎么下载不了

user: user-7
content: bc++3.1 帮助里面对每个函数都有一小段能拷贝出来运行看效果的例子程序。非常适合初学C语言。相比较而言VC带的帮助MSDN就没有。http://download.csdn.net/source/2805028

user: user-8
content: 压力就是动力，找个项目或机会

user: user-9
content: 引用 楼主 u013041173 的回复:如何学习从零基础开始学习c语言，有什么好的方法，有什么好的教材和视频，请各位多多给我建议，谢谢 买本入门书籍，仔细琢磨琢磨~ C的陷阱与缺陷，C专家编程，C和指针，很值得买本纸质的书学习~入门，少花点钱

user: user-10
content: 参考http://blog.csdn.net/turingo/article/details/8115042  引用 楼主 u013041173 的回复:如何学习从零基础开始学习c语言，有什么好的方法，有什么好的教材和视频，请各位多多给我建议，谢谢

user: user-11
content: 有四本介绍C语言比较经典的书，可以看看：C的陷阱与缺陷，C专家编程，C和指针，C语言。这几本书值得好好卡看

user: user-0
content: 能给我具体点的建议吗？

user: user-12
content: C程序设计语言！ + 项目

user: user-13
content: C程序设计语言！ C与指针。
user-0 提问: 让系统留个指定大小的文件？大神进

回复:
user: user-1
content: 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

user: user-0
content: 引用 3 楼 baichi4141 的回复:[quote=引用 2 楼 qyxqyxqyx 的回复:] [quote=引用 1 楼 baichi4141 的回复:] 这样的做法会破坏磁盘的其他文件吗？ ——不会 文件指针会不会偏移到另一个文件内部，使得另一个文件截断了？？  ——不会  fseek仅仅只是改变了指针的值，没有改变文件的大小 fwrite读取指针值，发现现有文件大小不够大，改变文件大小并写入数据 写入的EOF是一个char型数据，任何数据都不可能截断一个文件——除非你分不清“函数从文件中读出的数据”和“函数读不到数据时的返回值” fseek偏移到1m的位置（此时文件大小没有改变），然后fwrite会先改变文件大小到1m（这个策略类似于内存malloc指定大小），如果发现无法做到（因为发现后面的磁盘空间被其他文件占用了），会返回失败，否则，改变文件大小，并写入EOF。 是这么个过程吗？[/quote] 文件由操作系统管理，在磁盘上不连续存放 只有当磁盘已经被其他文件占满或磁盘因故无法访问的时候才会出现改变文件大小失败的情形[/quote] 一个1m的文件在磁盘上可能是这儿有50k，那儿有100k,等等一片片的？就跟链表似的，这个意思？ 这在哪儿有介绍？ NT的稀疏文件怎么做到在某个指定文件指针位置存放数据，而只有一小块大小，可以在磁盘某个位置往上下扩张？

user: user-2
content: 引用 2 楼 qyxqyxqyx 的回复:[quote=引用 1 楼 baichi4141 的回复:] 这样的做法会破坏磁盘的其他文件吗？ ——不会 文件指针会不会偏移到另一个文件内部，使得另一个文件截断了？？  ——不会  fseek仅仅只是改变了指针的值，没有改变文件的大小 fwrite读取指针值，发现现有文件大小不够大，改变文件大小并写入数据 写入的EOF是一个char型数据，任何数据都不可能截断一个文件——除非你分不清“函数从文件中读出的数据”和“函数读不到数据时的返回值” fseek偏移到1m的位置（此时文件大小没有改变），然后fwrite会先改变文件大小到1m（这个策略类似于内存malloc指定大小），如果发现无法做到（因为发现后面的磁盘空间被其他文件占用了），会返回失败，否则，改变文件大小，并写入EOF。 是这么个过程吗？[/quote] 文件由操作系统管理，在磁盘上不连续存放 只有当磁盘已经被其他文件占满或磁盘因故无法访问的时候才会出现改变文件大小失败的情形

user: user-0
content: 引用 1 楼 baichi4141 的回复:这样的做法会破坏磁盘的其他文件吗？ ——不会 文件指针会不会偏移到另一个文件内部，使得另一个文件截断了？？  ——不会  fseek仅仅只是改变了指针的值，没有改变文件的大小 fwrite读取指针值，发现现有文件大小不够大，改变文件大小并写入数据 写入的EOF是一个char型数据，任何数据都不可能截断一个文件——除非你分不清“函数从文件中读出的数据”和“函数读不到数据时的返回值” fseek偏移到1m的位置（此时文件大小没有改变），然后fwrite会先改变文件大小到1m（这个策略类似于内存malloc指定大小），如果发现无法做到（因为发现后面的磁盘空间被其他文件占用了），会返回失败，否则，改变文件大小，并写入EOF。 是这么个过程吗？

user: user-2
content: 这样的做法会破坏磁盘的其他文件吗？ ——不会 文件指针会不会偏移到另一个文件内部，使得另一个文件截断了？？  ——不会  fseek仅仅只是改变了指针的值，没有改变文件的大小 fwrite读取指针值，发现现有文件大小不够大，改变文件大小并写入数据 写入的EOF是一个char型数据，任何数据都不可能截断一个文件——除非你分不清“函数从文件中读出的数据”和“函数读不到数据时的返回值”

user: user-3
content: 感兴趣可以看Linux文件系统实现。

user: user-4
content: 如果你想知道就去看source code吧 我也不知道

user: user-1
content: 了解一下FAT、FAT32、NTFS等文件系统的工作原理吧。

user: user-5
content: 另外创建空文件，和其他文件操作，没有任何冲突。 一般文件系统，都不会对文件实行清零操作，所以非零大小的“空”文件，也不是没有内容的， 这就像分配内存但并不初始化一样，里面也是会有内容的。 只要有大小，其实都不算空文件，真正的空文件，是没有内容的,大小为零，可能不会占有空间。 大小为零的空文件，可能不会分配磁盘空间，只占有所在目录的一个目录项  Windows 由于兼容DOS的缘故，这个似乎处理的不好，一个文件可能会占有多个目录项---如果文件名比较长的话  如果占有空间的话，也只有文件结束标志是文件的真正内容。 这样的文件才算空文件，你的那个有2M左右的文件，只是没有写入有意义的内容，不能算做真正的空文件。 别的文件，也不会和他有什么冲突。  一个文件的文件名，文件位置是写在目录项的记录里面的，不是记录在文件内容里面的。

user: user-5
content: 在使用系统函数时，创建文件时，  没有办法做到，也没有必要做到“创建一个文件，分配给他连续的磁盘空间”。  除非自己写文件系统（驱动），自己处理文件的磁盘空间分配方案。

user: user-2
content: 引用 4 楼 qyxqyxqyx 的回复:一个1m的文件在磁盘上可能是这儿有50k，那儿有100k,等等一片片的？就跟链表似的，这个意思？ 这在哪儿有介绍？ NT的稀疏文件怎么做到在某个指定文件指针位置存放数据，而只有一小块大小，可以在磁盘某个位置往上下扩张？ http://baike.baidu.com/link?url=MsOAwy3-92GhQR1oMyfguH_SnbpE-hel2kEgaMpWR4TFlX6iE7cvHlwXWOeKLezc 在问NT怎么做到之前，你该先弄清楚NT能不能做到 文件本来就是操作系统层面的概念。要在磁盘的指定区域读写文件，就自己写磁盘驱动取代操作系统本身的磁盘驱动
user-0 提问: C的静态函数问题

回复:
user: user-1
content: static declaration of 'abs' follows non-static declaration

user: user-2
content: 函数声明的时候没加static吧？

user: user-3
content: 不懂帮顶。。。。

user: user-4
content: 有种可能是你这个静态函数被声明为外部文件可访问。 就会报这个错误。

user: user-2
content: 可以检查一下前面包含的头文件里面有没有哪个声明了非静态的abs函数。。

user: user-5
content: 引用 11 楼 bluebai123 的回复:[quote=引用 7 楼 derekrose 的回复:] 发函数声明来看  #include "windows.h" #include "wintern.h" #include "device.h" #include <stdio.h> #include <stdlib.h> #include <string.h>  #if !(DOS_TURBOC | DOS_QUICKC | _MINIX | VXWORKS)   static int abs(int n) { 	return n >= 0? n: -n; } #endif  /*  * Update mouse status and issue events on it if necessary.  * This function doesn't block, but is normally only called when  * there is known to be some data waiting to be read from the mouse.  */[/quote]  show me the declaration

user: user-0
content: 引用 7 楼 derekrose 的回复:发函数声明来看  #include "windows.h" #include "wintern.h" #include "device.h" #include <stdio.h> #include <stdlib.h> #include <string.h>  #if !(DOS_TURBOC | DOS_QUICKC | _MINIX | VXWORKS)   static int abs(int n) { 	return n >= 0? n: -n; } #endif  /*  * Update mouse status and issue events on it if necessary.  * This function doesn't block, but is normally only called when  * there is known to be some data waiting to be read from the mouse.  */

user: user-0
content: 引用 3 楼 bijiaoben 的回复:函数声明的时候没加static吧？ 有呢吧，你看 static int abs()，我想着估计是gcc问题吧，

user: user-0
content: 引用 1 楼 focuslight 的回复:有种可能是你这个静态函数被声明为外部文件可访问。 就会报这个错误。 可能吧，我在做micro Windows，编译第一个问题 就是这个，不行的话就直接把static 干掉，外部能访问就叫它能访问吧~ 多谢啦·

user: user-6
content: 包含了定义 求绝对值函数 abs 的文件（可能也连接了对应的库） 实际上你的abs函数已经定义了，该定义或者他的原型声明 是个non-static declaration  你现在又定义一个新的 abs函数，这个新的定义是个static declaration  所以 static declaration of 'abs' follows non-static declaration  PS： C语言所有定义，都是声明。 声明未必是定义。

user: user-5
content: 发函数声明来看

user: user-7
content: 前面已经定义了另一个abs函数？

user: user-8
content: 单纯这段代码是没有问题的，估计是你在其它文件有去调用abs函数。  引用 楼主 bluebai123 的回复:编译器 i386-rtems4.9-gcc 代码： static int abs(int n) { 	return n >= 0? n: -n; } 问题： error: static declaration of 'abs' follows non-static declaration  请问这个问题怎么解决呢 多谢啦
user-0 提问: 求助：~编写程序统计c源中标识符的个数

回复:
user: user-1
content: 一个简单的词法分析, 或者更直接用正则表达式都可以.

user: user-2
content: 参考TinyC的词法解析部分。  引用 楼主 u013022580 的回复:如题。 谢谢大家了~~
user-0 提问: 【求解释】关于scanf和getchar的区别！ 

回复:
user: user-1
content: 你自己不是查到回车符会残留在缓冲区中。  scanf()以Space、Enter、Tab结束一次输入，不会舍弃最后的回车符（即回车符会残留在缓冲区中）；    the function will read and ignore any whitespace characters encountered before the next non-whitespace character (whitespace characters include spaces, newline and tab characters -- see isspace). 忽略回车空格tab， 所以你要两个getchar. 一个读回车， 第二个等结束输入

user: user-2
content: 引用 2 楼 jmuguy 的回复:不是说scanf()读取字符串的时候缓冲区中的'\n'不会残留在缓冲区中吗？  读取字符时：  scanf()以Space、Enter、Tab结束一次输入，不会舍弃最后的回车符（即回车符会残留在缓冲区中）；  getchar()以Enter结束输入，也不会舍弃最后的回车符；  你自己看错了，仔细看看

user: user-0
content: 不是说scanf()读取字符串的时候缓冲区中的'\n'不会残留在缓冲区中吗？

user: user-3
content: scanf()以Space、Enter、Tab结束一次输入，不会舍弃最后的回车符（即回车符会残留在缓冲区中）； 第一个getchar();读取了缓冲区中的'\n' 第二个getchar();等待你输入字符

user: user-4
content: 这个和scanf还是getchar没关系，你所有的输入，都会在流／stream中，包括回车；回车之所以特殊，是因为流一般是“行缓冲”的，即只有你敲回车之后，才会把缓冲中的输入，放入流中。

user: user-0
content: 我不明白的地方是为什么以下代码运行后的结果都是一样的，getchar为啥可以少输入一次？

user: user-0
content: 那为什么这段代码只要两个getchar就可以了？按照道理应该要有三个getchar啊 // 5.1Tallback.cpp : 可以提供一些信息的对话程序 //  #include "stdafx.h" #include <string.h> #define DENSITY 62.4   int _tmain(int argc, _TCHAR* argv[]) { 	float weight,volume; 	int size,letters; 	char name[40];  	printf("Hi!What's your first name?\n"); 	scanf("%s",name); 	printf("%s,what's your weight in pounds?\n",name); 	scanf("%f",&weight); 	size=sizeof name; 	letters=strlen(name); 	volume=weight/DENSITY; 	printf("Well,%s,your volume is %2.2f cubic feet.\n", 		name,volume); 	printf("Also,your first name has %d letters,\n",letters); 	printf("and we have %d bytes to store it in.\n",size); 	getchar(); 	getchar(); 	return 0; }

user: user-5
content: 在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。
user-0 提问: HPUNIX如何编译OCI的C程序，需要带哪些参数？

回复:
user: user-0
content: 看来问题无法解决了！

user: user-0
content: 操作系统是64位，只是连接的时候OCCI是用-locci这个参数，连接OCI的时候改为-locijdbc10这个参数，编译才能通过。 所以想确定是不是链接的时候参数不对导致的

user: user-0
content: 难道用HP服务器的公司很少吗！有没有大侠知道啊！

user: user-1
content: 没有HPUNIX环境，帮你顶一下！  引用 1 楼 zhan_horse 的回复:操作系统是64位，只是连接的时候OCCI是用-locci这个参数，连接OCI的时候改为-locijdbc10这个参数，编译才能通过。 所以想确定是不是链接的时候参数不对导致的
user-0 提问: 提问？

回复:
user: user-1
content: 引用 2 楼 chenlianghx 的回复:我局部变量t没有去掉，已经解决了，谢谢 还是得注意 1楼说的问题，

user: user-0
content: 我局部变量t没有去掉，已经解决了，谢谢

user: user-2
content: 避免对浮点数使用<等操作
user-0 提问: c语言LRU页面置换算法

回复:
user: user-0
content: 都是我，这是操作系统作业

user: user-1
content: LZ这是干嘛？ yaosanfeng ysfzxc ysf1466123304 已经三个帐号了，而且一样的至少三个问题。
user-0 提问: C 字符串指针和数组问题。

回复:
user: user-0
content: 谢谢 楼上的两位

user: user-1
content: 因为当使用char *p=“abcd”,也就是字符指针变量的来表示字符串数据的时候，这个字符串数据是常量，而strtok试图修改这一常量，所以非法了。 字符指针本质上是首先在存储器中存放一个字符串常量，然后将首地址赋给p

user: user-2
content: strtok函数会修改第一个参数。 以下是strtok函数的描述: Avoid using these functions.  If you do use them, note that:                These functions modify their first argument.                These functions cannot be used on constant strings.                The identity of the delimiting character is lost.                The strtok() function uses a static buffer while parsing, so it's not thread safe. Use strtok_r() if this matters to you.

user: user-3
content: char *p = "abcd aaa iii lll fdiaso       123";是指针常量，不允许被修改的。 请参考这里：http://stackoverflow.com/questions/13208828/strtok-segmentation-fault

user: user-0
content: 如果把char *p = "abcd aaa iii lll fdiaso       123"; 改成char p[]=  "abcd aaa iii lll fdiaso       123"; 就可以。

user: user-4
content: #pragma comment(linker,"/SECTION:.rdata,RW") //加这句可以让常量区可写，后果自负！

user: user-5
content: 引用 2 楼 wusuopuBUPT 的回复:char *p = "abcd aaa iii lll fdiaso       123";是指针常量，不允许被修改的。 请参考这里：http://stackoverflow.com/questions/13208828/strtok-segmentation-fault +1

user: user-6
content: C++试试 boost tokenizer