Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: C语言 vc++2010调试内存界面问题

回复:
user: user-1
content: 在IDE中打开你的这个.c/.cpp文件的时候，使用WinHex软件在整个内存中搜索“#include "stdafx.h"”

user: user-0
content: 记得有看到过C可以打印出这样的内容 0x000B43A8  00 00 06 00 66 00 65 00 # i c l u d e < s 0x000B43C8  04 00 69 00 79 00 75 00 t i o d . h > 0x000B43E8  74 00 79 00 61 00 62 00  我随便写的，就是像这样格式的，后面显示的是代码

user: user-1
content: 电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  对电脑而言没有乱码，只有二进制字节；对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

user: user-2
content: 引用 2 楼 ruying1389279 的回复:00 00 00 00 00 00 06 00 79 00 61 00 6e 00 76 00 61 00 72 00  ]2..i?..n?..........y.a.n.v.a.r. 0x000B43A8  00 00 06 00 66 00 65 00 76 00 72 00 61 00 6c 00 00 00 05 00 61 00 70 00 72 00 65 00 6c 00 00 00  ....f.e.v.r.a.l.....a.p.r.e.l... 0x000B43C8  04 00 69 00 79 00 75 00 6e 00 00 00 04 00 69 00 79 00 75 00 6c 00 00 00 08 00 73 00 65 00 6e 00  ..i.y.u.n.....i.y.u.l.....s.e.n. 0x000B43E8  74 00 79 00 61 00 62 00 72 00 00 00 07 00 6f 00 6b 00 74 00 79 00 61 00 62 00 72 00 00 00 06 00  t.y.a.b.r.....o.k.t.y.a.b.r.....  n.o.y.a.b.r.....d.e.k.a.b.r.....   ??..??..m{..??..jD..??..??..s{.. ....f.e.v.r.a.l.....a.p.r.e.l...   ..i.y.u.n.....i.y.u.l.....s.e.n.   t.y.a.b.r.....o.k.t.y.a.b.r..... 想知道这些是什么意思?代表的什么   n.o.y.a.b.r.....d.e.k.a.b.r.....  ??..??..m{..??..jD..??..??..s{.. 有的数据有文字意义, 有的本身就不是文字 如果你定义了char *p  "hello world ". 找到p的地址,是可以看到 hello 的world的,

user: user-0
content: 00 00 00 00 00 00 06 00 79 00 61 00 6e 00 76 00 61 00 72 00  ]2..i?..n?..........y.a.n.v.a.r. 0x000B43A8  00 00 06 00 66 00 65 00 76 00 72 00 61 00 6c 00 00 00 05 00 61 00 70 00 72 00 65 00 6c 00 00 00  ....f.e.v.r.a.l.....a.p.r.e.l... 0x000B43C8  04 00 69 00 79 00 75 00 6e 00 00 00 04 00 69 00 79 00 75 00 6c 00 00 00 08 00 73 00 65 00 6e 00  ..i.y.u.n.....i.y.u.l.....s.e.n. 0x000B43E8  74 00 79 00 61 00 62 00 72 00 00 00 07 00 6f 00 6b 00 74 00 79 00 61 00 62 00 72 00 00 00 06 00  t.y.a.b.r.....o.k.t.y.a.b.r.....  n.o.y.a.b.r.....d.e.k.a.b.r.....   ??..??..m{..??..jD..??..??..s{.. ....f.e.v.r.a.l.....a.p.r.e.l...   ..i.y.u.n.....i.y.u.l.....s.e.n.   t.y.a.b.r.....o.k.t.y.a.b.r..... 想知道这些是什么意思?代表的什么   n.o.y.a.b.r.....d.e.k.a.b.r.....  ??..??..m{..??..jD..??..??..s{..

user: user-2
content: 内存界面 右键可以选 ansi或者unicode显示  你说的显示代码的是不是反汇编? 设个断点,停住时, 按下alt+8
user-0 提问: C写文件与磁盘缓冲的疑问（小白求教育）

回复:
user: user-1
content: 你看到的文件是由fopen产生的，数据变化你要看文件大小

user: user-2
content: 楼上的楼上正解～

user: user-3
content: 那是底层的事情，你想多了  间隔 100ms 算间隔吗？不是你去感受到的间隔，100ms 多少条指令过去了？ 如果我写入一个文件下一条指令是读取怎么办？会出错吗？ 既然有缓冲，你看到文件在磁盘上，那么就一定在磁盘上吗？ 你通过系统看到 D 盘多了一个文件，那也可以是个缓存 所以你自己来设计缓存机制，也不可能是写入进缓存，读取跳过缓存，否则请解决上面那一堆的问题  总之你想多了，思路逻辑上就不对，如果你是硬件/驱动开发的工程师再深入考虑这些

user: user-4
content: 创建文件和写文件不是一回事！
user-0 提问: 问个malloc后指针使用的问题

回复:
user: user-1
content: 够大就直接用，不够大就 free/malloc 或者 realloc，不需要了就 free.

user: user-2
content: 是realloc

user: user-2
content: 空间分配给你就是你的了, 不需要free之后再分配.  彻底不需要时,再free  空间不够就, 重新申请一个大的, 把原来的数据拷贝过去, 在把原来的指针free, 使用新的指针. 或者用remalloc函数
user-0 提问: 测试c调用c++，但不知道怎么编译这段代码

回复:
user: user-0
content: 引用 3 楼 wangzuxi 的回复:g++ -Wall -g -c -o cppExample.o cppExample.cpp ar rcs cppExample.a cppExample.o gcc -Wall -g -o main main.c cppExample.a   不胜感激

user: user-1
content: g++ -Wall -g -c -o cppExample.o cppExample.cpp ar rcs cppExample.a cppExample.o gcc -Wall -g -o main main.c cppExample.a

user: user-0
content: linux上

user: user-2
content: 在linux上进行么？ 还是在windows上？windows上的话vs不就足以解决了么？ 同关注。
user-0 提问: 函数指针 的理解

回复:
user: user-1
content: 费那事！ __asm {   sub eax,eax  call eax }

user: user-2
content: ((void (*) ()) 0) (); 这涉及到至少两个方面的知识：类型转换、类型名。 最直观地，它是一个函数调用，因为最右边是一对括号(/* …… */) () 其次，里面是一个强制类型转换，操作数是0-------(/* …… */) 0 再次，因为涉及到类型转换，所以，0左边的括号内部一定是个类型名--------- (void (*) () 到这一步，就很清楚了，它是一个指针，指向返回void类型的函数。 我的意思是再改一改： ((void (*) ()) 0) (); (* (void (*) ()) 0) (); ((void (*) (void)) 0) (); (* (void (*) (void)) 0) ();

user: user-3
content: 定义一个函数指针,指向0地址, 应该算是一个复位函数,即PC指针指向0地址.
user-0 提问: C语言 对用户输入的任意数组进行冒泡排序

回复:
user: user-1
content: malloc 动态开辟 free释放

user: user-2
content: 1、题中应该会给一个上限，比如说(n<10) 2、那么就定义一个长度为10的数组，然后再输入用户想要的数组长度，当然此时n<10，（可以对用户输入进行限制） 3、之后就是依次输入数据，再冒泡排序，输出

user: user-3
content: 动态内存分配malloc,free

user: user-4
content: 两个方法，一个申请足够大的数组，然后自己跟据输入来定义长度（不推荐，但是现在适合你） 第二种：动态申请空间，输入一个申请一个，最后别忘了释放掉然后使指针归0（你好像还没学）

user: user-5
content: 或者你预先定义一个足够大的数组，并记录你实际输入的个数，排序时按照这个大小进行排序，  选定一个特殊字符，遇到时 break 就好了

user: user-6
content: 换个方式，先输入长度，再输入数据

user: user-7
content: while((scanf("%d", &size) != 1) {     ...     array = (int *)malloc(sizeof(int) * size);     ... }

user: user-0
content: 好吧

user: user-8
content: malloc,realloc,free

user: user-9
content: 这个书本上有例子吧？ 照着例子来就好了。 至于数组大小的问题，后面学到了动态分配内存后再考虑。一步一步走，不要走还不会就想跑。
user-0 提问: 想顺利过计算机二级的童鞋请点这里哦！

回复:
user: user-1
content: 考了n遍还是没有过，真是日了狗了！

user: user-0
content: 引用 56 楼 fanlvlgh 的回复:正在热血复习中...  加油，希望你可以考出好成绩，另外祝你新年快乐。

user: user-2
content: 正在热血复习中...

user: user-3
content: 我考一次就过了，没报过培训班，只看过教材，而且很少看。

user: user-4
content: 努力考级中

user: user-5
content: 什么鸟，没事多找大神问一问，谦虚一点，什么考不过

user: user-6

user: user-7
content: 大学本科如果是学习计算机，毕业之后就应该是4级了。是计算机专业的还需要考这些课程？

user: user-0
content: 引用 40 楼 Sandrer 的回复:说句实在话，我工作了10年了 毕业证是化学专业，其它啥证都没有 刚毕业出来花了400块，做了一个计算机专业的毕业证、四级计算机证、二级英语证 大公司都不管学历只关经验，所以有啥证都无所谓； 小公司需要学历，你把证件交给他们，反正他们也不会去查还是无所谓 这年头在国内啥都要证，但真正用到的就永远只有那么几个 所以其它无伤大雅的就随随便便可以啦   说得有道理，谢谢分享。

user: user-0
content: 引用 38 楼 jsjxieyang 的回复:原来我一直是无证上岗呢

user: user-0
content: 引用 23 楼 stable000 的回复:这么多搞IT的连二级都过不了？瞬间觉得自己竞争力很强

user: user-8
content: 考C的话 你们就买本 c primer plus 这本书不要太经典

user: user-9

user: user-10
content: http://nianjian.xiaze.com/tags.php?/%E5%90%89%E6%9E%97%E7%A4%BE%E4%BC%9A%E7%BB%8F%E6%B5%8E%E7%BB%9F%E8%AE%A1%E5%B9%B4%E9%89%B4/1/13423640268/ 我只是来拿个注册码，不要打我

user: user-11
content: 第一次考不过再报名考一次，直至通过为止。

user: user-12
content: 还没开始考，会不会很难呀

user: user-13
content: 努力在考级中

user: user-14
content: 说句实在话，我工作了10年了 毕业证是化学专业，其它啥证都没有 刚毕业出来花了400块，做了一个计算机专业的毕业证、四级计算机证、二级英语证 大公司都不管学历只关经验，所以有啥证都无所谓； 小公司需要学历，你把证件交给他们，反正他们也不会去查还是无所谓 这年头在国内啥都要证，但真正用到的就永远只有那么几个 所以其它无伤大雅的就随随便便可以啦

user: user-15
content: 我汗 二级这么简单的东西……我不是来秀优越的←_←

user: user-16
content: 原来我一直是无证上岗呢
user-0 提问: 返回值

回复:
user: user-1
content: 运气好。

user: user-0
content: 为什么没有指定返回值，下面可以正确使用上面的指针

user: user-2
content: 引用 7 楼 CharlesSimonyi 的回复:C++编译器是不会允许这种编译通过的。C语言编译器报出一个warning C4716仍然允许编译通过。 最后输出了正确的结果，是因为巧合。 你把代码写成这样：  #include <stdio.h> #include <stdlib.h>  typedef struct Node { 	int name; 	int *age; }Node;  Node* foo() { 	int n = 10; 	int *pn = &n; 	Node *p = malloc(sizeof(Node)); 	printf("%p\n", p); 	p->age = 0; 	p->name = 0; 	*pn = 50; 	//return p; }  void main() { 	printf("main----%p\n", foo()); }  就无法输出一致的结果了。 至于为什么，查看反汇编代码就明白了，函数的返回值是保存在eax寄存器里。 有return p;的情况下，反汇编代码是这样的：  return p;的作用是把指针p指向的地址保存到eax寄存器里。 foo()函数返回后，foo()的调用者从eax寄存器中取值，即取到了foo()函数的返回值。  如果把return p;注释掉，反汇编代码是这样的：  很巧，p->name = 0;时，把p指针指向的地址放到了eax寄存器中，并且后来没有再修改eax寄存器了， 所以eax寄存器中一直保存着p指针的值，直到foo()函数返回时，仍然保存着， 所以foo()函数的调用者，取foo()函数的返回值，即取eax寄存器的值时，取到了正确的结果 同意楼上说法，是属于巧合的情况，指针指到其他的地方就不会有这种现象了，受教了！

user: user-3
content: C++编译器是不会允许这种编译通过的。C语言编译器报出一个warning C4716仍然允许编译通过。 最后输出了正确的结果，是因为巧合。 你把代码写成这样：  #include <stdio.h> #include <stdlib.h>  typedef struct Node { 	int name; 	int *age; }Node;  Node* foo() { 	int n = 10; 	int *pn = &n; 	Node *p = malloc(sizeof(Node)); 	printf("%p\n", p); 	p->age = 0; 	p->name = 0; 	*pn = 50; 	//return p; }  void main() { 	printf("main----%p\n", foo()); }  就无法输出一致的结果了。 至于为什么，查看反汇编代码就明白了，函数的返回值是保存在eax寄存器里。 有return p;的情况下，反汇编代码是这样的：  return p;的作用是把指针p指向的地址保存到eax寄存器里。 foo()函数返回后，foo()的调用者从eax寄存器中取值，即取到了foo()函数的返回值。  如果把return p;注释掉，反汇编代码是这样的：  很巧，p->name = 0;时，把p指针指向的地址放到了eax寄存器中，并且后来没有再修改eax寄存器了， 所以eax寄存器中一直保存着p指针的值，直到foo()函数返回时，仍然保存着， 所以foo()函数的调用者，取foo()函数的返回值，即取eax寄存器的值时，取到了正确的结果

user: user-4
content: 一般返回值是放到某些寄存器里面，这里那个寄存器刚好存的是那个指针，所以……。

user: user-5
content: 返回值通常保存在eax寄存器中。  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  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对应的汇编并单步执行观察相应内存和寄存器变化。）

user: user-0
content: 不是编译器问题，我用vs2013和ubuntu都试过了，一个情况，但是如果注释掉上面那个初始化的话就是野指针了。

user: user-3
content: 编译器问题，我这里VisualStudio2010如果注释掉return p;是无法编译通过的
user-0 提问: icmpv6 NS

回复:
user: user-0
content: 二层 三层信息是这样的！！！！！！ 上面写错了。。   /* 发送端:   IP:  2001:da8:b001::1       MAC:      33:33:FF:00:00:02  接收端:  IP:   2001:da8:b001::2       MAC:     00:0C:29:5E:2E:24  */
user-0 提问: 已知ISA地址port与DATA port,怎样输出读取的值?

回复:
user: user-0
content: zhao4zhong1  赵4老师 : 我是为了获取CPU风扇转速的,所要读的数据在SUPERIO(ITE8277F)的0DH寄存器中(8bit),(地址port 0XA35，数据port 0xA36),WINIO中使用GetPortVal(),要怎么用?直接是GetPortVal(0xA35,value,1)吗?

user: user-1
content: 搜“WinIO.SYS”

user: user-0
content: 补充一下,我是要在windows下读取.WINDOWS 7 谢谢了!
user-0 提问: 在树中找到一个特定节点问题？？？大神们进

回复:
user: user-0
content: 引用 2 楼 lincolnandlinda 的回复:是不是两叉树?是多叉树，也是自学好多不懂

user: user-0
content: 是多叉树，也是自学好逗不懂

user: user-1
content: 是不是两叉树?

user: user-2
content: return find(child) || find(next) , 不要再递归prev了
user-0 提问: C语言error link2001

回复:
user: user-1
content: 函数前面没有类的名字        类名：：delay200ms（）{}

user: user-2
content: 看有帮助没——http://blog.csdn.net/CHUKAIHUA/article/details/5543140

user: user-3
content: 你是怎么调用这个函数的？
user-0 提问: C入门问题，求大神解答！！！

回复:
user: user-1
content: ％前面的空格，在输入可以忽略前面的所有空白符（空格，制表符，吃掉回车）

user: user-2
content: 吃掉回车的作用吧

user: user-0
content: 搜嘎，感谢各位 了

user: user-3
content: codeblocks10.05，如果去掉空格，的确会直接请求输入 应该是消除上面的回车  上面输入数据后，缓冲区还有回车符，下面的scanf字符就会读取这个回车，所以用空格消除

user: user-4
content: 没用过pelles c, 不过，如果确实是这情况，应该就是楼上说的吃掉上一次输入的回车。百度一下吧，scanf的输入缓冲

user: user-0
content: 吃掉输入的回车是什么意思？  还有我用的环境是pelles c

user: user-5
content: 没有影响吧？ 那个完全是正常的，而且我也运行了下你的程序，去掉空格正常运行 看截图  环境  Dev c++

user: user-6
content: 吃掉输入的回车。
user-0 提问: C语言I/O编程中一个小问题

回复:
user: user-1
content: EOF是int型。

user: user-2
content: char型，int型，double型都是浮云，所有数据在计算机中都是以二进制的形式表示的。char,int,double是便于我们人类理解。

user: user-3
content: 如果将ch声明为char型，就无法区别 文件中读出字符'\xff'，即char型的-1 和 已到文件末尾，无法读出任何字符，返回-1 了。

user: user-4
content: 函数返回值是int型
user-0 提问: 大家学习C和C++都使用什么编译器

回复:
user: user-1
content: 引用 3 楼 u010016404 的回复:windows上用VS，Linux上用GCC。 +10086

user: user-2
content: IDE集成 GCC

user: user-3
content: C语言编译器：gcc,ucc,tcc,pcc

user: user-4
content: linux GCC/g++

user: user-5
content: vc++,gc++

user: user-6
content: gcc 不习惯在windows上编程

user: user-7
content: VS2010，值得你选择

user: user-8
content: win+cygwin+gcc+netbeans

user: user-9
content: windows上用Visual Studio在装上VA插件就好了，如果学的是MFC用VC 6.0比较好，不是的话用VS 2008及之前的版本就可以，感觉VS 2010之后的版本就比较慢了 另外说一句，最好不要用VS，因为用了之后再用其他的就感觉很渣了

user: user-10
content: GCC......

user: user-11
content: 用的VS。  不过你学习能力强的话，建议你用GCC，自己写makefile。VS替用户做了很多事。

user: user-12
content: 目前刚开始学，用codeblock 主要是vs太大了，小水管不知道要下到什么时候...

user: user-13
content: gcc+sublime text 或vim  Mac 下 gcc+TextMate

user: user-14
content: VS 2013.手残就用这个。

user: user-15
content: 学校用的Cfree和vc++6.0，自己用的，vs2013

user: user-16
content: 主要看泥选择的平台啊

user: user-17
content: 我用的是vs

user: user-18
content: Linux     gcc

user: user-19
content: 引用 3 楼 u010016404 的回复:windows上用VS，Linux上用GCC。 +1

user: user-20
content: 如果将来想做嵌入式、移动开发或者Linux平台建议用gcc。 如果将来想做桌面开发从VS入手是不错的选择。
user-0 提问: VS2013编译驱动提示

回复:
user: user-1
content: 向darknightghost学习！

user: user-2
content: 引用 6 楼 qq_16319743 的回复:[quote=引用 1 楼 zhao4zhong1 的回复:] 驱动不能在VS IDE中调试吧。  只是想编译成SYS文件 然后放到虚拟机调试  并不想让SYS在主机上运行[/quote] 我在楼上已经告诉你怎么弄了,百度上搜"vs2012配置双机调试"很多教程的 给你一篇我搜到的http://blog.sina.com.cn/s/blog_79ba23780101qx4y.html vs2012和vs2013配置方法完全相同

user: user-2
content: 右键项目->属性->调试->要启动的调试器里选Debugging Tools for Windows - Kernel Debugger 然后Remote Computer Name里选Configure 接下来如果你英文不是烂到家了的话就是傻瓜化操作, 调试时点绿色三角号旁边的小三角号,选Debugging Tools for Windows - Kernel Debugger 再点击I Know..........那个选项,至于虚拟机的配置网上到处都有 配置好虚拟机,开机,拷过去运行,接着调试 操作和调试用户层程序差不多 注意断点必须要让调试暂停一下才能生效  vs2012以后的版本调试驱动都很方便的,就是内存不够会卡

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:驱动不能在VS IDE中调试吧。  只是想编译成SYS文件 然后放到虚拟机调试  并不想让SYS在主机上运行

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:驱动不能在VS IDE中调试吧。  请问下啊  我按照网上教程配置的VS能编译出

user: user-0
content: 引用 2 楼 darknightghost 的回复:sys不能直接运行,要以服务的形式加载. 而且我想问一句,兄弟你在作死么?敢在本机调试驱动. 驱动要在另外一台电脑或虚拟机里调试,建议百度一下vs2013怎么双机调试驱动. 你要知道驱动是在系统核心运行的,一旦有bug,蓝屏是最好的情况,更严重的可能损坏硬盘数据,甚至看到电脑冒出袅袅青烟都有可能.  谢谢提醒啊  我是想在本机上编译成xxxx.sys文件  然后在把xxxx.SYS复制到虚拟机里测试的

user: user-3
content: hal是系统的，要在本机调不怕麻烦在win7可能只能kdprint了，很久不写sys了，很怀念以前用softice的时代

user: user-2
content: sys不能直接运行,要以服务的形式加载. 而且我想问一句,兄弟你在作死么?敢在本机调试驱动. 驱动要在另外一台电脑或虚拟机里调试,建议百度一下vs2013怎么双机调试驱动. 你要知道驱动是在系统核心运行的,一旦有bug,蓝屏是最好的情况,更严重的可能损坏硬盘数据,甚至看到电脑冒出袅袅青烟都有可能.

user: user-1
content: 驱动不能在VS IDE中调试吧。
user-0 提问: for循环是不是必须正数？

回复:
user: user-1
content: 引用 12 楼 lin5161678 的回复:我不是楼主  你贴的图 语法是错的  比如  for(;;) ; 这个for 语句是符合语法的  但是不符合你给出的这张图里面的说法 你给的图 for后面的只能跟 复合语句  而for 的语句是 for 后面可以写任何语句 复合语句仅仅是 其中一种   后面的说明中  由0个或多个逗号分开的增量语句  这个说法也是错的  那只是表达式 不能是语句 你不可以写 for(;; ++i;) ; 而++i; 才是你所谓的 增量语句  ++i 只是表达式  基础概念混乱 是错了，没细心看 这个的确有问题

user: user-2
content: for中第二句条件不满足，不会执行下面的*计算。

user: user-3
content: 引用 5 楼 u012421456 的回复:楼主认为哪里说错了我不是楼主  你贴的图 语法是错的  比如  for(;;) ; 这个for 语句是符合语法的  但是不符合你给出的这张图里面的说法 你给的图 for后面的只能跟 复合语句  而for 的语句是 for 后面可以写任何语句 复合语句仅仅是 其中一种   后面的说明中  由0个或多个逗号分开的增量语句  这个说法也是错的  那只是表达式 不能是语句 你不可以写 for(;; ++i;) ; 而++i; 才是你所谓的 增量语句  ++i 只是表达式  基础概念混乱

user: user-4
content: 这样才可以啊。 for(i=-3; i<0; i++)

user: user-5
content: 引用 8 楼 xiaopao319 的回复:[quote=引用 楼主 I_better 的回复:] 例： int i,m=1; for(i=-3;i>0;i++)  m=m*i;  此时就不执行循环了，直接m=1 问题在哪？  测试条件不成立，直接没有循环，什么都没有做，m就自然等于1了[/quote]       已验证，确实如此哦！

user: user-6
content: 引用 楼主 I_better 的回复:例： int i,m=1; for(i=-3;i>0;i++)  m=m*i;  此时就不执行循环了，直接m=1 问题在哪？  测试条件不成立，直接没有循环，什么都没有做，m就自然等于1了

user: user-7
content: for (A;B;C) D; //等价于 {  A;  while (1) {   if (!(B)) break;   D;   C;  } }

user: user-1
content: 引用 2 楼 lin5161678 的回复:-3 > 0  不成立 直接退出循环  请问 这有什么不对吗 楼主所说的"问题在哪" 你这不是知道吗

user: user-1
content: 引用 2 楼 lin5161678 的回复:-3 > 0  不成立 直接退出循环  请问 这有什么不对吗 没什么不对啊！ 这张图也没说这不对啊  引用里面的说法是错的 for语句的语法不是这样的 楼主认为哪里说错了

user: user-8
content: 1.可以为负数 2.首先i=-3，然后i>0吗？NO，所以不循环

user: user-3
content: 引用 1 楼 u012421456 的回复: 你贴的图 里面的说法是错的 for语句的语法不是这样的

user: user-3
content: -3 > 0  不成立 直接退出循环  请问 这有什么不对吗

user: user-1
user-0 提问: 请问输出结果是什么？(printf("%d,%d",*(a+1),*(ptr-1));)

回复:
user: user-1
content: 一般我个人不推荐这么用

user: user-1
content: 2，5 C语言指针与数组名

user: user-2
content: 2和5 ，a+1 是数组的首地址加一，就相当于，加一，*（a+1）=2，而&a+1是整个数组地址加一，ptr指针会指到元素5的后面故*（ptr-1）=5啦！

user: user-3
content: 我机器上输出2，5   感觉你的*ptr=(int *)(&a + 1);中，&a是地址的地址，然后又强制转换成int*，为啥要这么用呢？纯粹为了玩地址啊？
user-0 提问: matlab中如何找到数组中某个数值的索引的问题

回复:
user: user-1
content: MATLAB貌似以前会一点

user: user-2
content: 我作图像处理的仿真时也遇到过这种问题，比如要找到图像中满足某个条件的位置，再对这些位置的像素拿出来处理 但有时矩阵中有时没有这样条件的点，像这样：  clc; clear all; close all; a=[1.5,2.3,3;4,5,6;7,8,9]; [x,y]=find(a>10); a(x,y)=a(x,y)+100;
user-0 提问: C语言/判断一个数是否为素数

回复:
user: user-1
content: #include <stdio.h>  int main(void) {         int i   = 0;         int n   = 0;         printf("请输入一个数:");         scanf("%d",&n);         for(i=2; i<n; i++){                 if(n%i==0){                         printf("您输入的%d不是素数\n",n);                         break;                 }else{                         printf("您输入的%d是素数\n",n);                         break;                 }         }         return 0; }

user: user-2
content: sqrt(n)

user: user-3
content: 引用 5 楼 sbvsa 的回复: #include"stdafx.h" #include<stdio.h> #include<math.h> int main(void){     int i,n;      printf("请输入一个数:");     scanf("%d",&n);     printf("\n");      for(i=2;i<=sqrt(n);i++)         if(n%i==0){             printf("您输入的%d不是素数\n",n);             break;         }      if(i>k)         printf("你输入的%d是素数\n",n);      return 0; }    这里 if (i>k)  的 K是什么变量啊，我看不懂，难道是个特殊的值吗 我是新手

user: user-4
content: 引用 5 楼 sbvsa 的回复: #include"stdafx.h" #include<stdio.h> #include<math.h> int main(void){     int i,n;      printf("请输入一个数:");     scanf("%d",&n);     printf("\n");      for(i=2;i<=sqrt(n);i++)         if(n%i==0){             printf("您输入的%d不是素数\n",n);             break;         }      if(i>k)         printf("你输入的%d是素数\n",n);      return 0; }  这个是不是还要处理一下输入1的情况，1不是素数也不是合数

user: user-5
content: 另外，注意下代码格式 改用花括号的就用花括号括起来

user: user-6
content: C语言基础要稳扎稳打

user: user-7
content: 不好意思没修改变量k 请把k改成sqrt(n)

user: user-7
content: #include"stdafx.h" #include<stdio.h> #include<math.h> int main(void){     int i,n;      printf("请输入一个数:");     scanf("%d",&n);     printf("\n");      for(i=2;i<=sqrt(n);i++)         if(n%i==0){             printf("您输入的%d不是素数\n",n);             break;         }      if(i>k)         printf("你输入的%d是素数\n",n);      return 0; }

user: user-8
content: 引用 3 楼 FUHAODAASD 的回复:2楼那样字改你输入1还是素数，但是你不是素数啊 你说的对

user: user-9
content: 引用 1 楼 layershow 的回复:错误还真是不少 if(n%i==0)printf("您输入的%d不是素数\n",n);break; else printf("您输入的%d是素数\n",n);  不要在循环里打印，用个变量 if 要用大括号 int flag = 0;  for (...) { if (n%i == 0) {     flag = 1;     break; } }  if (flag) {     printf("您输入的%d不是素数\n",n); } else {     printf("您输入的%d是素数\n",n); }  2楼那样字改你输入1还是素数，但是你不是素数啊

user: user-10
content: Finding prime numbers - Kenneth Haugland Different schemas for finding prime numbers explained with code http://www.codeproject.com/Articles/429694/Finding-prime-numbers

user: user-8
content: 错误还真是不少 if(n%i==0)printf("您输入的%d不是素数\n",n);break; else printf("您输入的%d是素数\n",n);  不要在循环里打印，用个变量 if 要用大括号 int flag = 0;  for (...) { if (n%i == 0) {     flag = 1;     break; } }  if (flag) {     printf("您输入的%d不是素数\n",n); } else {     printf("您输入的%d是素数\n",n); }
user-0 提问: 关于指针赋值的问题，求大神

回复:
user: user-1
content: gets()是需要内存空间的，如果不赋值的话，p是个野指针，而且并没有内存空间，运行报错的吧

user: user-2
content: 第二个程序把gets(p)写到P=str上面 那么P是没有初始化的指针，它的指向我们并不知道，所以调用gets()就会段错误。  程序是一步一步往下执行的

user: user-0
content: 我失误了下 其实gets(p)和下面一行的顺比掉换也一样不影响结果

user: user-3
content: p = str ， 那么p 就是str， 一样的访问。

user: user-3
content: 首先2个程序都是正确的，第一个程序是先给P所指的对向赋值（使用前先赋值），而第二个程序我把gets(p)写到P=str上面运算结果就不对了，我想知道为什么指针指向整形数据是先赋值，指向数组怎么就后赋值了呢  写的没错啊， 不存在先赋值后赋值的问题。

user: user-4
content: 因为第一个 scanf 操作的是 a 和 b  不是 p1 p2 第二个gets 操作的是 p ，如果gets 操作的是 str 那也是没问题的
user-0 提问: 新手C语言编程遇到问题求助

回复:
user: user-1
content: 文本存储数字存储的其实是数字字符，当然也可以用二进制格式存储，不过我猜你应该用的是字符的格式

user: user-0
content: 引用 4 楼 Data_Flow 的回复:1.你用的文件应该是文本文件吧，里面存储的是字符。用fread读取的数据也是字符，是不会转化成浮点数的，方差的输出注定是错的。 2.我觉得问题在remind函数，当文件指针是stdin的时候我不知道能不能用remind。这只是我的初步想法，不知道对不对。  等我调试下，我再来哈，一起探讨～ fread（）函数不能打开文本文件里存储的数字吗

user: user-1
content: 还有你要用fread，打开文本应该用二进制模式打开。

user: user-1
content: 1.你用的文件应该是文本文件吧，里面存储的是字符。用fread读取的数据也是字符，是不会转化成浮点数的，方差的输出注定是错的。 2.我觉得问题在remind函数，当文件指针是stdin的时候我不知道能不能用remind。这只是我的初步想法，不知道对不对。  等我调试下，我再来哈，一起探讨～

user: user-2
content: 比如用WinHex软件查看一个号称里面保存了一个double小数0.5的文件, 如果你看到的是30 2E 35，那么你应该用f=fopen(...,"r");fscanf(f,"%lf",&d);fclose(f); 如果你看到的是00 00 00 00 00 00 E0 3F，那么你应该用f=fopen(...,"rb");fread(&d,8,1,f);fclose(f);

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

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

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

user: user-2
content: #include <stdio.h> #include <malloc.h>   //单链表类型定义 typedef struct  LNode {     int data;     struct LNode *next; }LinkList;     //Function 1:头插法建立单链表 void CreateLinkList(LinkList **L,int n,int *a)  //这里应该传址 {     LinkList *s; 	int i;      *L=(LinkList*)malloc(sizeof(LinkList));        //建立头结点     (*L)->next=NULL;       for (i=0;i<n;i++)        //这样才不会越界     {         s=(LinkList*)malloc(sizeof(LinkList));           s->data=a[i];         s->next=(*L)->next;         (*L)->next=s;     }       }// End Of Function CreateLinkList()     //Function 2：输出链表 void DisplayLinkList(LinkList *L) {     while(L->next!=NULL)     {         printf("%d    ",L->next->data);  //头节点并没有存储数据，所以从第一个节点开始输出 		L=L->next;     } 	putchar(10);   }//End Of Function DisplayLinkList()   int main() {     LinkList *L;     int a[9],i,n;     n=9;       for (i=0;i<n;i++)     {         a[i]=i;         printf("%d    ",a[i]);     }           printf("\n*************************通过数组建立链表***********************\n\n");         CreateLinkList(&L,n,a);  //传址     DisplayLinkList(L);           return 0; }

user: user-3
content: 头结点不要输出   void DisplayLinkList(LinkList *L) {     LinkList *d=L->next;     while(d)     {         printf("%d    ",d->data);         d=d->next;     }  }//End Of Function DisplayLinkList()   数组a[9]下标最大为8，里面的<=改成<

user: user-4
content: 另外楼主的输出也写错了  判断条件如果是L->next!=NULL的话，是不会输出最后一个链表的

user: user-4
content: #include <stdio.h> #include <malloc.h>  //单链表类型定义 typedef struct  LNode { 	int data; 	struct LNode *next; }LinkList;  //Function 1:头插法建立单链表 void CreateLinkList(LinkList **L, int n, int *a) { 	LinkList *s,*s1;  	s = (LinkList*)malloc(sizeof(LinkList));        //建立头结点 	s->next = NULL; 	*L = s;//将L指向头结点 	s1 = s; 	s->data = a[0];  	for (int i = 1; i < n ; i++)//是<n 	{ 		s = (LinkList*)malloc(sizeof(LinkList)); 		s->data = a[i]; 		s1->next = s; 		s1 = s; 	} 	s->next = NULL;//尾结点的next指向NULL }// End Of Function CreateLinkList()   //Function 2：输出链表 void DisplayLinkList(LinkList *L,int n) { 	for (int i=0; i < n;i++) 	{ 		printf("%d    ", L->data); 		L = L->next; 	}  }//End Of Function DisplayLinkList()  int main() { 	LinkList *L = NULL; 	int a[9], i, n = 9; 	for (i = 0; i < n; i++) 	{ 		a[i] = i; 		printf("%d    ", a[i]); 	} 	printf("\n*************************通过数组建立链表***********************\n\n"); 	CreateLinkList(&L, n, a); 	DisplayLinkList(L,n); 	return 0; }   感觉楼主的连接方式好奇怪。。。不过原码是即使把等号去掉也会报错吧，操作越界了，因为L的next虽然一直在变化，但是没有把s一个一个的连接。。。 我不知道头插法是不是我的代码的意思。。应该是需要两个临时变量才能把表链起来吧（如果不改变头结点的）  LinkList *s;是创建一个LinkList类型的指针 LinkList  s;是创建一个LinkList类型的结构体  至于我的代码显示的是0~8.这不是问题，只要在main里面把的a[i]=i，改为a[i]=i+1就好了，

user: user-5
content: 数组9个元素，a[0]到a[8]，你的两处for循环都访问了不存在的a[9]，应把 i<=n 改为 i<n LinkList  s; //创建一个LinkList结构体 LinkList *s; //创建一个指向LinkList结构体的指针
user-0 提问: C语言全局结构体数组，调试监视问题

回复:
user: user-1
content: 请问LZ用的是什么编译工具？怎么会有#include "stdafx.h"这一头文件？？ 下面是我在VS2010上调试的结果：

user: user-0
content: 没有的，程序单步调试完student stu都没有值，一只是显示的那样

user: user-0
content: 引用 5 楼 adusuccessfully 的回复:请问LZ用的是什么编译工具？怎么会有#include "stdafx.h"这一头文件？？ 下面是我在VS2010上调试的结果：   vc++2010学习版

user: user-2
content: student不是变量  stu也没有值吗?

user: user-0
content: 输入的for循环输入完，还是看不到，显示的还是那样子

user: user-3
content: 我看你调试的时候还执行的代码还停在main函数第一行，这个时候还没有对stu赋值啊， 你要按F10逐过程往下走，代码对stu赋了值，才能看到变化啊
user-0 提问: 关于加窗插值FFT计算中插值的问题

回复:
user: user-1
content: 你好，请问楼主是怎么做的呢？具体程序能贴出来吗？这在做这个有点疑问。谢谢

user: user-2
content: 引用 3 楼 blues_more 的回复:引用 1 楼 user-2 的回复:只要fft再ifft回来总共除了n就行，具体是fft时候除还是ifft时候除还是两边各除sqrt(n)这看需求。但是除以N之后，幅值变的很小很小啊，这显然是不对的，请问可以详细解释一下吗？ 怎么不对。本身频域就没有准确的定义，差一个常数完全不是问题，你根据你自己的需求找到一个合适的缩放就行。缩放值和n有关系是因为如果不调整常数直接做fft+ifft的话，效果是原信号加大n倍，所以为了让fft+ifft能变换回原来的信号，这回路上总共要除一个n，这就是1L的意思。

user: user-0
content: 引用 1 楼 user-2 的回复:只要fft再ifft回来总共除了n就行，具体是fft时候除还是ifft时候除还是两边各除sqrt(n)这看需求。但是除以N之后，幅值变的很小很小啊，这显然是不对的，请问可以详细解释一下吗？

user: user-0
content: 但是除以N之后，幅值变的很小很小啊，这显然是不对的，请问可以详细解释一下吗？

user: user-2
content: 只要fft再ifft回来总共除了n就行，具体是fft时候除还是ifft时候除还是两边各除sqrt(n)这看需求。
user-0 提问: C 中 CHAR  处理成 16进制时，自动补位了？

回复:
user: user-1
content: 你可以把char改成unsigned char试一下，那样0x80仍然是正的，就没有这个问题   #include <stdio.h> int main() {     char c1=0x80;     unsigned char c2=0x80;     printf("%02x\n", c1);     printf("%02x\n", c2);     return 0; }

user: user-2
content: %x 为  unsigned  int

user: user-1
content: recvbuf是char型的吧？ char是一个字节的，所以0x7F以上就是负数了 而%x是用来输出int的，所以你的char会被扩展到4字节，对于0x7F，扩展后是0x0000007F，前面的0可省略，所以仍然输出0x7F 对于0x80，扩展后就是0xFFFFFF80了，前面的F不能省略，所以会输出来 至于%02x里的02，是不足2位补到2位，但超过2位不会截断
user-0 提问: c primer plus 第九章练习题8

回复:
user: user-0
content: 引用 4 楼 xiaopao319 的回复:[quote=引用 3 楼 Data_Flow 的回复:] 请看楼上的楼上 还有当p小于0时你忘记加括号了 p-1要改成p+1 楼上解答完全正确！！！！！赞[/quote]  谢谢各位，我真是大傻逼。 。。。

user: user-0
content: 引用 1 楼 czarten 的回复:if (p = 0) if (p == 0)  谢谢你，，我真是大傻逼。。。

user: user-1
content: 引用 3 楼 Data_Flow 的回复:请看楼上的楼上 还有当p小于0时你忘记加括号了 p-1要改成p+1 楼上解答完全正确！！！！！赞

user: user-2
content: 请看楼上的楼上 还有当p小于0时你忘记加括号了 p-1要改成p+1

user: user-3
content: if (p = 0) if (p == 0)

user: user-4
content: 楼主请看楼上！
user-0 提问: 怎么理解从动态二维数组是真正的指针，而数组不是真正的指针这个问题？

回复:
user: user-0
content: 谢谢各位，我知道问题原因了，是我自己看错代码了。。。。我才发现，那个一维的地方是两次malloc。。所以offset不一定会是20，这下明白了，谢谢各位，结贴了

user: user-0
content: 引用 15 楼 u013585046 的回复:专业的做法是看符号名的属性！  静态数组名和指针变量名都是符号，它们可以有相同的值（如将数组名赋值给指针变量时），但符号的属性是不一样的，数组名是只读属性，指针变量则是可写的，所以不能将指针变量反向赋值给数组名！  有兴趣可以去分析可执行文件的格式，特别是符号表部分，对各种符号属性就会有更深的理解了。  这个好，谢谢

user: user-0
content: 引用 16 楼 zhao4zhong1 的回复:这辈子头次在此贴看到内存窗口按无符号10进制显示字节值（0..255），有一种打通任督二脉的奇怪感觉！  小弟第一次看这种东西，未免有些不懂。。所以就乱看了。。不过好像16进制也是这样的？所以我想知道我问的那个问题的答案

user: user-1
content: 引用 16 楼 zhao4zhong1 的回复:这辈子头次在此贴看到内存窗口按无符号10进制显示字节值（0..255），有一种打通任督二脉的奇怪感觉！ 哈哈，打通任督二脉

user: user-2
content: 专业的做法是看符号名的属性！  静态数组名和指针变量名都是符号，它们可以有相同的值（如将数组名赋值给指针变量时），但符号的属性是不一样的，数组名是只读属性，指针变量则是可写的，所以不能将指针变量反向赋值给数组名！  有兴趣可以去分析可执行文件的格式，特别是符号表部分，对各种符号属性就会有更深的理解了。

user: user-3
content: 这辈子头次在此贴看到内存窗口按无符号10进制显示字节值（0..255），有一种打通任督二脉的奇怪感觉！

user: user-0
content: 引用 13 楼 zhao4zhong1 的回复:严重怀疑楼主根本没看过内存窗口。 内存窗口和监视窗口不是一回事！  哦哦是，我一直误以为内存窗口就是监视窗口。。。  看了下，这两个区间好像是不连续的。。。可是为什么会这样呢？用malloc不是创建的是一片连续的区间吗？  前面那个一维的指针和二维的指针的指向不一样我可以理解。。因为malloc了两次，那么这个又是什么情况呢？

user: user-3
content: 严重怀疑楼主根本没看过内存窗口。 内存窗口和监视窗口不是一回事！

user: user-0
content: 引用 11 楼 zhao4zhong1 的回复:打开内存窗口看看不会吓死人的； 没有内存窗口有时是无法发现问题的。  关键是vs那个就是看的内存。。。。  我就是不懂喂什么offset一个是20，一个是80

user: user-3
content: 打开内存窗口看看不会吓死人的； 没有内存窗口有时是无法发现问题的。

user: user-3
content: 引用 3 楼 zhao4zhong1 的回复:VC调试时按Alt+6,打开内存窗口看动态二维数组和静态二维数组对应的内存不就啥都明白了吗。 正解！ 只看Watch窗口是不够的。

user: user-0
content: 那为什么如我4楼说的那个。。。  为什么offset会一个是20，一个是80...

user: user-4
content: 栈指针比较好看，看一下esp的值，跟这个差不多地址

user: user-5
content: 小弟也是在学习这方面知识，恳请大神指教，谢谢

user: user-0
content: 引用 5 楼 derekrose 的回复:你的命题首先就不准确  额，我本来是想问用动态创建的二维数组和静态的二维数组的区别的。。。发了贴就不能改了。。

user: user-6
content: 你的命题首先就不准确

user: user-0
content: const int rows = 2, cols = 5;  	int i, j, num = 0; 	int arr[2][5]; 	int **matrix = (int **)malloc(rows*sizeof(int *)); 	for (i = 0; i<rows; i++) 	{ 		matrix[i] = (int *)malloc(cols*sizeof(int)); 		for (j = 0; j<cols; j++) 			matrix[i][j] = arr[i][j] = ++num; 	}  那比如说这个吧，我是从论坛某个帖子复制的，看了下内存地址，静态二维数组的第一维相差20个offset（sizeof(int)*5），那为什么动态二维数组的offset不是20而是80呢？  再看了下首地址，动态二维数组的首地址不是matrix[0]的地址，而数组的首地址和matrix[0]一样，所以“指针的指针”是这个意思吗？

user: user-3
content: VC调试时按Alt+6,打开内存窗口看动态二维数组和静态二维数组对应的内存不就啥都明白了吗。

user: user-7
content: 指针可以赋值改地址 数组名不行 左值右值不要搞混了

user: user-8
content: 数组名不能被赋值
user-0 提问: 有关栈的问题

回复:
user: user-1
content: sqStack  s;  createstack(&s); 这是创建了一个结构体s，然后把它的地址交给createstack，createstack根据这个地址就能找到你创建的结构体s，并对其进行操作; sqStack  *s; createstack(s); 这个只是创建了一个指向结构体的指针，而没有创建结构体，createstack沿着这个指针找到的是一个不存在的结构体，并试图对其成员进行操作，当然会崩掉
user-0 提问: 新人C语言求助

回复:
user: user-0
content: 也就是说无论我输入什么，它都会自动转换成ASCii码值去计算谢谢大神指点

user: user-1
content: 数据类型问题。

user: user-2
content: 你用getchar，取的是字符，不是数字，ch的值应该是这个字符的ASCII码值，所以会有问题！
user-0 提问: AIX系统UNICODE转中文

回复:
user: user-1
content: 对电脑而言没有乱码，只有二进制字节；对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。
user-0 提问: 这段代码错在哪里？错误是function 'int __cdecl stub(int ,int )' already has a body 执行 cl.exe 

回复:
user: user-1
content: #include<stdio.h> #include <iostream> int stub(int,int); using namespace std; void main() { 	int x1,x2; 	printf("please enter the first number:"); 	cin>>x1; 	fflush(stdin); 	printf("please enter the second number:"); 	cin>>x2; 	stub(x1,x2); }  int stub(int x,int y) { 	printf("%d\n",x+y); 	return 0; }  1、正如一楼所说，stub函数声明后面没有加分号； 2、stub函数定义后面要有int型的返回值； 3、楼主定义的x1,x2，都是int型的，而get插入函数是从标准输入里读取下一个字符，返回类型为int型，返回值为用户输入的ASCⅡ码，出错返回-1。看楼主的意思是求两个整数的和，所以这样做不对。

user: user-2
content: int stub(int,int);//分号  void main()
user-0 提问: 程序员面试宝典little endian系统 变量存放问题

回复:
user: user-1
content: 引用 5 楼 Yick__ 的回复:[quote=引用 3 楼 luciferisnotsatan 的回复:] struct里总共有9个bit，所以2字节大。b1是0～4bit位，b2是7，8比特位  memcpy了EM，内存里就是 01000101（E）01001101 （M）  因为是小字节序，所以 15～0 bit位为 0100110101000101 红色b1补位后为5，绿色b2补位（有符号）后，就是-2菜鸟请教一下问题，从宏观上看结构体内的空间字节是要对齐的，那么更细致一些，位是不是也要对齐一下呢？[/quote] 大小端只针对字节，不针对bit位。 而且只针对超过1字节的基本类型（如short，int，long），不针对非基本类型，比如char sz[20]，char数组就不用考虑。int arr[20], 你只要考虑arr数组里的每个元素的大小端，但整个数组不用管。

user: user-2
content: 仅供参考#include <stdio.h> #pragma pack(push,1) union U {     unsigned char byte;     struct BF {         unsigned int b0:1;//a         unsigned int b1:1;//b         unsigned int b2:1;//c     } bf; } u; #pragma pack(pop) unsigned char bt; int a,b,c; int main() {     for (bt=0;bt<8;bt++) {         u.byte=(unsigned char)bt;         a=u.bf.b0;         b=u.bf.b1;         c=u.bf.b2;         printf("byte 0x%02x -- c:%d b:%d a:%d\n",bt,c,b,a);     }     for (c=0;c<2;c++)     for (b=0;b<2;b++)     for (a=0;a<2;a++) {         u.bf.b0=a;         u.bf.b1=b;         u.bf.b2=c;         bt=u.byte;         printf("c:%d b:%d a:%d -- byte 0x%02x\n",c,b,a,bt);     }     return 0; } //byte 0x00 -- c:0 b:0 a:0 //byte 0x01 -- c:0 b:0 a:1 //byte 0x02 -- c:0 b:1 a:0 //byte 0x03 -- c:0 b:1 a:1 //byte 0x04 -- c:1 b:0 a:0 //byte 0x05 -- c:1 b:0 a:1 //byte 0x06 -- c:1 b:1 a:0 //byte 0x07 -- c:1 b:1 a:1 //c:0 b:0 a:0 -- byte 0x00 //c:0 b:0 a:1 -- byte 0x01 //c:0 b:1 a:0 -- byte 0x02 //c:0 b:1 a:1 -- byte 0x03 //c:1 b:0 a:0 -- byte 0x04 //c:1 b:0 a:1 -- byte 0x05 //c:1 b:1 a:0 -- byte 0x06 //c:1 b:1 a:1 -- byte 0x07

user: user-3
content: 引用 3 楼 luciferisnotsatan 的回复:struct里总共有9个bit，所以2字节大。b1是0～4bit位，b2是7，8比特位  memcpy了EM，内存里就是 01000101（E）01001101 （M）  因为是小字节序，所以 15～0 bit位为 0100110101000101 红色b1补位后为5，绿色b2补位（有符号）后，就是-2菜鸟请教一下问题，从宏观上看结构体内的空间字节是要对齐的，那么更细致一些，位是不是也要对齐一下呢？

user: user-1
content: struct里总共有9个bit，所以2字节大。b1是0～4bit位，b2是7，8比特位  memcpy了EM，内存里就是 01000101（E）01001101 （M）  因为是小字节序，所以 15～0 bit位为 0100110101000101 红色b1补位后为5，绿色b2补位（有符号）后，就是-2

user: user-3
content: 这是个细致活，我以前也有想到过，但从来没有遇到过。

user: user-4
content: 为什么会有这样的输出？ 想问一下楼主了解位域的知识吗？ 了解memcpy函数的用法吗？
user-0 提问: 程序员面试宝典上的little-endian系统问题

回复:
user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？程序运行的结果也是这样。现在是想搞清楚为什么会有这个结果。

user: user-1
content: 不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？

user: user-2
content: struct里总共有9个bit，所以2字节大。b1是0～4bit位，b2是7，8比特位  memcpy了EM，内存里就是 01000101（E）01001101 （M）  因为是小字节序，所以 15～0 bit位为 0100110101000101 红色b1为5，绿色b2补位（有符号）后，就是-2

user: user-3
content: 引用 1 楼 zhao4zhong1 的回复:不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？

user: user-1
content: 引用 2 楼 u013539260 的回复:[quote=引用 1 楼 zhao4zhong1 的回复:] 不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？程序运行的结果也是这样。现在是想搞清楚为什么会有这个结果。[/quote] 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  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对应的汇编并单步执行观察相应内存和寄存器变化。）

user: user-4
content: 每套编译器的实现并不相同，你可以找找C语言标准看看，哪些行为是未定义的。 这个msvc的规则，一个变量可以跨字节存储：https://msdn.microsoft.com/en-us/library/yszfawxh.aspx
user-0 提问: 自学者求助，请解释一下一段代码

回复:
user: user-1
content: 因为一个循环i只加一次 所以在后面的if语句才用i++

user: user-0
content: 给您一个赞

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

user: user-0
content: 对啊。假如作者一早这样写我就懂了

user: user-3
content: 只是一个循环递增，可以不放在里面，可以单独拿出来，i++放在两个if语句的后面

user: user-0
content: 经一楼一讲解我就利马明白了，开头我以为wile语句可以自动扫描i的值，走进误区了，现在一下子明白过来了，谢谢

user: user-4
content: 楼主   发表于： 2015-01-30 23:18:05       int main(void)  {    int i = 0;                     /* Buffer index               */    while(buffer[i] != '\0')    {      if(isalpha(buffer[i]))      // i在单次循环末尾要递增，要是在这里开始++  那么if(isdigit(buffer[i++])) i++ 单次循环i就会加两次，所以只能在单次循环的最后一个i的时++  这一句i不变        num_letters++;             /* Increment letter count     */      if(isdigit(buffer[i++]))//这个为什么要自加呢，为什么不跟上一句的if一样不用自加哦？       num_digits++;              /* Increment digit count      */    }
user-0 提问: 请教一个函数声明和定义中的P()的问题

回复:
user: user-1
content: VC编译选项加/EP /P，重新编译，查看宏展开后对应的.i文件。gcc加-E

user: user-0
content: #	define	P0()				(void) #	define	P1(x, a)			(a) #	define	P2(x, a, b)			(a, b) #	define	P3(x, a, b, c)			(a, b, c) #	define	P4(x, a, b, c, d)		(a, b, c, d)	 #	define	P5(x, a, b, c, d, e)		(a, b, c, d, e) #	define	P6(x, a, b, c, d, e, f)		(a, b, c, d, e, f) #	define	P7(x, a, b, c, d, e, f, g)	(a, b, c, d, e, f, g) #	define	P8(x, a, b, c, d, e, f, g, h)	(a, b, c, d, e, f, g, h)  就是这个定义，其实算起来，等替换完成，void gsm_destroy P1((S), gsm S)和void gsm_destroy（gsm S）就是一回事了，因为会被后者替换掉，我的意思是，我不明白这个宏放在这是有什么意义。

user: user-1
content: VS IDE中，在不明白的符号上点鼠标右键，选转到定义。
user-0 提问: 写了个代码，不知道哪里错了，求高手更正。

回复:
user: user-1
content: 你返回了局部变量数组，那么返回的是自定义函数xx中数组的首地址，那么当该函数调用结束后，数据的那部分空间里的数据就是未定义的，因为函数调用结束后，栈空间会被系统自动释放的。

user: user-2
content: 这位兄弟加油，基本功要练扎实。

user: user-3
content: 引用 5 楼 ChemistYH 的回复:顺便问一下，我看完了谭浩强的那本书，想更深入的学习C语言，想先学会编个俄罗斯方块那样的小游戏，不知道看看什么书好。  学完C语言就开发图形程序有些困难哦，要学的东西很多啊。学完C开始做算法倒是足够了。  SDL图形库，比较简单，用处也很广，如果你确实对图形程序很感兴趣，可以学习一下：https://zh.wikipedia.org/zh-cn/SDL

user: user-4
content: 输入错误，应该是C Primer Plus.

user: user-4
content: C Prime Plus，不深入但全面。C专家编程，c语言陷阱与缺陷。 做游戏，我不了解。 提供一个C语言的俄罗斯方块代码： 转载：http://tieba.baidu.com/f?kz=1090419809 从效果图来看，还不错。 运行发现BUG太致命。你可以做个更好的。  PS:答主也在学习C Prime Plus。最近刚看到存储变量……

user: user-3
content: 引用 4 楼 ChemistYH 的回复:奥，也就是说，调用子函数结束后，那个数组就不存在了。可有些元素还是正确的，这是不是就牵扯到存储方式的问题了。  C语言有个标准文档，那里面规定了哪些操作会有什么结果，也说明了哪些操作的结果是未知的（正确来说叫“未定义”）。 引用一个已经超出作用域的变量，然后获取其值的行为是未定义的，可能那个地址里面还是放着正确的数据，也可能已经变成其他数据了。

user: user-0
content: 顺便问一下，我看完了谭浩强的那本书，想更深入的学习C语言，想先学会编个俄罗斯方块那样的小游戏，不知道看看什么书好。

user: user-0
content: 奥，也就是说，调用子函数结束后，那个数组就不存在了。可有些元素还是正确的，这是不是就牵扯到存储方式的问题了。

user: user-3
content: 变量都有自己的作用域，超过了就无效了。 返回函数中在栈上建立的数组的指针这个做法是错误的。

user: user-4
content: #include<stdio.h> #include<stdlib.h> int *xx() { int i; int *a=(int*)malloc(20*sizeof(int)); for(i=0;i<20;i++) { a[i]=8; } return a; } int main() { int *p,i; p=xx(); for(i=0;i<20;i++,p++) { printf("%d",*p); } p-=20; free(p); printf("\n"); }

user: user-4
content: 因为变量存在作用域，数组a在函数int * xx()中，即使用指针指向它，函数调用结束，编译器还是自动释放数组占用的内存。 可以采用以下2个办法解决函数中建立数组的过程： 1，声明静态变量，int * xx()中：static int a[20]; 2，采用动态分配内存，头文件添加：#include<stdlib.h>，创建数组用以下代码：int *a=(int*)malloc(20*sizeof(int);在函数中不适用free()释放，在主函数结尾添加:free(p)，释放数组占用内存。  相关知识：变量存储的作用域，动态分配内存。可在书本进行学习。  方法一的源代码直接添加即可。 方法二源代码：
user-0 提问: 电话号码分段显示

回复:
user: user-0
content: 无满意答案...............

user: user-1
content: 引用 3 楼 zhao4zhong1 的回复:作为一个C程序员，对  scanf,sscanf,fscanf  printf,sprintf,fprintf 这类函数的用法，还是要做到“拳不离手，曲不离口”的。 //13812341234 显示成 138-1234-1234 #include <stdio.h> char s[20]="13812341234"; int main() {     printf("%.*s-%.*s-%.*s",               3,s,                    4,s+3,                         4,s+3+4);     return 0; } //138-1234-1234   顺便学习学习

user: user-2
content: 作为一个C程序员，对  scanf,sscanf,fscanf  printf,sprintf,fprintf 这类函数的用法，还是要做到“拳不离手，曲不离口”的。 //13812341234 显示成 138-1234-1234 #include <stdio.h> char s[20]="13812341234"; int main() {     printf("%.*s-%.*s-%.*s",               3,s,                    4,s+3,                         4,s+3+4);     return 0; } //138-1234-1234

user: user-3
content: 把特定前缀放入数组中，然后匹配，作电话处理 其他作手机处理

user: user-4
content: %c%c%c-%c%c%c%c

user: user-0
content: Update
user-0 提问: 菜鸟求解答，x509的问题

回复:
user: user-1
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。

user: user-2
content: (unsigned char **)&certBuf, len)\ -------->这个不能取地址 虽然不知道你的函数接口，但是试试 (unsigned char **)certBuf, len)\
user-0 提问: 新人求问C语言的一个问题

回复:
user: user-0
content: 谢谢各位大神了，我稍微有点明白了

user: user-1
content: 怎么能用%s 关于枚举——http://blog.csdn.net/u012421456/article/details/38962443

user: user-2
content: 路过学习~~~~

user: user-3
content: 引用 2 楼 qq_16630121 的回复:那如果我写的是%s，能打印出字符串吗 楼上正解

user: user-4
content: 枚举可以理解为int，你用%s打印int看看如何 内存很容易出问题的 如果你在调试语句中想看int对应的字符处串，需要专门写一转换函数

user: user-5
content: 引用 2 楼 qq_16630121 的回复:那如果我写的是%s，能打印出字符串吗  这里头哪有字符串 你指的是打印“PINT”吗？那不行的，本身它就不是个字符串，只是个类似于宏定义的东西，让你看着方便，编译的时候就变成整数值了。 如果你有这样的需要，说明不应该用enum

user: user-5
content: %s的参数是字符串地址，PINT值是16，程序会去打印地址16开始的字符串，当然是段错误

user: user-0
content: 那如果我写的是%s，能打印出字符串吗

user: user-3
content: #include <stdio.h>  enum Liquid{  	OUNCE = 1, 	CUP = 8, 	PINT = 16, 	QUART = 32, 	GALLON =128 };  int main() { 	int jar = QUART; 	printf("%d\n", jar);                  return 0; }
user-0 提问: 全局变量如何访问比较合理，具体请看代码

回复:
user: user-1
content: 请牢记：源代码本身的书写是否结构化或面向对象或符合设计模式或敏捷…并不重要，重要的是你是否使用结构化或面向对象或符合设计模式或敏捷…的方法命名标识符、阅读、修改、检查、测试源代码。  意思是你程序结构看上去再合理，再简洁，也不一定比看上去一团乱麻的程序结构在运行或修改时更不易出错，更方便修改，出错了更容易找到哪里出错和具体出错的原因，更容易改正错误。  试对比 图书馆（对图书的分类够结构化了吧） 和 搜索引擎（可看作是扁平化任何结构数据，仅支持全文检索） 哪个处理信息更方便、更高效。  所以 与其费劲去重构代码让其看上去更简洁、更合理 不如费劲学习grep、sed、awk、……这类全文搜索和批处理编辑的工具。  结构越复杂，越难修改，越难除错。 有时（甚至大多数时候），看上去越合理、越简洁的代码，运行起来性能越差，出错时查找原因越难，找到出错原因后改正越费劲。  程序员要做的不是尽力避免错误，而是聚焦在快速发现并改正错误。真正以快速方式轻易解决错误，“快速的失败”远胜过“预防错误”。Fred George

user: user-2
content: 方法2的确有一个好处 但是这个好处在这里被你糟蹋了  方法2可以判断传入参数是否有效 是否越界

user: user-2
content: 方法2 不是访问全局变量  你函数调用运算符写错了

user: user-3
content: 前些天也问过类似的问题，也没有人给出明确性的总结

user: user-0
content: 引用 5 楼 q3733353520 的回复:在编写大型项目的时候 会有很多文件 我们一般将全局变量的操作封装为 Set 以及 Get两个函数 方便其在他文件操作此全局变量 我个人编码也偏向于使用方法2，总是感觉直接去访问全局会有风险，封装起来会安全点。但是说不清为什么会安全？

user: user-4
content: 具体只要考虑一下，页面粒度就可以了 X86早期版本都是 4K页面， 根据数据地，数据量址就可以确定是否跨页了 实际上，只要页面一直都在内存，跨页是没有问题的

user: user-5
content: 在编写大型项目的时候 会有很多文件 我们一般将全局变量的操作封装为 Set 以及 Get两个函数 方便其在他文件操作此全局变量

user: user-6
content: 2好  以后如果不使用&testtest[port]这种方式取地址. 只改Gettest函数就可以了. const test_t *Gettest(unsigned int port) {     return &testtest[port + 1];//只是例子 }  你要是觉得这里不会有变化,就无所谓了

user: user-7
content: 全局的你就直接访问吧，不然就别弄成全局的了

user: user-8
content: 我是觉得第二种好些,这样把具体的实现细节封装起来,调用者如果想要某个test_t对象只需调用那个函数,而无需知道函数是怎么实现的,也就是说你以后可以更改全局对象的存储方式,而不会影响上层用户

user: user-9
content: 你有五个苹果，我叫你把第二个苹果拿出来，第一种方法就是直接拿第二个苹果，而你第二种方法是我把这五个苹果扔箱子里去，再去箱子里面拿出第二个苹果；只是用箱子包装了一下，又没有做其他事情，何必多此一举……
user-0 提问: 分页管理中，如何判定存放数据的数据有没有“跨页”？

回复:
user: user-0
content: [/quote]  引用 10 楼 whizer 的回复:如果你的程序在kernel运行, 在freebsd用vtophys. 其他系统应该有类似的函数.  从你的描述中我感觉你的程序运行在user空间, 你需要物理内存干什么?知道了操作系统也不会让你直接操作的. 我前面给你的说明只是说用这种方法可以得到你需要的信息.  话说你的问题真的需要知道内存的实际存放位置? 考虑效率还是别的需求? 考虑的还是搜索匹配的时间效率。做内存镜像分析的。想通匹配“关键字”定位一段特殊的信息。在实际测试中，发现“关键字”有时会存在“跨页的问题”，我寻思，操作系统，应该提供了一种机制即当我访问到“存放关键字”的前一部分那个内存物理页时，我应该能拿到存放关键字后一部分的内存物理页的地址（物理地址）；这样我能快速定位，不会因为“跨页”，影响查找速度。这是我的思路。可惜，刚刚接触，知道的太少。我也认为win平台也应该有“vtophys”类似的函数。。现在面临的困难，就是想找人指点下，解决这个问题，需要临时补充哪些知识？这方面知识哪有好的资料？真是新手。所以留贴这么久了。。谢谢

user: user-1
content: 如果你的程序在kernel运行, 在freebsd用vtophys. 其他系统应该有类似的函数.  从你的描述中我感觉你的程序运行在user空间, 你需要物理内存干什么?知道了操作系统也不会让你直接操作的. 我前面给你的说明只是说用这种方法可以得到你需要的信息.  话说你的问题真的需要知道内存的实际存放位置? 考虑效率还是别的需求?

user: user-2
content: Windows内核讲义(东京大学) 来自http://i-web.i.u-tokyo.ac.jp/edu/training/ss/msprojects/ http://download.csdn.net/detail/zhao4zhong1/2742117

user: user-0
content: 引用 7 楼 whizer 的回复:首先要注意你malloc出来的虚拟地址是连续的, 只是物理地址不连续, 接下来判断,  判断虚拟页地址:            A = (数据的起始地址 / 页大小) << log2(页大小) , 如果页大小4k, 左移12 bit            B = A + 页大小       C = B + 页大小 .....  判断物理页: (用虚实转换函数)         A' = vtop(A) ..... 前面都能懂，就是这个“虚实转换函数（vtop( )）”，没有听过，谷歌了下也没找到。能不能介绍下？函数名？有代码？ 学操作系统时，只知道虚拟页通过硬件查页表实现物理地址映射。具体到代码上就不清楚了。 作为新手，刚开始接触内存管理、分析方向，感觉泥学的不错。有好资料推荐嘛？谢谢

user: user-1
content: 首先要注意你malloc出来的虚拟地址是连续的, 只是物理地址不连续, 接下来判断,  判断虚拟页地址:            A = (数据的起始地址 / 页大小) << log2(页大小) , 如果页大小4k, 左移12 bit            B = A + 页大小       C = B + 页大小 .....  判断物理页: (用虚实转换函数)         A' = vtop(A) .....

user: user-0
content: 引用 3 楼 user-3 的回复:一般来说，只要页面不是太多，跨页根本不是问题 假定数据存放在A页，空间不足，跨页存放到了B页。那么，“跨页”了怎么确定B页的起始地址呢？ A页和B页都是逻辑分页。不是连续存放的。谢谢

user: user-0
content: 引用 2 楼 whizer 的回复:先查页大小, 因为物理页和虚拟页一般大小相等, 因此虚拟页和物理页是一一对应的. 接下来查你的数据的起始地址,这是你自己可以得到的. 然后查你的数据的长度. 起始地址+长度 跨越页界限, 肯定是跨页访问.  具体算法:  起始地址%页大小 + 长度 >　页大小 恩。这个算法确实能判断是否分页。那么如果确定分页。加入部分数据存放在A页，另一部分存放在了B页。这两页原则上是 不会连续存放的。我想问下。如何确定B页的起始地址（希望能访问到B页）？Windows是不是有相应的属性记录了A页和B页的“关系”。还是。。。PS：我做的是模糊匹配查找，能确定的基本上只有数据的总长度。谢谢

user: user-0
content: quote=引用 2 楼 whizer 的回复:] 先查页大小, 因为物理页和虚拟页一般大小相等, 因此虚拟页和物理页是一一对应的. 接下来查你的数据的起始地址,这是你自己可以得到的. 然后查你的数据的长度. 起始地址+长度 跨越页界限, 肯定是跨页访问.  具体算法:  起始地址%页大小 + 长度 >　页大小[/quote] 恩。这个算法确实能判断是否分页。那么如果确定分页。加入部分数据存放在A页，另一部分存放在了B页。这两页原则上是 不会连续存放的。我想问下。如何确定B页的起始地址（希望能访问到B页）？Windows是不是有相应的属性记录了A页和B页的“关系”。还是。。。PS：我做的是模糊匹配查找，能确定的基本上只有数据的总长度。谢谢

user: user-3
content: 一般来说，只要页面不是太多，跨页根本不是问题

user: user-1
content: 先查页大小, 因为物理页和虚拟页一般大小相等, 因此虚拟页和物理页是一一对应的. 接下来查你的数据的起始地址,这是你自己可以得到的. 然后查你的数据的长度. 起始地址+长度 跨越页界限, 肯定是跨页访问.  具体算法:  起始地址%页大小 + 长度 >　页大小

user: user-2
content: 所以才有类似VirtualLock之类的函数呀。
user-0 提问: C语言怎么把192.168.1.11变成192.168.001.011？

回复:
user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:作为一个C程序员，对  scanf,sscanf,fscanf  printf,sprintf,fprintf 这类函数的用法，还是要做到“拳不离手，曲不离口”的。 //把192.168.1.11变成192.168.001.011 #include <stdio.h> char s[20]="192.168.1.11"; char t[20]; int a,b,c,d; int main() {     sscanf(s,"%d.%d.%d.%d",&a,&b,&c,&d);     sprintf(t,"%03d.%03d.%03d.%03d",a,b,c,d);     printf("%s\n",t);     return 0; } //192.168.001.011 //  其实自己后来也搞定了也是这样。但是没有第一时间搞定就是不合格，谢谢赵老师

user: user-1
content: 作为一个C程序员，对  scanf,sscanf,fscanf  printf,sprintf,fprintf 这类函数的用法，还是要做到“拳不离手，曲不离口”的。 //把192.168.1.11变成192.168.001.011 #include <stdio.h> char s[20]="192.168.1.11"; char t[20]; int a,b,c,d; int main() {     sscanf(s,"%d.%d.%d.%d",&a,&b,&c,&d);     sprintf(t,"%03d.%03d.%03d.%03d",a,b,c,d);     printf("%s\n",t);     return 0; } //192.168.001.011 //
user-0 提问: C语新手的一个小问题~

回复:
user: user-0
content: 引用 7 楼 ruying1389279 的回复:[quote=引用 5 楼 I_better 的回复:] [quote=引用 2 楼 bear234 的回复:] 奇葩代码啊..... 自己百度getchar函数........... 你好。我刚才看了一下getchar。 这里我想了解关于EOF的一些情况，请问什么情况下会返回EOF 比如我输入ABC[enter]。EOF在什么位置[/quote] EOF的意思是 文件结束符 windows下 ctrl+z 组合键实现结束，回车只是换行[/quote] 我刚才用while语句跑了一下。 ctrl+z的确会结束后面循环。但是并未跳出while循环 比如我输入“abcd^zefg” 输出为“abcd”，但是依旧可以循环输入，输出。没有出现press any key to continue

user: user-1
content: 引用 5 楼 I_better 的回复:[quote=引用 2 楼 bear234 的回复:] 奇葩代码啊..... 自己百度getchar函数........... 你好。我刚才看了一下getchar。 这里我想了解关于EOF的一些情况，请问什么情况下会返回EOF 比如我输入ABC[enter]。EOF在什么位置[/quote] EOF的意思是 文件结束符 windows下 ctrl+z 组合键实现结束，回车只是换行

user: user-2
content: 把分号移到下面来，用空语句

user: user-0
content: 引用 2 楼 bear234 的回复:奇葩代码啊..... 自己百度getchar函数........... 你好。我刚才看了一下getchar。 这里我想了解关于EOF的一些情况，请问什么情况下会返回EOF 比如我输入ABC[enter]。EOF在什么位置

user: user-0
content: 引用 1 楼 sholber 的回复:眼睛不要只盯着看得见的字符，回车就不算啦？ 你好。 请问什么情况下会返回EOF 比如我输入ABC[enter]。EOF在什么位置

user: user-3
content: 字符数？可以用strlen（）吧

user: user-4
content: 奇葩代码啊..... 自己百度getchar函数...........

user: user-5
content: 眼睛不要只盯着看得见的字符，回车就不算啦？
user-0 提问: 求解

回复:
user: user-1
content: b是数组名也就是它的首元素地址 scanf（）需要存入一个地址，所以b==&b[0],而b+i是指针移动i个元素单位，所以它还是一个地址，可以给scanf使用。 而 b[i]是数组的第i个元素，也就是一个整数值。它对于scanf是非法滴。 这么说你应该明白了吧。

user: user-2
content: b[i] 等价于*(b+i) 而不等价于b+i

user: user-2
content: Pointer Arithmetic Additive operations involving a pointer and an integer give meaningful results only if the pointer operand addresses an array member and the integer value produces an offset within the bounds of the same array. When the integer value is converted to an address offset, the compiler assumes that only memory positions of the same size lie between the original address and the address plus the offset.  This assumption is valid for array members. By definition, an array is a series of values of the same type; its elements reside in contiguous memory locations. However, storage for any types except array elements is not guaranteed to be filled by the same type of identifiers. That is, blanks can appear between memory positions, even positions of the same type. Therefore, the results of adding to or subtracting from the addresses of any values but array elements are undefined.  Similarly, when two pointer values are subtracted, the conversion assumes that only values of the same type, with no blanks, lie between the addresses given by the operands.

user: user-3
content: scanf的问题 http://blog.csdn.net/u012421456/article/details/18501309

user: user-4
content: for (i=1; i<=4; i++)         scanf("%d", b+i); b+i是地址 b[i]是变量，改成&(b[i])就可以了

user: user-5
content: 我看了下这个程序，b+i可以运行，像你说的改成b[i]也可以运行，都没有错误。 输入的时候scnaf("%d",&b[i]);就可以了，也运行过关了，但是你要是输入函数这样写就不对了scanf("%d",b[i]);为什么不对不解释。
user-0 提问: 求助一个小问题

回复:
user: user-1
content: p是一个指针常量,不能写成p++ 可以改成下面的: void main()  {      char *p[4]={"he","love","she"};      char **ptrp=p;      int i;      for(i=0;i<3;i++)         printf("%s",*(ptrp++));  }

user: user-2
content: p++ 或者 ++p  把p的值就变了  而数组名是绝对不能变的～～～～  你可以把数组名赋值给相应的指针数据去操作这个指针

user: user-3
content: 这个问题看似简单，但含金量很高。请老油条们用“地址”、“变量”、“存储的是地址”等等来解释一下吧，看能不能解释得通。

user: user-3
content: Except when it is the operand of the sizeof operator, the _Alignof operator, or the unary & operator, or is a string literal used to initialize an array, an expression that has type ‘‘array of type’’ is converted to an expression with type ‘‘pointer to type’’ that points to the initial element of the array object and is not an lvalue.

user: user-3
content: 引用 2 楼 wysdaomei 的回复:[quote=引用 1 楼 sholber 的回复:] char * p [3] = {"he", "love", "she"}; /* …… */ printf ("%s", * (p ++)); 前缀++运算符要求它的操作数是一个可修改的左值，但p的类型是数组，作为前缀++运算符的操作数时，调整为指向数组首元素的指针，但不再是左值。  那对于一个函数int num(char *p[],int n)；在该函数中可以对p进行自增，这跟我上面的有什么区别？[/quote]  尽管都是指针，但前者是调整（转换）而来的，转换之后是值，不再是左值；后者呢，本身就是一个左值，不是经转换来的。

user: user-0
content: 引用 1 楼 sholber 的回复:char * p [3] = {"he", "love", "she"}; /* …… */ printf ("%s", * (p ++)); 前缀++运算符要求它的操作数是一个可修改的左值，但p的类型是数组，作为前缀++运算符的操作数时，调整为指向数组首元素的指针，但不再是左值。  那对于一个函数int num(char *p[],int n)；在该函数中可以对p进行自增，这跟我上面的有什么区别？

user: user-3
content: char * p [3] = {"he", "love", "she"}; /* …… */ printf ("%s", * (p ++)); 前缀++运算符要求它的操作数是一个可修改的左值，但p的类型是数组，作为前缀++运算符的操作数时，调整为指向数组首元素的指针，但不再是左值。
user-0 提问: 四个数论问题

回复:
user: user-0
content: p(x)表示整数x的最大素因数，如果数列{xn}满足： 1、首项x1为任意素数； 2、递推式x(n+1)=p(xn^2+1)。 计算显示，该数列很可能没有上界。  我感兴趣的是，如果把指数2变为1.6，数列是否存在上界。

user: user-0
content: 问题1拓展版： p(x)表示整数x的最大素因数，且p(x)~x^a。 已知a≈0.62433，则1/a≈1.6。 数列{xn}满足： 1、首项x1为任意素数； 2、递推式x(n+1)=p([xn^1.6])。其中[xn^1.6]表示对xn^1.6取整。 问：该数列是否一定存在上界。

user: user-0
content: 回楼上： 你脑子没坏，这个问题确实与prime gap有关。 一、Cramer猜想：x与x+lnx*lnx之间必有素数。 二、x与x+lnx*lnx之间有lnx*lnx/2个奇数。 三、由素数定理：2与lnx*lnx*lnlnx之间约有lnx*lnx/2个奇素数。 四、假设在整数x附近随机选择lnx*lnx/2个奇数，其中包含素数。（显然不对，但有一定启发性。） 五、根据以上四点，提出“加强版Goldbach”。

user: user-1
content: 脑子坏了怎么扯到prime gap去了（大概是看到个log平方就想那里去了）。Goldbach的话印象里真没啥有关其中一个prime多大的结论。那我就完全没啥看法了。祈祷程序算个反例，算不出那就等于这题做不出了。

user: user-1
content: 不好说。不过仔细想想，这个命题有反例也推翻不了原来的Goldbach。而那个渐进式也就比prime gap的Cramer猜想多了个loglog(n)。没想法，要猜的话我还是偏向有反例。 要写程序就写一个吧，算出个反例那最好，没有那就啥也说明不了。

user: user-0
content: 谢楼上！  2. 加强版Goldbach没啥好说的 这个找到反例没有？

user: user-1
content: 程序没意思。直接回答数学了。 1. 0.62433 2. 加强版Goldbach没啥好说的 3. 有反例。A是足够大的，mod (3*5*17*257*65537*641)=1，mod 6700417=-1的整数。对于这个A，讨论n mod 32的情况就能讨论出来A+2^n必定整除刚才一串质数的至少一个。 4. 显然不对。用经典的构造n项合数的方法，a=(k+1)!+1, b=1，那么这几个连续合数的质因子个数仅为<=k+1的所有质数，这在k>=4的时候就比k小了。  目测第三题，光初学C语言肯定想不到这个结论是不对的。我自己是想不到第二个构造的方法了。

user: user-0
content: 被你发现了，从小立志抄作业！

user: user-2
content: 作业？