Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 关于函数调用过程中参数和局部变量的问题

回复:
user: user-1
content: 修改windows下编译选项。

user: user-2
content: 引用 4 楼 wlzx5857491 的回复:引用 3 楼 cyd54454 的回复:不知道楼主主要是干什么，忠告：千万不要迷失在某些细节上，一深入又是一片大海，一生还是很短暂的。你说了半天等于没说 要清楚干什么，才能明确方向，有些东西其实就是依赖具体实现的，做编译器的人不同，那么可能有些人觉得这样好，有些人觉得那样好，你迷失在两种完全人为实现的不同种有什么意义，除非你想做编译器。关于参数入栈顺序，我以前也想知道为什么，就GCC来说，结果呢fun(int a,double b,int c)和fun(double a,int b,intc)的入栈顺序都不一样。如果确实是想知道编译中各种弯弯绕绕，什么优化啊，存储管理啊，请先啃《编译原理》。抱歉，没能解决你的问题

user: user-3
content: 引用 楼主 wlzx5857491 的回复:最近看了很多关于函数调用过程中参数和局部变量在栈中分配和释放 方面的资料，有一些领悟,但也有一些不解， 1   push        ebp 2   mov         ebp,esp            3   sub         esp,40h 4  push        ebx 5  push        esi 6  push        edi 7  lea         edi,[ebp-40h] 8  mov         ecx,10h 9 mov         eax,0CCCCCCCCh 10 rep stos    dword ptr [edi]    这是在windows下查看一个c函数得到的汇编代码，10行之后的没有贴了  1      我把同样的c函数拿到linux（乌班图）下，发现3-10行都没有，而且在windows下最后都有如下代码，  pop         edi                  pop         esi pop         ebx 除了edi我看到有时存一下地址，没看到使用esi，ebx，每次都是函数压栈了，结束前出栈了，那ebx，esi有什么用呢？linux为什么没有这么做呢？  你看的是debug版生成的代码， 并没有优化， ebx, esi, edi是编译器生成代码中经常用到的函数内部使用的寄存器（还要加上eax，不过eax同样是作为返回值用的，所有不需要保存），所以每次都在进入时push, 离开时pop。   引用 楼主 wlzx5857491 的回复:2      8-10行把局部变量占的内存的字节全部设置成了cc，查了下说是什么int3中断，int3中断是干什么的,linux下没有这样做，那linux下没有这种中断还是？  充填cc是为了边界检查，以便程序写内存越界时调试器能够察觉。其实填任何字符都无所谓只是vs的选择，而填cc的一个额外好处是如果程序中代码如果乱跳转跳到这块内存继续执行时程序可以中断而不至于运行未知代码以至于调试器无法跟踪。   引用 楼主 wlzx5857491 的回复:3   4 int foo(int a,int b)  5 {   6   unsigned  int m=5;   7   unsigned  int p=10;   8 /*  printf("%p\n",&a);   9   printf("%p\n",&b);  10   printf("%p\n",&m);  11   printf("%p\n",&p);*/  12     return a+b;  13 }   9            push    ebp  10         .cfi_def_cfa_offset 8  11         .cfi_offset 5, -8  12         mov     ebp, esp  13         .cfi_def_cfa_register 5  14         sub     esp, 16  15         mov     DWORD PTR [ebp-8], 5  16         mov     DWORD PTR [ebp-4], 10  17         mov     eax, DWORD PTR [ebp+12]  18         mov     edx, DWORD PTR [ebp+8]  19         add     eax, edx  20         leave  最让我不解的是上面的程序，看了很多资料，这时栈布局大概是这样： int b int a eip ebp     <- ebp指向这 int p int m （我试验了下，发现windows下局部变量是先声明的在高地址，而乌班图里先声明的在底地址）  ebp-4 是第一个局部变量，ebp+8是第一个参数，但是我打印地址 a   0xbf8da320 b   0xbf8da324 m  0xbf8da308 p   0xbf8da30c  离得最近的是p和a,相差0x14,也就是20字节，但是汇编里不是8+4=12字节吗，为什么会这样？  GCC 4.5以后堆栈必须16字节对齐，所以函数入口处堆栈可能是这么排列的： b a unused 4 bytes return addr

user: user-0
content: 引用 3 楼 cyd54454 的回复:不知道楼主主要是干什么，忠告：千万不要迷失在某些细节上，一深入又是一片大海，一生还是很短暂的。你说了半天等于没说

user: user-2
content: 不知道楼主主要是干什么，忠告：千万不要迷失在某些细节上，一深入又是一片大海，一生还是很短暂的。

user: user-2
content: 因为这些都是依赖编译器的实现，所以不同编译器可能就是不同的。想弄清楚，也许可以看看《编译原理》

user: user-4
content: 楼主看的是什么书，推荐一下，我也学习一下这方面的知识
user-0 提问: C语言用指针为申请空间赋值的问题

回复:
user: user-1
content: 引用 楼主 laigerena 的回复://读单词，存入word指向的空间，返回读到与否的标志。 int readword(char *word,int lmt){ 	static char c;           //主函数中 word=(char *)malloc(15); 	while((c=getchar())==' '||c=='\t') 		; 	if(isalpha(c)){ 		for(;isalpha(c)&&lmt-->0;){ 			*word++=c; 			c=getchar(); 		} 		return 1; 	} 	return 0; } /请问这样赋值为什么没有成功。  int readword(char * word,int lmt) { 	static char c; 	while((c = getchar()) == ' '|| c == '\t') 		continue; 	if(isalpha(c)) 	{ 		for(;isalpha(c) && lmt -- >0;) 		{	 			*word ++ = c; 			while((c = getchar()) == ' '|| c == '\t') 				continue; 		} 		return 1; 	} 	return 0; 	 }      没有过滤掉回车
user-0 提问: float ，int 的底层实现

回复:
user: user-1
content: 这个是编译器，或者汇编器决定的。  CPU只提供内存，寄存器，IO端口，中断引脚，读写引脚，地址线，数据线等等，这些东西。  有些CPU不提供浮点部件，这时候， 浮点运算，和浮点类型是编译器，或者汇编器提供的。 有些编译器，或者汇编器，提供浮点部件仿真器， 就是说用软件实现，浮点部件的每一条指令。仿真浮点运算器。 这其实也是一种虚拟机模式。  如果CPU提供浮点运算，或者计算机另外配有浮点部件---数学协处理器 那么就由硬件决定 浮点数的格式  不过 float ,double 是IEEE标准浮点数格式。 格式是固定的float 32Bits,double 64Bits. int 一般和CPU寄存器长度有关，不过也和编译器，汇编器有关 例如C51 ,8Bits51系列，寄存器为8 Bits  char 8Bits,int 是16Bits ，long 32Bits,float 32Bits C51 浮点数计算，全部是软件实现的 。  由于C ,C++ 标准没有规定整数类型的固定长度。 同一CPU不同操作系统和编译器，对于int 类型规定的长度是不同的 于是为了区别这些不同，出现了数据模型这种东西。 数据模型（LP32 ILP32 LP64 LLP64 ILP64 ） TYPE               LP32  ILP32  LP64  ILP64  LLP64 char                 8         8          8         8         8 short              16       16        16       16       16 int                   16       32        32        64      32 long                32       32        64       64       32 long long       64       64        64       64       64 pointer           32       32        64       64       64

user: user-2
content: 这个我感觉楼上都说的挺对的了，在定义数据的时候就已经限定存放数据的类型，内存只是按这个规则保存数据，具体是什么类型的都不用管，如果在编码中有强制转换，再用另一种规则把数据取出来

user: user-3
content: 计算机底层是没有各种类型之分的，类型的区分是给人看的。你把某类型的数存入内存，该数被转换成了二进制数，你从内存取某类型的数，取出来的二进制数被转换成你需要的浮点数。至于转换有其一套标准在，没仔细研究过. float fun() { 	return 12.34; }  int main() { 	float a; 	 	a = fun(); 	return 0; } 上面程序的反汇编如下(只取了fun函数的)：  <fun>: push   %rbp mov    %rsp,%rbp mov    $0x414570a4,%eax   //此处0x414570a4就是12.34的16进制表示，这说明了在底层，是没有float的 mov    %eax,-0x4(%rbp) movss  -0x4(%rbp),%xmm0 pop    %rbp retq

user: user-4
content: 楼主，你忘记还有编译器一层了么？ 编译器根据你写的int还是float，翻译成汇编的时候，执行不同的汇编语言，不同的汇编语言，不同的机器码，在CPU哪里就会有不同的单元执行。 这个就是为什么在有些没有浮点运算单元的CPU下，用c写代码，要求你不尽量不写float，因为那个时候，编译器会把你的float数据的操作用只能处理定点数的指令模拟。  以上观点，没有见任何书籍和文章，可能有误，但是我也有过楼主的疑问，但是我仔细的思考过，因为只有这样才能解释有些书本上看起来不清楚的问题。 如果有错误，请指正

user: user-5
content: CPU听你指挥执行不同的指令。

user: user-6
content: 你写代码告诉CPU把接下来几个字节当做int或者float型数据，CPU按约定的规则理解接下来的几个字节。

user: user-7
content: 楼主说的底层是多底层？ 硬件不需要知道你的这个数字是浮点数还是整数，CPU执行的是指令，运算指令一般包括一个运算命令，这个命令就告诉CPU，后面的操作数是整数还是浮点数，然后拿出来当整数或者浮点数，操作数在内存或者CPU操作的寄存器中表现形式还是一样的

user: user-8
content: 计算机底层决定不了这个

user: user-9
content: 百度一下

user: user-10
content: http://bbs.csdn.net/topics/390676437
user-0 提问: 程序正确  为什么编译错误 求大神指教  win7的系统

回复:
user: user-1
content: 你这个是链接错误，看看是不是cl.exe正在运行

user: user-2
content: 好吧，我说错了

user: user-2
content: 我感觉是不是main函数的问题，本来是int类型的，怎么还有main（void）？？？？

user: user-3
content: 把源代码文件的后缀名改为.c

user: user-4
content: 引用 7 楼 lovesmiles 的回复:是不是少了这一句：  #include "stdafx.h"  把它复制到文件头看看。  原来是cl.exe的错误，当我没有说过...

user: user-4
content: 是不是少了这一句：  #include "stdafx.h"  把它复制到文件头看看。

user: user-5
content: 建议摒弃M$；至少VC6已经有些过时了；多google多baidu，原帖传送门http://bbs.csdn.net/topics/120050960

user: user-5
content: 1.看一下你是否有原来的这个工程的进程在运行.    2.cl.exe丢失.在VC根目录\vc98\bin下    3.cl.exe有问题.重装vc

user: user-6
content: 让你在Win7上用VC6

user: user-7
content: #后面的空格去掉试试？

user: user-7
content: Path环境变量乱了。 重装或修复VC

user: user-8
content: 重写一个试试
user-0 提问: 大端小端是否应用于多种场合？

回复:
user: user-1
content: 大小端是针对CPU的

user: user-2
content: CPU字节序－－－某种语言文字 大端－－－从右往左逐字读写 小端－－－从左往右逐字读写 硬盘－－－纸质小说 内存－－－电子文档

user: user-3
content: 不是，内存和硬盘都听CPU的，CPU是什么，内存和硬盘就是什么。没有其它要考虑的。你把内存拔掉到其它的机器，只要接口符号那台机器的标准，内存就听那台机器CPU的话了。

user: user-4
content: 大小端不是看操作系统吗？？

user: user-5
content: 大小端在针对CPU的，CPU对一个4字节内存，作为int解析的结果。内存和硬盘只负责存储，不负责解释。 大小端主要在网络传输方面。必须保持网络序列。 还有就是如果你把一个int转成4个char的时候，必须考虑这个1点

user: user-6
content: 只要不是通过网络或跨机器，不需要处理大小端
user-0 提问: 二分查找函数求助。

回复:
user: user-1
content: 我想问的是，这个函数如何使用？比如说用binsearch如何写一个显示整数10在数组中的位置的程序，假设数组中存在整数10。    #include <iostream> using namespace std;  int main() { //创建一个数组，包含10 int Index[20] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20}; //调用binsearch函数就行啦，将返回值赋给一个变量 int Result = binsearch(10,Index,20); //根据返回值的不同，就知道结果啦 }

user: user-2
content: 算法有BUG,已修改  #include "stdafx.h" #include <stdio.h> #include <stdlib.h>  /* *该函数用于判定已排序的数值v中是否存在某个特定的值x。 *数组v的元素必须以升序排列。 *如果v中包含x，则该函数返回x在v中的位置（介于0~n-1之间的一个整数）； *否则，该函数返回-1。 */ int binsearch(int x, int v[], int n) {     int low, high, mid;      low = 0;     high = n - 1;     while (low <= high) {         mid = (low+high)/2;         if (x < v[mid])             high = mid - 1;         else if (x  > v[mid])             low = mid + 1;         else    /* found match */             return mid;     }     return -1;   /* no match */ } int _tmain(int argc, _TCHAR* argv[]) { 	//创建升序数组 	int a[] = {1,2,3,4,5,6,7,8,9};  	int ret = 0;  	//特定值为6 	int x = 6; 	ret = binsearch(x, a, 9);//9是数组长度  	if(ret != -1) 	{ 		printf("找到 : 第%d个\n", ret+1); 	} 	else 	{ 		printf("找不到\n"); 	}  	x = 11; //找不到 	ret = binsearch(x, a, 9);//9是数组长度  	if(ret != -1) 	{ 		printf("找到 : 第%d个\n", ret+1); 	} 	else 	{ 		printf("找不到\n"); 	}  	system("pause"); 	return 0; }
user-0 提问: 使用libtiff存储TIFF格式图片，图片只存储了2045张？

回复:
user: user-0
content: 感谢一楼的答复，经过改正后真的可以了。

user: user-1
content: 这个没有用过，不过看问题，似乎是，用完后句柄没有关闭，继续用同样的句柄打开下一个。造成的。  image = TIFFOpen(szFileName, "w");         // Open the TIFF file 把上面的那一句去掉应当就可以了。试试吧。
user-0 提问: C程序运行结果出现异常

回复:
user: user-1
content: 希望我没有理解错 楼主的意思吧     按回车键是结束输入滴啊    按组合键是结束整个程序的啊   另外其他的楼上都说滴很清楚了

user: user-0
content: 我知道 -1 at EOF 是(c=getchar())!=EOF  0 at EOF是 c = getchar()!=EOF 我问的不是这个。为什么这个程序输入完要按回车才显示。结束还要ctrl+z

user: user-2
content: 引用如果等于EOF则输出C的值应该为-1  应该0(false)

user: user-0
content: 你们所说的网上都有，可是能解释为什么吗？为什么有人说运行正常,不按ctrl +z我不知道那个 0 at EOF 是怎么出来的。至少在我的机子上是不行的。还有为什么这个程序还要输入再按回车！而且ctrl +z 还要在新一行才有效。

user: user-3
content: lz把题目意思理解错了

user: user-4
content: 你似乎理解错了意思吧？ while (c = getchar() != EOF)) <==>while (c = (getchar() != EOF)) 这两个是等价没有错，按照运算符的优先级，= 与 != 的优先级是同一级，而且是从右到左，所以上面两者等价，每次输入的值都与EOF进行比较，然后将表达式是否成功的结果返回给c，但是表达式的结果只有两种情况一种是0，一种是1，所以不可能会出现-1。 所以 while (c = getchar() != EOF)) 与 while ((c = getchar()) != EOF)两个并不是等价的，如果用while ((c = getchar()) != EOF)才能出现你想要的结果。你可以运行一下下面的代码，这应该符合你的要求：  #include <stdio.h> int main() { 	char c; 	while ((c = getchar()) != EOF) 		printf("1\n");  	printf("%d at EOF\n", c); 	 	return 0; }

user: user-5
content: while(c=getchar()!=EOF) 和 while((c=getchar())!=EOF) 不是一回事！

user: user-6
content: 引用 2 楼 f43310 的回复:gcc 不知道，最后一行应该为-1 at EOF吧 猜想楼主在linux下吧... 如果是的话，考虑cyd54454的建议吧。比如你输入 haha接着敲一下回车，应该是5个1。这时候第五个1对应的是\n吧。然后楼主按Ctrl+d。看看整个的pattern。

user: user-7
content: 输入什么还输出什么，就算是(c = getchar()) != EOF，按程序也是输出该字符在ASCLL表里对应的十进制的值啊

user: user-7
content: c的值只会是1或者0，不会是-1.还有EOF是要按特殊键组合的，linux下是ctrl+d,windows应该是ctrl+z

user: user-0
content: 谁有截图麻烦发一下好吗？

user: user-0
content: 引用 6 楼 angel_su 的回复:跑错程序了吧...  什么意思！没有啊！编译运行

user: user-8
content: 跑错程序了吧...

user: user-0
content: 引用 4 楼 lisong694767315 的回复:运行结果： 1 1 0 at EOF  奇怪为什么我输入什么还是什么，根本没有1 0 啊之类

user: user-9
content: 运行结果： 1 1 0 at EOF

user: user-10
content: 引用 2 楼 f43310 的回复:gcc 不知道，最后一行应该为-1 at EOF吧 我用的就是gcc (getchar()!=EOF) 的结果不是1就是0，哪来的-1

user: user-0
content: gcc 不知道，最后一行应该为-1 at EOF吧

user: user-10
content: LZ用的什么编译器和运行环境？ 书上说的没错，我的运行结果： 1 1 1 1 0 at EOF
user-0 提问:  getchar()和scanf（）连续使用 如何让scanf不读取getchar()不小心多输入的字符

回复:
user: user-0
content: 引用 1 楼 zxhuser-1 的回复:这样试试  while ((option = getchar()) != 'E')   { 	 while(getch()!='\n');         switch (option)          {         case '1':               scanf("%d", &result)； ....  谢谢你！！问题解决了 。。。不过，度娘说 getch() 要引入新的头文件了，就改为 getchar

user: user-1
content: 这样试试  while ((option = getchar()) != 'E')   { 	 while(getch()!='\n');         switch (option)          {         case '1':               scanf("%d", &result)； ....
user-0 提问: 菜鸟问一个非常简单的问题

回复:
user: user-1
content: //设置地址 int addr=0x40010000;  //准备写一个字节、两个字节、四个字节的数据 char c='A'; short s=0x0041; long i=0x00000041;  //将相应数据送进地址 *((char *)addr)=c; *((short *)addr)=s; *((long *)addr)=i;

user: user-2
content: 引用 4 楼 AnSunny 的回复:char *p = (char *)malloc(20); //申请一段20字节的内存， 把内存地址给p memset(p, 0, 20); //把这段内存清空 memcpy(p, "test", 4); //把Test写入这段内存 .....	 free(p); // 用完之后释放内存  C语言里很常用的语句， 收藏下

user: user-2
content: 俺不懂你啥意思。

user: user-3
content: 引用 7 楼 Dore_Woo 的回复:[quote=引用 6 楼 lovesmiles 的回复:] 晕倒，把你的芯片型号报上来 额，ET6240，我百度了一下，没有发现有这个芯片任何资料[/quote]  你确定ET6240是你的芯片型号？

user: user-4
content: 引用 5 楼 Dore_Woo 的回复:[quote=引用 3 楼 cyd54454 的回复:] 怎么办，没看明白要问什么！！难道是  #define GPMDAT (*(volatile unsigned long)0x123456789) GPMDAT = 1;  没看懂你写的什么，这个应该怎么写 [/quote] 好吧，我这个模式是直接给GPIO寄存器写值。你的是通过给芯片写命令来操作，没玩过，给你个网址，去参考一下里面的写命令和写数据的程序吧http://congguitang1986.blog.163.com/blog/static/128323216200911351925782/

user: user-5
content: 对于这种刚发的帖子，我总是毫不犹豫的顶了。如果火了就是个前排，可以混个脸熟，说不定谁好心就给粉了…稳赚不赔；如果沉了就感觉是我弄沉的，很有成就感，还能捞经验。

user: user-0
content: 引用 6 楼 lovesmiles 的回复:晕倒，把你的芯片型号报上来 额，ET6240，我百度了一下，没有发现有这个芯片任何资料

user: user-3
content: 晕倒，把你的芯片型号报上来

user: user-0
content: 引用 3 楼 cyd54454 的回复:怎么办，没看明白要问什么！！难道是  #define GPMDAT (*(volatile unsigned long)0x123456789) GPMDAT = 1;  没看懂你写的什么，这个应该怎么写

user: user-6
content: char *p = (char *)malloc(20); //申请一段20字节的内存， 把内存地址给p memset(p, 0, 20); //把这段内存清空 memcpy(p, "test", 4); //把Test写入这段内存 .....	 free(p); // 用完之后释放内存

user: user-4
content: 怎么办，没看明白要问什么！！难道是  #define GPMDAT (*(volatile unsigned long)0x123456789) GPMDAT = 1;

user: user-7
content: 用指针就可以了吧

user: user-0
content: 再加一个问题，怎么样在数据写了之后加上一个标识符？
user-0 提问: 关于输入数量统计的问题，新手虚心请教，谢谢

回复:
user: user-1
content: 对于第二个问题，把printf()移到循环外，让for循环从i = 0开始，就行了

user: user-1
content: 局部非静态变量没初始化，那么它的值是随机的，所以才这么奇怪，就算看上去不奇怪，你也不要被表象迷惑了。记得初始化一下，除非你明确地知道，下面马上要给这变量赋值了

user: user-2
content: 怎么又发图片。。。直接贴代码不好吗

user: user-3
content: //整数一定要初始化，否则会随意分配值 	int a[10], i = 0, n = 0, j = 0, k = 0; 	//先输入数据 	for (i=0; i<10; i++) 		scanf("%d", &a[i]);                    //进行统计 	for (i=0; i<10; i++) 	{ 		if (a[i] > 0)  			n++; 		else if (a[i] < 0) 			j++; 		else 			k++; 	} 	//打印结果 	printf("正数个数：%d，负数个数：%d，零个数：%d", n, j, k);

user: user-4
content: 0的个数显示得那么奇怪这事不奇怪，奇怪的是负数的个数为什么显示得那么不奇怪，想了半天也没想明白，j也没有初始化，为啥还能是0呢？ 而且你这循环还是从1开始的，也就是一共循环9次，呵呵。数组的第一个位置一直没有用。

user: user-5
content: 1、如图，为什么0的个数显示会这么奇怪    引用 1 楼 lisong694767315 的回复:n, j, k 都没有初始化。。。   int a[10], i, n=0, j=0, k=0;   ------------------------------------------------------------------------------------------------------------------ 2、如何将程序进一步优化为可连续输入10个数字再一次统计  将 printf 写在循环外面！

user: user-6
content: n, j, k 都没有初始化。。。   int a[10], i, n=0, j=0, k=0;
user-0 提问: 如何用C语言实现一下算法！

回复:
user: user-1
content: 引用 11 楼 cyd54454 的回复:不知道我是否有理解错楼主的意思，下面代码仅供参考  #include <stdio.h>  int main() { 	float a,flag; 	float x1,y1;  	a = 28.0; 	while(1) 	{ 		scanf("%f",&x1); 		if(x1 > 0) 		{ 			y1 = x1; 			flag = a; 			a = x1; 			x1 = flag; 		} 		else 			y1 = a; 		printf("y1 = %f\n",y1); 	} } ++ 这个应该可以了，如果有其他特殊需求的话，应该把需求说出来

user: user-2
content: 不知道我是否有理解错楼主的意思，下面代码仅供参考  #include <stdio.h>  int main() { 	float a,flag; 	float x1,y1;  	a = 28.0; 	while(1) 	{ 		scanf("%f",&x1); 		if(x1 > 0) 		{ 			y1 = x1; 			flag = a; 			a = x1; 			x1 = flag; 		} 		else 			y1 = a; 		printf("y1 = %f\n",y1); 	} }

user: user-3
content: 仅供参考 #include <stdio.h>  int main() { 	int num; 	int x1; 	int y1; 	FILE* fp; 	fp=fopen("option.ini","r"); 	if(fp==NULL) 	{ 		num=28; 	} 	else 	{ 		fscanf(fp,"%d",&num); 		fclose(fp); 	} 	fp=fopen("option.ini","w"); 	scanf("%d",&x1); 	if(x1>0) 	{ 		y1=x1; 	} 	else 	{ 		y1=num; 	} 	fprintf(fp,"%d",x1); 	fclose(fp); 	printf("%d\n",y1); 	return 0; }

user: user-4
content: 你把scanf写循环里，把a写循环外面，不就实现了吗？a总是上一个x1的值啊

user: user-5
content: 引用 7 楼 qq_18703027 的回复:哦 需要用到文件读写啊！  我试一试！ 嗯。

user: user-0
content: 哦 需要用到文件读写啊！  我试一试！

user: user-5
content: 这个程序里面没有循环，看来是需要记录到文件里面了，文件操作那块会不会？ 文件读写。 引用 5 楼 qq_18703027 的回复:#include <stido.h> void main() { float x1,y1, a,flag; a=28.0; printf("please input x1:"); scanf("%f",&x1); if(x1>0) {   y1=x1; flag=a; a=x1; x1=flag; } else y1=a; printf("%f",y1); } 程序应该是这样 我想的是每次输入x1就判断 如果>0就输出y1=x1; 这时候a=x1 当下一次在输入x1时 a的值是上一个输入的x1的值。如此类推 不可使用 stactic

user: user-0
content: #include <stido.h> void main() { float x1,y1, a,flag; a=28.0; printf("please input x1:"); scanf("%f",&x1); if(x1>0) {   y1=x1; flag=a; a=x1; x1=flag; } else y1=a; printf("%f",y1); } 程序应该是这样 我想的是每次输入x1就判断 如果>0就输出y1=x1; 这时候a=x1 当下一次在输入x1时 a的值是上一个输入的x1的值。如此类推 不可使用 stactic

user: user-6
content: 表述不清，无从下手

user: user-5
content: 如果是循环，那么把a=28.0移动到循环外面就行了。 如果是，程序已经关闭了，再次启动的时候希望a是上次的值，那么需要再输入x1的值之后记录到文件里面，或者记录到注册表中，下次程序启动的时候再读取出来。 你的情况是那种？ 引用 楼主 qq_18703027 的回复:输入x1   输出y1！  float a,flag; a=28.0; if(x1>0) {   y1=x1; flag=a; a=x1; x1=flag; } else y1=a;   有两种情况： 当x1>0  时候，输出y1 。 这时候a的值是x1的值 。 我希望的是等下一个x1 到来的时候   a  仍然是 上一个x1的值 但是我这样写的话 每一次有x1 的输入a都等于28.0  请教大神 如何在每一次x1到来的时候  a的值是等于上一个x1的值？？！ 【PS】不可使用 局部变量static  程序需要在main 函数里面 void main（） { }  请求源代码！

user: user-7
content: 能再具体描述一下问题吗？你说“我希望的是等下一个x1 到来的时候   a  仍然是 上一个x1的值” 那意味着你要进行循环输入 按你上面说的意思，直接把x1赋给a不就行了

user: user-8
content: 什么叫做“等下一个x1 到来的时候 ”？你有循环输入吗
user-0 提问: 为什么我的程序跑出段错误

回复:
user: user-0
content: 引用 2 楼 Adol1111 的回复:段错误一般都和越界有关，自己调试下很容易就找到问题了。自己试一下，这是最基本的必备技能，别一直指望别人帮你解决所有问题。 自己肯定调试了，就是找不到原因才来问问，不然跑这来干嘛？

user: user-1
content: http://pan.baidu.com/s/17yIcQ这里有链表的创建、插入、删除、反序、排序的相关代码

user: user-2
content: 引用 3 楼 zmlovelx 的回复:开debug,要么单步调试，要么运行，崩溃的时候再定位到崩溃处。  的确，debug！ --------------------------------------------------------------------------------------------------------------------------------- 这个掌握了，程序之路又好走了很多！

user: user-3
content: 开debug,要么单步调试，要么运行，崩溃的时候再定位到崩溃处。

user: user-4
content: 段错误一般都和越界有关，自己调试下很容易就找到问题了。自己试一下，这是最基本的必备技能，别一直指望别人帮你解决所有问题。

user: user-5
content: 段错误很多都是内存错误，越界。。

user: user-4
content: 引用 6 楼 yueyueniao96 的回复:[quote=引用 2 楼 Adol1111 的回复:] 段错误一般都和越界有关，自己调试下很容易就找到问题了。自己试一下，这是最基本的必备技能，别一直指望别人帮你解决所有问题。 自己肯定调试了，就是找不到原因才来问问，不然跑这来干嘛？[/quote] 抱歉，我没别的意思，如果你觉得我的话难听，我向你道歉。  你如果真debug过了，你应该就知道出错的语句是哪一句了吧。LinkList lb = L2->next;就是这句报的错。  pHead->next = Merger2(la,lb->next);这句递归调用，但你一开始没有任何判断就直接让lb = L2->next; 你不觉得有问题么。 你调用pHead->next = Merger2(la,lb->next);之前，的确判断了lb是否为NULL，但是你传递的是lb->next，并且立刻就取了L2->next; 也就是说你每次使用的都是传递前的lb->next->next;，lb不为NULL，不代表lb->next不为NULL，这样说明白了么？
user-0 提问: void *

回复:
user: user-1
content: 引用 9 楼 zxh707wk 的回复:引用 8 楼 Oringe_new 的回复:看样子卤煮是在VS直接创建项目 生成了CPP项目了 把CPP的后缀名换成C看看都说了是VC了嘛 就是说啊  只是创建了一个c++的项目 把后缀名换成C 你看他还会编译错了没？  也就是警告

user: user-2
content: 引用 3 楼 lisong694767315 的回复:在C语言中，void指针可以直接赋给其他类型的指针，如int *, char *等。但在C++中，void指针必须要明确地进行类型转换。（比如malloc函数返回值为void *类型）      void *vptr;       int *iptr = vptr; // C++中必须用int *iptr = (int *)vptr;   +1

user: user-2
content: 引用 8 楼 Oringe_new 的回复:看样子卤煮是在VS直接创建项目 生成了CPP项目了 把CPP的后缀名换成C看看都说了是VC了嘛

user: user-1
content: 看样子卤煮是在VS直接创建项目 生成了CPP项目了 把CPP的后缀名换成C看看

user: user-3
content: C语言不是强类型的. 而C++是强类型的  gcc是c语言,  而VC中是C++.  不知然否

user: user-4
content: VC++ 2013 C:\demo\test>type test.cpp #include <stdio.h> int main() {   int *p=NULL;    void * p1=NULL;    p = p1;   return 0; } //C C:\demo\test>cl /nologo /TC test.cpp test.cpp  //C++ C:\demo\test>cl /nologo /TP test.cpp test.cpp test.cpp(6) : error C2440: '=' : cannot convert from 'void *' to 'int *'         Conversion from 'void*' to pointer to non-'void' requires an explicit cast  C:\demo\test>

user: user-4
content: c c++

user: user-5
content: 加上强制类型转换就可以了。

user: user-6
content: 在C语言中，void指针可以直接赋给其他类型的指针，如int *, char *等。但在C++中，void指针必须要明确地进行类型转换。（比如malloc函数返回值为void *类型）      void *vptr;       int *iptr = vptr; // C++中必须用int *iptr = (int *)vptr;

user: user-2
content: 引用 13 楼 Adol1111 的回复:引用 9 楼 zxh707wk 的回复:[quote=引用 8 楼 Oringe_new 的回复:] 看样子卤煮是在VS直接创建项目 生成了CPP项目了 把CPP的后缀名换成C看看都说了是VC了嘛 VC何时成为一种语言了？[/quote]编译环境

user: user-7
content: 你要用c99，貌似必须加上- -std=c99

user: user-7
content: 感觉没什么意义啊- -。必要的时候就明确的类型转换就好了，用编译器去测试某种语言特性很不可取

user: user-8
content: 引用 9 楼 zxh707wk 的回复:引用 8 楼 Oringe_new 的回复:看样子卤煮是在VS直接创建项目 生成了CPP项目了 把CPP的后缀名换成C看看都说了是VC了嘛 VC何时成为一种语言了？

user: user-9
content: 从来没有VC吧？人家从打有VC那天就叫Visual C++吧？只是习惯称为VC吧？

user: user-10
content: 从如何写出编译器可以编译运行的程序角度看待编程语言是非常狭隘的。  我们要看到高级语言语义的表述功能。  void *就是表明一个没有具体类型的指针。如果你想表达这个意思，就用它，如果你想表达别的意思就不用它。  好比你完全可以不用bool char int之类的东西，所有的东西都用byte就可以搞定，为什么要区分那么多类型，就是因为那样高级语言更能用代码表现写程序人的意图。

user: user-11
content: 请用稍微新点vc版本测试后再讨论
user-0 提问: 求十个数中的最大者

回复:
user: user-1
content: for(i=0;i<=9;i++) { scanf("%d\n",&a[i]); } 去掉scanf函数中的\n   \n会去匹配一个字符，但scanf会忽略回车等空白字符，所以你需要再输入一个非空白字符，如数字，字母等

user: user-2
content: scanf中不要加\n——http://blog.csdn.net/u012421456/article/details/18501309

user: user-3
content: scanf("%d\n",&a[i]); --> scanf("%d", &a[i]);

user: user-4
content: 格式化输入的时候不要用回车控制下一次输入，代码已经帮你修改了，依然可以用回车控制输入，不过不会清空缓冲区。  #include<stdio.h> main() { 	int a[10]; 	int i,max;  	printf("please enter:"); 	for(i = 0; i <= 9; i++) 	{ 		scanf("%d", &a[i]); 	} 	max = a[0]; 	for(i = 1; i <= 9; i++) 	{ 		if(max < a[i]) 		{ 			max = a[i]; 		} 	} 	printf("%d\n", max); }

user: user-5
content: #include <stdio.h>  main() {     int a[10];     int i,max;     printf("please enter:");     for(i = 0; i < 10; i++)     {         scanf("%d", &a[i]);     }     max = a[0];     for(i = 1; i < 10; i++)     {         if(max < a[i])         {             max = a[i];         }     }     printf("%d\n", max); }

user: user-6
content: 这个显然如1楼不必11个数。
user-0 提问: wireshark在windows环境下编译时出现的can't find "stdio.h"的问题怎么解决？

回复:
user: user-1
content: 引用 9 楼 u011692164 的回复:[quote=引用 楼主 u011692164 的回复:]   重新安装了VS2010，安装时选择了C++，问题解决！[/quote]  选择C++，是什么意思？安装有这个选项？  是新建工程才可以选择吧

user: user-0
content: 引用 楼主 u011692164 的回复:  重新安装了VS2010，安装时选择了C++，问题解决！

user: user-2
content: 引用 2 楼 u011692164 的回复:[quote=引用 1 楼 lovesmiles 的回复:] Makefile的include路径没有写好。  找到stdio.h文件所在路径。直接用set PATH = 路径 试试看？  这是config.nmake文件中关于PATH的设置，我使用的是默认的配置，没有改动。   这是在本机搜索到的stdio.h文件   在windows上安装cygwin时也在“我的电脑”中设置了环境变量  你说的“set PATH= 路径” 这里要选择哪一个？需要在config.nmake中修改哪一个PATH？[/quote] 直接在CMD窗口里面设，这个是一个全局的设置。

user: user-0
content: 引用 1 楼 lovesmiles 的回复:Makefile的include路径没有写好。  找到stdio.h文件所在路径。直接用set PATH = 路径 试试看？  这是config.nmake文件中关于PATH的设置，我使用的是默认的配置，没有改动。   这是在本机搜索到的stdio.h文件   在windows上安装cygwin时也在“我的电脑”中设置了环境变量  你说的“set PATH= 路径” 这里要选择哪一个？需要在config.nmake中修改哪一个PATH？

user: user-2
content: Makefile的include路径没有写好。  找到stdio.h文件所在路径。直接用set PATH = 路径 试试看？

user: user-0
content: 引用 7 楼 lovesmiles 的回复:话说回来，你已经装了cygwin为什么还用vc的nmake?  看下面这篇博客，写的是如何在windows上编译wireshark源码 http://blog.sina.com.cn/s/blog_6d42182e0100y0il.html  能搜到的编译wireshark源码的方法都是这样，  不一样的是我用的VS2010，我用的源码版本是wireshark-1.8.15，其中config.nmake中默认就是打开的VS2010编译器，所以配置也没有修改

user: user-2
content: 话说回来，你已经装了cygwin为什么还用vc的nmake?

user: user-0
content: 引用 1 楼 lovesmiles 的回复:Makefile的include路径没有写好。  找到stdio.h文件所在路径。直接用set PATH = 路径 试试看？  设置后 问题还是没有解决 是不是应该在wireshark源码的config.nmake中修改库什么的？ 我搜索网上很多内容都是在这一步nmake -f Makefile.nmake all直接通过的，没见出我这样的问题。。。

user: user-2
content: 引用 4 楼 u011692164 的回复:[quote=引用 1 楼 lovesmiles 的回复:] Makefile的include路径没有写好。  找到stdio.h文件所在路径。直接用set PATH = 路径 试试看？   这样不行 貌似会附带掉原来的环境变量，连nmake这个命令也不能使用了！  c:\wireshark-1.8.15>set PATH=C:\cygwin\usr\include  c:\wireshark-1.8.15>nmake -f Makefile.nmake all 'nmake' 不是内部或外部命令，也不是可运行的程序 或批处理文件。  [/quote] 把命令改成下面的再试一下： set path=%path%;C:\cygwin\usr\include

user: user-0
content: 引用 1 楼 lovesmiles 的回复:Makefile的include路径没有写好。  找到stdio.h文件所在路径。直接用set PATH = 路径 试试看？   这样不行 貌似会附带掉原来的环境变量，连nmake这个命令也不能使用了！  c:\wireshark-1.8.15>set PATH=C:\cygwin\usr\include  c:\wireshark-1.8.15>nmake -f Makefile.nmake all 'nmake' 不是内部或外部命令，也不是可运行的程序 或批处理文件。
user-0 提问: 高手帮我看看，这个程序到底怎么读懂？

回复:
user: user-1
content: VS IDE中，在不明白的符号上点鼠标右键，选转到定义。

user: user-2
content: ALLOC_UNITS(s) (((s) + sizeof(struct tpmemory) - 1) / sizeof(struct tpmemory) + 2) 这是定义了一个宏，比如：ALLOC_UNITS(5)，宏展开就相当于：((5+sizeof(struct tpmemory)-1)/sizeof(struct tpmemory)+2)

user: user-3
content: 基础不扎实的结果，多熟悉一下基础就明白了 这代码只是多了一点，简化看就是基础的东西

user: user-4
content: ALLOC_UNITS(size)这个宏是这样子： 将size除以tpmemory的大小，得到商，这个商向上取整，同时额外再给它加2 比如size是128，tpmemory是24的话，128/24=5.03，向上取整就是6，然后加上2，结果就是 8。   这个宏的意义应该是一种特殊的文件格式，2个字节相当于文件头或文件尾，5.03个文件元素，至少要6个元素才能存放。 p2是指向分配的内存的最后一个单元。    p2->len   = p->len   = size;     p2->magic = p->magic = 0xfee1900d; /*这个也看不懂啊*/ 这里是将最后一个单元设置成指明本文件的长度和魔数的值。这个设置要看具体的协议是什么才有意义。   你的这段代码很有可能是某一种特殊文件的文件头的初始化用的。 你要看这个协议对各个字节的定义才能看得明
user-0 提问: 我是一个大菜鸟  一点都不懂C语言  想学习一下  求谭浩强的全部教程下载地址   事成加 QQ 七天以后有惊喜呦

回复:
user: user-1
content: 引用 楼主 mixuema 的回复:我是一个大菜鸟  一点都不懂C语言  想学习一下  求谭浩强的全部教程下载地址    谢了  事成加 QQ 七天以后有惊喜呦 忠告：不要看谭浩强的，否则你以后会遇到很多与你所学知识相悖的难题，然后就在这个弯弯里绕来绕去。 推荐看这本：C程序设计语言(第2版•新版) 克尼汉、等、 徐宝文 机械工业出版社 (2004-01)

user: user-2
content: http://www.verycd.com/search/folders/%E8%B0%AD%E6%B5%A9%E5%BC%BA  -*---------------------------------------------------------------------------------------------------------------------------  作为IT狗，搜索功能必须有！

user: user-3
content: 这个难道搜不到吗？？？——http://www.gfsoso.com/?q=%25~E~8~%25~B~0~%25~A~D~%25~E~6~%25~B~5~%25~A~9~%25~E~5~%25~B~C~%25~B~A~c~%25~E~8~%25~A~F~%25~A~D~%25~E~8~%25~A~8~%25~8~0~%25~E~8~%25~A~7~%25~8~6~%25~E~9~%25~A~2~%25~9~1~%25~E~6~%25~9~5~%25~9~9~%25~E~7~%25~A~8~%25~8~B~

user: user-0
content: 我想要视频教程  不想看书

user: user-0
content: 谢了  惊喜么 就是给你 开个会员什么的  有QB  不花也白搭

user: user-4
content: http://www.eshuba.com/soft/7974.htm

user: user-5
content: 有什么惊喜？难道你还打算以身相许吗？
user-0 提问: qt调试无法开始 求助

回复:
user: user-1
content: 在vs中使用qt完破

user: user-2
content: 这是需要支持python的GDB版本，如果不想换GDB的话，换个较低版本的Qt creator可以解决，我换了个3.0.1的qt creator就可以了 http://mirrors.ustc.edu.cn/qtproject/official_releases/qtcreator/

user: user-0
content: 噢 我去试试看 多谢了！！

user: user-3
content: 引用 2 楼 flyingark 的回复:噢， 那我电脑里面是不是还要另外安装Python? Python倒未必要另装, 可能QtCreator里自带了, 而且你现在报的这个错说明你需要一个支持Python的GDB, 不是Python本身

user: user-0
content: 噢， 那我电脑里面是不是还要另外安装Python?

user: user-3
content: 不是你代码本身的问题, 是QPCreator自己需要gdb支持python. 所以你需要换一个支持Python的gdb
user-0 提问: 关于指针的问题，求大神急救！！！！在线等！

回复:
user: user-1
content: 引用 7 楼 Adol1111 的回复:给楼上几位大神跪了....最基本的溢出都不处理一下么....     scanf("%s",a);     getchar();     scanf("%s",b);     getchar(); 改为     scanf("%99[^\n]",a);     getchar();     scanf("%99[^\n]",b);     getchar();

user: user-2
content: 给楼上几位大神跪了....最基本的溢出都不处理一下么....

user: user-3
content: 引用 7 楼 Adol1111 的回复:给楼上几位大神跪了....最基本的溢出都不处理一下么....这个由lz自己解决。。。

user: user-4
content: 你将复制循环语句写为我上面写的那个就可以啦

user: user-4
content: 这样写下 a[100]={0} 就行啦   至于为什么，你有没有考虑 a[100] 里面是什么值   你在赋值的那个while循环 写if(*(p+i)==100)  ....... i++ 这两句时候 有没有想到 a[100]里面j就出现一个'\0'(就是你输入字符串的结尾符 就这一个) 其余的除了你的字符串外都是随机值你怎么能保证 字符串后面全都是 '\0'   所以你先初始化全为0后你的程序可以运行   当然你也可以不用这么写循环复制语句           while(*(p+i)!='\0') 		i++; 	while(1) 	{ 		if(*(p1+k)=='\0') 		{ 			*(p+i)='\0'; 			break;	 		}		 		else 		{ 			*(p+i)=*(p1+k); 			i++; 			k++; 		} 	}

user: user-5
content: 把void output(char a[],char b[])里面的第一个while循环改成 	while(1){ 		if(*(p+i)=='\0') 		{ 			while(*(p1+k) != '\0') 			{ 				*(p+i++) = *(p1+k++); 			} 			*(p+i) = '\0'; 			break; 		} 		i++; 	}

user: user-3
content: gcc编译运行无误 仅供参考 #include <stdio.h>  void merger_str(char a[],char b[]) { 	while(*a) 	{ 		a++; 	} 	while(*b) 	{ 		*a=*b; 		a++; 		b++; 	} 	*a='\0'; }  int main() { 	char a[100]; 	char b[100]; 	scanf("%s",a); 	getchar(); 	scanf("%s",b); 	getchar(); 	merger_str(a,b); 	puts(a); 	return 0; }

user: user-0
content: 自己顶了！！！在线等大神！
user-0 提问: 串口通信 ，程序打开可以接收到数据，一段时间后接收不到

回复:
user: user-1
content: http://wenku.baidu.com/link?url=yBnW6qsQi4efOjk5G0jhjCfe8EKXKyydofK1LMQHZkw6QCIZ5CDE34mb-Aw9tqUhxWbLo_I-IxOlp_4h_JbhQvB_3VR5wPH-lNtGv79_MNK  -*-------------------------------------------------------------------------------------------------------------------------------  http://wenku.baidu.com/link?url=se1d-uCgAdu8JhdI4B4m6XgH3znofqyRqVaogjmwVUgERO90AE_oNXOxANPLkrM8FORXuZ2RYWU1sJ162KutiNeA256EhO33LeNOYFoFQlS
user-0 提问: 初始化二维数组错误elements of array GF_MUL have incomplete type

回复:
user: user-1
content: 应该这样：GF_MUL[][6] 二维数组只能第一个括号里空着，第二个括号不能空着

user: user-2
content: 看 C语言二维数组的定义和引用 和 c语言关于定义二维数组的问题

user: user-3
content: 有提示啊，GF_MUL不确定类型，你需要指定至少最后面的那个维度，GF_MUL[][6]，至少写成这样，不能全空着。

user: user-4
content: 应该是这样 const char GF_MUL[][6] = {     {0x00,0x00,0x00,0x00,0x00,0x00},{0x02,0x03,0x09,0x0b,0x0d,0x0e},     {0x04,0x06,0x12,0x16,0x1a,0x1c},{0x06,0x05,0x1b,0x1d,0x17,0x12},     {0x08,0x0c,0x24,0x2c,0x34,0x38},{0x0a,0x0f,0x2d,0x27,0x39,0x36},     {0x0c,0x0a,0x36,0x3a,0x2e,0x24},{0x0e,0x09,0x3f,0x31,0x23,0x2a},     {0x10,0x18,0x48,0x58,0x68,0x70},{0x12,0x1b,0x41,0x53,0x65,0x7e},     ......     }

user: user-0
content: 有没有人啊。。。
user-0 提问: 新手学习：网上找的TrueCrypt的开源代码,如何用vc6.0之类的编译器调试、利用？

回复:
user: user-0
content: 谢谢大家的回帖，总算可以入门了！

user: user-0
content: 太感谢了，终于有点思路了！刚刚接触这方面的知识，还没有入门，前辈能不能给点学习建议，简单分享哈学习经验，再次谢过了！ 引用 3 楼 mLee79 的回复:trueCrypt 主要的东西是驱动程序, 调试驱动还是比较麻烦的, 你还是先找个简单的东西玩玩吧.. 调驱动要简单就在虚拟机里调试, pipe模拟串口,  用 WinDbg 调试, 就是串口的速度实在是太慢.  再简单点就在虚拟机里用 SoftICE 调, 速度快点.  要跟的舒服点, 就双机调. 人不有 Makefile 了么,  看看是 GNU Makefile 还是 nmake 的语法, 跑下 make 或者是 nmake 啥的就是了...

user: user-1
content: http://www.osronline.com/

user: user-2
content: trueCrypt 主要的东西是驱动程序, 调试驱动还是比较麻烦的, 你还是先找个简单的东西玩玩吧.. 调驱动要简单就在虚拟机里调试, pipe模拟串口,  用 WinDbg 调试, 就是串口的速度实在是太慢.  再简单点就在虚拟机里用 SoftICE 调, 速度快点.  要跟的舒服点, 就双机调. 人不有 Makefile 了么,  看看是 GNU Makefile 还是 nmake 的语法, 跑下 make 或者是 nmake 啥的就是了...

user: user-3
content: 如果是visual c++不是应该打开.dsw文件吗
user-0 提问: 问一个关于内存空间的问题！

回复:
user: user-1
content: 引用 4 楼 cyd54454 的回复:+2，另#ragma pack(n)可以设置按n字节对齐： #pragma pack(4)//设定为4字节对齐建议由编译器自己决定

user: user-2
content: 内存对齐问题，面试必考，楼主要好好研究清楚

user: user-3
content: 字节对齐，这与cpu有关，只需知道有这么一回事，无普遍的规律，使用sizeof()获取大小即可。

user: user-4
content: 引用 3 楼 zxh707wk 的回复:[quote=引用 1 楼 zjq9931 的回复:] 结构体，内存对齐问题。 以最大的元素为基准，结构体占的字节大小是其整数倍。+1[/quote] +2，另#ragma pack(n)可以设置按n字节对齐： #pragma pack(4)//设定为4字节对齐

user: user-1
content: 引用 1 楼 zjq9931 的回复:结构体，内存对齐问题。 以最大的元素为基准，结构体占的字节大小是其整数倍。+1

user: user-5
content: http://wenku.baidu.com/link?url=o65gcsvgEzTE3_cW_YWp4Yr-kdyDfh4I4rBmg9eTS1oGH-RBHEv-dPudaVYcljjB76ie3_Ew1OIc6IPBE6eDoRddazgpefJfI8GQPLgyLfO

user: user-5
content: 结构体，内存对齐问题。 以最大的元素为基准，结构体占的字节大小是其整数倍。
user-0 提问: 宏指定函数出错

回复:
user: user-1

user: user-0
content: 引用 楼主 applemind 的回复:#define A(x) a_#x()  void a_display() {     printf("Hello world\n"); }  int main(int argc, char **argv) {     A(display); }  这段程序出错的结果如下 main.c: In function ‘main’: main.c:30:14: error: ‘a_’ undeclared (first use in this function)  #define A(x) a_#x()               ^ main.c:41:9: note: in expansion of macro ‘A’          A(display);          ^ main.c:30:14: note: each undeclared identifier is reported only once for each function it appears in  #define A(x) a_#x()               ^ main.c:41:9: note: in expansion of macro ‘A’          A(display);          ^ main.c:41:18: error: expected ‘;’ before string constant          A(display);                   ^ main.c:30:17: note: in definition of macro ‘A’  #define A(x) a_#x()    要怎么修改才能达到A(display)就能调用a_diaplay函数的效果？  奇怪，之前第一次用 “##”的是出错的，所以才改用“＃”！ 现在测试可以了！ 谢了！

user: user-2
content: 建议楼主可以看下预处理后的文件，就一目了然了

user: user-2
content: #这玩意儿的意思是字符串后面的参数，所以A(display);就是等于是 a_"display"();当然会出错了 应该是 ，define A(x) a_##x()
user-0 提问: 请问一个简单c语言问题

回复:
user: user-1
content: 完全不懂这个a1:8;意思。，，求大神指导一下哈。。。菜鸟一枚！

user: user-2
content: #include <stdio.h>  int main() { 	int a = 0x12345678; 	 	printf("%d\n", a & 0xFF); 	printf("%d\n", (a >> 8) & 0xFF); 	printf("%d\n", (a >> 16) & 0xFF); 	printf("%d\n", (a >> 24) & 0xFF); 	 	return 0; }   int类型占4个字节，所以只需要按位取每一个字节的数据就行了，然后把其他字节的数据清0，然后输出出来就好了。同理，其他类型的数据也可以这样处理。

user: user-3
content: int i; char b[4]; b[0]=((char *)&i)[0]; b[1]=((char *)&i)[1]; b[2]=((char *)&i)[2]; b[3]=((char *)&i)[3];

user: user-4
content: 引用 9 楼 lk0098 的回复:[quote=引用 4 楼 lovesmiles 的回复:] 楼上都说光了，我也说两种吧  int a; char *p=(char *)&a p[0], p[1],p[2],p[3]   另一种  int a; b=a>>24; c=(a>>16)&0x000000ff d=(a>>8)&0x000000ff e=a&0x000000ff  同意这个方法，最直观了。[/quote]+1

user: user-5
content: 引用 4 楼 lovesmiles 的回复:楼上都说光了，我也说两种吧  int a; char *p=(char *)&a p[0], p[1],p[2],p[3]   另一种  int a; b=a>>24; c=(a>>16)&0x000000ff d=(a>>8)&0x000000ff e=a&0x000000ff  同意这个方法，最直观了。

user: user-6
content: 我觉得你这个需求，用联合体比较好。  引用 7 楼 donaldsy 的回复:[quote=引用 2 楼 zxh707wk 的回复:] 用位段仅供参考 #include <stdio.h>  struct num { 	int a1:8; 	int a2:8; 	int a3:8; 	int a4:8; }; int main() { 	int n=100; 	struct num* m; 	m=(struct num*)&n; 	printf("%d\n%d\n%d\n%d\n",m->a1,m->a2,m->a3,m->a4); 	return 0; }  大神呐，我咋没有想到呢，还琢磨了很久[/quote]

user: user-7
content: 引用 2 楼 zxh707wk 的回复:用位段仅供参考 #include <stdio.h>  struct num { 	int a1:8; 	int a2:8; 	int a3:8; 	int a4:8; }; int main() { 	int n=100; 	struct num* m; 	m=(struct num*)&n; 	printf("%d\n%d\n%d\n%d\n",m->a1,m->a2,m->a3,m->a4); 	return 0; }  大神呐，我咋没有想到呢，还琢磨了很久

user: user-8
content: 引用 5 楼 zxh707wk 的回复:[quote=引用 4 楼 lovesmiles 的回复:] 楼上都说光了，我也说两种吧  int a; char *p=(char *)&a p[0], p[1],p[2],p[3]   另一种  int a; b=a>>24; c=(a>>16)&0x000000ff d=(a>>8)&0x000000ff e=a&0x000000ff[/quote]  ---------------------------------------------- 无耻的引用楼上各位： 不忘加上一句，仅供参考！

user: user-9
content: 引用 4 楼 lovesmiles 的回复:楼上都说光了，我也说两种吧  int a; char *p=(char *)&a p[0], p[1],p[2],p[3]   另一种  int a; b=a>>24; c=(a>>16)&0x000000ff d=(a>>8)&0x000000ff e=a&0x000000ff

user: user-10
content: 楼上都说光了，我也说两种吧  int a; char *p=(char *)&a p[0], p[1],p[2],p[3]   另一种  int a; b=a>>24; c=(a>>16)&0x000000ff d=(a>>8)&0x000000ff e=a&0x000000ff

user: user-11
content: 用union也行  #include <stdio.h>  union { 	int a; 	char b[4]; }num;  int main() { 	num.a = 0x12345678;  	printf("%d\n",(int)num.b[0]); 	printf("%d\n",(int)num.b[1]); 	printf("%d\n",(int)num.b[2]); 	printf("%d\n",(int)num.b[3]);  	return 0; } /*  *output:  *	120 -->0x78  *	86	-->0x56  *	52	-->0x34  *	18	->>0x12  */

user: user-9
content: 用位段仅供参考 #include <stdio.h>  struct num { 	int a1:8; 	int a2:8; 	int a3:8; 	int a4:8; }; int main() { 	int n=100; 	struct num* m; 	m=(struct num*)&n; 	printf("%d\n%d\n%d\n%d\n",m->a1,m->a2,m->a3,m->a4); 	return 0; }

user: user-12
content: 读二进制的数？
user-0 提问: txt文档显示在mini2440开发板上   急急急

回复:
user: user-1
content: 我硬件开放方面并不熟，似乎 @anyidan 很熟，可以找下他。

user: user-1
content: 引用 4 楼 Y_yueyueyue 的回复:我的开发板就是320*240的   然后每页是20*15个字    40*15个字符   m=i/40-15*x;//第几行,m 控制行   这个减号是什么意思呢 buff[120000]={0}   这个数组  我百度了    // 字符 40x15=600个ASC, 300个汉字       但是还是不懂 i是第几个字符/40,算出来第几行。 x=jj/600;一屏幕有600个字节40*15，x应当是页数的意思吧？ 行数，减去已经翻过的页数，得出应当是在当前屏幕的第几行。 应当是这个意思。  buff[120000]={0}   -------------------- 这个就是显示缓冲区吧，用来存储要显示的字符的。可以存储12W个字节。

user: user-2
content: 路过。。。

user: user-0
content: 你讲的都是正确的

user: user-1
content: 引用 7 楼 Y_yueyueyue 的回复:非常感谢，已经帮我解答了这么多问题了，从没想过网友也这么乐于助人  。  嘿嘿嘿 ……    我会找@anyidan 的  ，希望他也想你这么热心 ，   嘿嘿嘿……

user: user-0
content: 非常感谢，已经帮我解答了这么多问题了，从没想过网友也这么乐于助人  。  嘿嘿嘿 ……    我会找@anyidan 的  ，希望他也想你这么热心 ，   嘿嘿嘿……

user: user-0
content: 我的开发板就是320*240的   然后每页是20*15个字    40*15个字符   m=i/40-15*x;//第几行,m 控制行   这个减号是什么意思呢 buff[120000]={0}   这个数组  我百度了    // 字符 40x15=600个ASC, 300个汉字       但是还是不懂

user: user-1
content: 前面三句不用猜了吧？  m=i/40-15*x;//第几行,m 控制行 -------------------------- 一行40个字节，字符高度占15个像素？  j=16*m;// j换行 ---------------- 一行占16个像素，行与行之间有一个像素的空闲？  我大概只能猜这么多。

user: user-0
content: char buff[120000]={0}; n = fread(buff,1,120000,fp);//man  fread 	memset(tempbuf,0,sizeof(tempbuf)); 	x=jj/600; 	for(i=jj,k=0;i<jj+600;) 	{ 		m=i/40-15*x;//第几行,m 控制行 		j=16*m;// j换行 		if((i%40)==0)	 		k=0;	 //x坐标复位    能帮我解释下着段程序么

user: user-1
content: 定宽字符： 屏幕的大小（总像素数-留白像素数）/单个字像素数=一屏的字数。 如果一行的宽度会有不完整的字，那么只取整数部分就可以。 变宽字符： 每个字所占的像素数累计。 一行一行计算。  翻页无非就是计算出现在显示到哪个字符了，然后下一页从哪个字符开始显示。
user-0 提问: 新手做题的时候有一个疑惑，希望各位能帮我解答

回复:
user: user-0
content: 好的！！谢谢各位！！谢谢！！我会好好努力！

user: user-1
content: 引用 3 楼 wangqing008 的回复:2,3楼正解啊+1

user: user-1
content: 直接发代码不行吗，怎么又是发图片的

user: user-2
content: 楼上都说了，楼主可以仔细阅读下相关书籍里关于scanf，printf这一类函数介绍，这种问题以后就不会犯了。scanf是会忽略空白字符（如空格，tab，'\n'等）的。像楼主程序中，它一直试图匹配'\n'，那肯定永远也匹配不了（因为看不见），它一直苦苦的找啊找啊，这时候来了一个非空白字符，它总算看到了，结果发现不是自己要找的，就结束寻觅了，把这玩意留给后面了。

user: user-3
content: scanf("%f",&r); 不要添加换行符。

user: user-4
content: 2,3楼正解啊

user: user-5
content: scanf("%f\n",&r); 其中的\n和空格匹配多个空白符，所以要直到出现非空白符scanf才返回，继续执行之后的语句  正确的是 scanf("%f",&r);

user: user-6
content: 吧 scanf中的 \n 去掉试试
user-0 提问:  /lib/modules/3.11.0-15-generic/build is not configured

回复:
user: user-0
content: 引用 2 楼 zxhuser-2 的回复:对于这种刚发的帖子，我总是毫不犹豫的顶了。如果火了就是个前排，可以混个脸熟，说不定谁好心就给粉了…稳赚不赔；如果沉了就感觉是我弄沉的，很有成就感，还能捞经验。

user: user-1
content: 试试吧。我编译源代码，一般都是这个步骤 chmod -R 777 文件名 ./configure

user: user-2
content: 对于这种刚发的帖子，我总是毫不犹豫的顶了。如果火了就是个前排，可以混个脸熟，说不定谁好心就给粉了…稳赚不赔；如果沉了就感觉是我弄沉的，很有成就感，还能捞经验。

user: user-0
content: root@ubuntu:/home/openvswitch-2.0.0# ./configure CC=gcc-4.2   checking for a BSD-compatible install... /usr/bin/install -c checking whether build environment is sane... yes checking for a thread-safe mkdir -p... /bin/mkdir -p checking for gawk... no checking for mawk... mawk checking whether make sets $(MAKE)... yes checking for gcc... gcc-4.2 checking whether the C compiler works... no configure: error: in `/home/openvswitch-2.0.0': configure: error: C compiler cannot create executables See `config.log' for more details   root@ubuntu:/home/openvswitch-2.0.0# dpkg -l gcc Desired=Unknown/Install/Remove/Purge/Hold | Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend |/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad) ||/ Name                        Version                     Description +++-===========================-===========================-====================================================================== ii  gcc                         4:4.6.3-1ubuntu5            GNU C compiler   这是什么情况？
user-0 提问: 求高手 函数调用 跟传入值不一致 GDB

回复:
user: user-0
content: 没有满意答案 结贴 给分

user: user-0
content: 想知道是什么原理 导致了这样的错误

user: user-1
content: guint service_id  gint64 service_id  两种类型在内存中的表示方式不一样。改成一至的试下。同时检查A函数内部有没有改变这个参数值的代码

user: user-0
content: 还有哪位能给出更详细的解释吗

user: user-2
content: gdb bug 更新至最新版

user: user-3
content: 再猜测一下，你是没有前向声明gint A (gint64 service_id, GList **list, gboolean single)这个函数吧，导致调用该函数的时候，编译器默认为传递参数类型是int型的了，结果你取值用的是别的类型的方式，那值肯定就不对了

user: user-3
content: 刚去验证了一下，打印地址出错的确就是上面说的那样。至于值不对，我这没发现

user: user-3
content: 我猜测一下：部分参数传递只用到寄存器，并没有放入栈。所以你打印地址就会出错，因为寄存器没有地址
user-0 提问: 不知道创建链表的时候出现了什么问题，求指导

回复:
user: user-0
content: #include<stdio.h> #include<malloc.h> #define NULL 0 #define LEN sizeof(struct student) struct student { 	long num; 	char name[10]; 	char sex; 	int years; 	struct student *next; }; int n,m; struct student *creat() { 	struct student *head; 	struct student *p1,*p2; 	n=0; 	p1=p2=(struct student *)malloc(LEN); 	scanf("%d%s%c%d",&p1->num,p1->name,&p1->sex,&p1->years); 	head=NULL; 	while(p1->num!=0) 	{ 		n=n+1; 		if(n==1) 			head=p1; 		else 			p2->next=p1; 		p2=p1; 		p1=(struct student *)malloc(LEN); 		scanf("%d%s%c%d",&p1->num,p1->name,&p1->sex,&p1->years); 	} 	p2->next=NULL; 	return(head); } struct student *del_a(struct student *heada,int y) { 	struct student *pa1,*pa2,*head; 	head=heada; 	pa1=pa2=heada; 		while(y!=pa1->years&&pa1!=NULL) 		{ 			pa2=pa1; 			pa1=pa1->next; 		} 		if(y==pa1->years) 		{ 			if(pa1->next!=NULL) 			{ 				if(pa1==head) 				{ 					pa1=pa2=head=pa1->next; 				} 				else 				{ 					pa1=pa1->next; 					pa2->next=pa1; 				} 			} 			else 			{ 				if(pa1==head) 				{ 					head=NULL; 				} 				else 					pa2->next=pa1=NULL; 			} 			n--; 		} 	return(head); } void print(struct student *head) { 	struct student *p; 	printf("\nNow,These %d records are:\n",n); 	p=head; 	if(head!=NULL) 		do 		{ 			printf("%ld,%s,%c,%d\n",p->num,p->name,p->sex,p->years); 			p=p->next; 		}while(p!=NULL); } void main() { 	int y; 	struct student *qa; 	qa=creat(); 	print(qa); 	scanf("%d",&y); 	qa=del_a(qa,y); 	print(qa); }

user: user-0
content: 引用 1 楼 user-1 的回复:倒数第二行，printf，少个f 其他的没看，，代码好乱 你发帖的时候有专门贴代码的地方的这是引用的一个函数

user: user-1
content: 倒数第二行，printf，少个f 其他的没看，，代码好乱 你发帖的时候有专门贴代码的地方的
user-0 提问: [求助]char类型的数组在栈内存中的分配问题，请教一下大家

回复:
user: user-0
content: 引用 4 楼 lin5161678 的回复:和入栈完全没关系   你这里定义的2个数组 唯一可以确定是只有  数组a 的内存绝对不会和 数组b 的内存发生任何形式的重叠  除此之外的包括 a在b之前 a在b之后 a和b直接有没有填充 a和b之间填充多少字节 都是不做任何保证 不做任何约束的   另外 内存对齐只是填充字节的理由之一  填充字节还有许多其他原由 包括不限于 检查是否读写越界的保护字节 为其他变量准备的字节 编译器作者的恶趣味 [就是老子高兴] ......  回答的深入浅出！应该是最对我胃口的答案了，感谢！

user: user-0
content: 引用 3 楼 henry3695 的回复:  #include <stdio.h>  void abc(int a,int b,int c) { 	printf("a=0x%p\nb=0x%p\nc=0x%p\n",&a,&b,&c); } int main() { // 	char a[64]; // 	char b[64]; //  // 	printf("a[63] = %d \na[0]  = %d  \nb[63] = %d  \nb[0]  = %d\n", &a[63], a, &b[63], b);   	int a,b,c; 	abc(a,b,c); 	return 0; }  //楼主那个是在栈区分配内存，这个分配是随机的吧，就是随计算机系统来分配的，看到哪里有空的内存，他就给你分配一块 //所以两个数组不一定相邻的， //看下我写的例子，a,b,c的地址就是相邻的，楼主可以这样思考问题，必成大牛  看来函数内部的变量，只有入参是有入栈和出栈的操作的。  基础太薄弱，还有很多要学的，十分感谢！

user: user-0
content: 引用 1 楼 user-7 的回复:引用按照入栈的顺序，a先入，b后入  但是为什么a[0]和b[63]之间相差了几个字节呢？应该也不存在内存对齐的问题啊？  这里没有入栈出栈哦。  相差多少都是可以的， 编译器有这个自由。  输出地址要用%p 学习了，看来以前我一直在概念上有错误。 为了理解这个小程序，我用vc把他弄成汇编的看了下，确实这种局部变量不是push和pop操作，而是系统直接在栈内申请内存。

user: user-1
content: 输出地址应该用%p 下图是我运行程序输出的结果  a[63] 与 a[0] 相差3F转换成十进制也就是63，char是占用1个字节，而你数组长度也就是64个字节，所以并没有什么问题

user: user-2
content: 怎么看都是输出从a[63]开始连续4字节中位置存放的一个int而不是输出&a[63]地址。  输出的内容和连续不连续有一毛钱关系吗？

user: user-3
content: 学习了。。。。。

user: user-4
content: 换成release版本的，就不会有疑问了，呵呵呵  别问细节，太基础了，要讲的东西太多

user: user-5
content: 和入栈完全没关系   你这里定义的2个数组 唯一可以确定是只有  数组a 的内存绝对不会和 数组b 的内存发生任何形式的重叠  除此之外的包括 a在b之前 a在b之后 a和b直接有没有填充 a和b之间填充多少字节 都是不做任何保证 不做任何约束的   另外 内存对齐只是填充字节的理由之一  填充字节还有许多其他原由 包括不限于 检查是否读写越界的保护字节 为其他变量准备的字节 编译器作者的恶趣味 [就是老子高兴] ......

user: user-6
content: #include <stdio.h>  void abc(int a,int b,int c) { 	printf("a=0x%p\nb=0x%p\nc=0x%p\n",&a,&b,&c); } int main() { // 	char a[64]; // 	char b[64]; //  // 	printf("a[63] = %d \na[0]  = %d  \nb[63] = %d  \nb[0]  = %d\n", &a[63], a, &b[63], b);   	int a,b,c; 	abc(a,b,c); 	return 0; }  //楼主那个是在栈区分配内存，这个分配是随机的吧，就是随计算机系统来分配的，看到哪里有空的内存，他就给你分配一块 //所以两个数组不一定相邻的， //看下我写的例子，a,b,c的地址就是相邻的，楼主可以这样思考问题，必成大牛

user: user-7
content: 入栈的顺序也是不确定的。

user: user-7
content: 引用按照入栈的顺序，a先入，b后入  但是为什么a[0]和b[63]之间相差了几个字节呢？应该也不存在内存对齐的问题啊？  这里没有入栈出栈哦。  相差多少都是可以的， 编译器有这个自由。  输出地址要用%p
user-0 提问: 求解释两段代码

回复:
user: user-1
content: 无限制的死循环进入while（）之后C的值不会改变没法调出循环。

user: user-2
content: 建议楼主要自己去调试调试，这问题马上就会发现了

user: user-2
content: 看书还是要仔细的，字符串什么的最后必须以‘\0'结尾，不然类似strlen(s)，printf("%s\n",s)等等，都可能会出错，表面看上去没出错也只是随机情况。 #include <stdio.h>  int main() { 	int i =0, c; 	char s[10];  	while (i < 9){ 		while (c = getchar()){ 			while (c != '\n'){ 				while (c != EOF){    //因为c的值不会变化，一旦进入循环就是个死循环 					s[i] = c; 					i = i + 1; 				} 			} 		} 	} 	s[i] = '\0'; 	printf("%s", s);  	return 0; }

user: user-3
content: printf("%s", s);输出字符串就是一个'\0'为标识的，遇到‘\0’就停止输出。如果字符数组最后没有'\0'结束符，则printf会一直沿内存输出，直到遇到'\0'

user: user-3
content: 引用 1 楼 lisong694767315 的回复: #include <stdio.h>   int main() {     int i =0, c;     char s[10];       while (i < 9){         if (c = getchar()){             if (c != '\n'){                 if (c != EOF){                     s[i] = c;                 }             }         } 	++i;     }     s[9] = '\0';     printf("%s", s);       return 0; }   s[9] = '\0';错了，应该是 s[i] = '\0';

user: user-4
content: 这个可能要去理解字符串吧，其实我的理解很简单 系统输出字符串数组时是以"\0"（引号中的部分）作为字符串结尾的。在\0之前的字符全都会被输出。而你的数组中没有定义\0，所以系统就不知道何时结束输出。 最后要输出这个char类型数组，就必须以‘\0’结尾的 http://zhidao.baidu.com/link?url=CFqnZXYdB7W6wamqWygkEld7jreASNC0ccmncnwvsx66zfOC51WGVGn4DfTENacVulbQUxqwJkTeLsMWipoeRq

user: user-3
content: 第一段代码：里面三个while应该改成if条件判断，每次都要更新变量++i，字符数组最后应该添加'\0'结束符   #include <stdio.h>   int main() {     int i =0, c;     char s[10];       while (i < 9){         if (c = getchar()){             if (c != '\n'){                 if (c != EOF){                     s[i] = c;                 }             }         } 	++i;     }     s[9] = '\0';     printf("%s", s);       return 0; }
user-0 提问: 关于C语言中的【图】结构，遍历不出来，谁能帮帮我

回复:
user: user-1
content: 买本书吧，一般书上都有。

user: user-2
content: 都看到图了，还在新手乐园里发帖，肯定沉了，转分类吧

user: user-3
content: Hi Yuiliet   fishc有个关于数据结构的教学，其中就有图的介绍，里面讲解的还可以吧。 希望对你有所帮助。  http://blog.fishc.com/category/structure/page/5
user-0 提问: 关于带参宏的一个小问题。

回复:
user: user-1
content: 引用 1 楼 Falleyes 的回复:应当避免在同一个表达式使用两次++，结果并不好预测。 宏尽量这样写： M(y) ((y)*(y)) 不是好不好预测的问题，这属于“未定义行为”，是有严重问题的代码

user: user-2
content: 不要这么写，这表达式完全依赖编译器的实现，不同编译器可能有不同结果

user: user-3
content: 引用 2 楼 dbzhang800 的回复:[quote=引用 1 楼 Falleyes 的回复:] 应当避免在同一个表达式使用两次++，结果并不好预测。 宏尽量这样写： M(y) ((y)*(y)) 不是好不好预测的问题，这属于“未定义行为”，是有严重问题的代码[/quote]我只是说的委婉点，上次看到一个帖也是这种问题，被喷得很惨。。。  楼主去看置顶帖吧！

user: user-4
content: 只能作为一个题目来做做，实际开发写这种代码要挨骂

user: user-5
content: 你的理解没有错， 编译器也是对的。 这是执行顺序不确定的代码。

user: user-6
content: 对于有参数的宏，应该避免传入i++或者++i这样的表达式。 楼主不要拘泥于这种问题。几年后，你就会发现这种问题没有意义，因为我们会尽量避免这样写。

user: user-3
content: 应当避免在同一个表达式使用两次++，结果并不好预测。 宏尽量这样写： M(y) ((y)*(y))
user-0 提问: 求一个WH_CALLWNDPROCRE钩子的实例

回复:
user: user-0
content: 自己顶顶.....

user: user-0
content: 引用 3 楼 zxhuser-1 的回复:不要写连自己也预测不了结果的代码！  我觉得 我应该写得对的，但是就是没有勾到信息 代码如下： HOOK.dll：  #include "stdafx.h" #include <stdio.h>  HINSTANCE			g_hinstDLL = NULL; HHOOK				g_hHook = NULL;  BOOL APIENTRY DllMain( HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved) { 	g_hinstDLL = hModule; 	switch (ul_reason_for_call) 	{ 	case DLL_PROCESS_ATTACH: 	case DLL_THREAD_ATTACH: 		break; 	case DLL_THREAD_DETACH: 	case DLL_PROCESS_DETACH: 		if(g_hHook != NULL) 				UnhookWindowsHookEx(g_hHook); 		break; 	} 	return TRUE; }  LRESULT CALLBACK WndPro(int nCode,WPARAM wParam,LPARAM lParam) { 	printf("1"); 	return CallNextHookEx(g_hHook,nCode,wParam,lParam); }   BOOL WINAPI StartHook() {  	if(g_hHook != NULL) 		return false;  	g_hHook = SetWindowsHookEx(WH_CALLWNDPROCRET, WndPro, g_hinstDLL, NULL);  	if(g_hHook == NULL) 		return false; 	return true; }  main.exe int _tmain(int argc, _TCHAR* argv[]) { 	if(StartHook()) 		printf("OK"); 	MSG msg; 	Sleep(2000); 	//::SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, 2); 	while(GetMessage(&msg, NULL, 0, 0)) 	{ 		TranslateMessage(&msg); 		DispatchMessage(&msg); 	} 	return 0; }

user: user-1
content: 不要写连自己也预测不了结果的代码！

user: user-0
content: 引用 1 楼 zxhuser-1 的回复:http://bbs.csdn.net/topics/442464  这个也没有给出实例呀.... 我根据自己理解写了个HOOK，但是好像勾不到任何消息

user: user-1
content: http://bbs.csdn.net/topics/442464
user-0 提问: 关于const 引用的一个疑问。

回复:
user: user-0
content: 谢谢各位的解答。

user: user-1
content: 引用 1 楼 lisong694767315 的回复:const int &refVal只是限定不能通过refVal去修改内存中的值，但是可以通过其他途径去改变内存中的值啊+1

user: user-2
content: 第二个printf输出 100 100

user: user-2
content: 如一楼说的。   #include <stdlib.h> #include <stdio.h>  int main(int argc, char** argv) {     int value = 10;     const int*p = &value;     printf("%d\n", *p);  // 10      int* q = &value;     *q = 100;     printf("%d %d\n", value, *p);     return 0; }

user: user-3
content: refVal 是引用，引用就是某一变量（目标）的一个别名，对引用的操作与对变量直接操作完全一样

user: user-4
content: 引用 2 楼 bubbles_ 的回复:[quote=引用 1 楼 lisong694767315 的回复:] const int &refVal只是限定不能通过refVal去修改内存中的值，但是可以通过其他途径去改变内存中的值啊 是不是说，变量只是改变内存中的值的一种方式，如果这种方式被const修饰了，就不能用其再修改内存的值了。但是可以用其他指向这块内存的变量来修改内存的值？[/quote]  对的。

user: user-0
content: 引用 1 楼 lisong694767315 的回复:const int &refVal只是限定不能通过refVal去修改内存中的值，但是可以通过其他途径去改变内存中的值啊 是不是说，变量只是改变内存中的值的一种方式，如果这种方式被const修饰了，就不能用其再修改内存的值了。但是可以用其他指向这块内存的变量来修改内存的值？

user: user-4
content: const int &refVal只是限定不能通过refVal去修改内存中的值，但是可以通过其他途径去改变内存中的值啊
user-0 提问: 网络通信数据同步的问题

回复:
user: user-0
content: 谢谢各位，问题已解决，多谢！

user: user-1
content: 搜索" 生产者消费者问题"

user: user-2
content: 可以搜一下“循环缓冲”

user: user-3
content: 读写队列，，，如果是数据包，就分帧，，，前提是数据包，足够大，做下队满处理
user-0 提问: CreateFile找不到指定路径

回复:
user: user-1
content: 引用 8 楼 lcg_1010 的回复:@go_and_see:我利用QueryDosDeviceA想获取C盘在全局名字空间下的路径，不是获取某一个文件的路径，我最终的目的是获取硬盘每个分区的容量，每个逻辑磁盘的容量。  那你不应该使用这个API，俺还以为你要在C盘下面创建一个文件呢。你要用这个GetDiskFreeSpaceEx，具体参数查MSDN吧。另外，你要是想通知俺，点引用即可，不用@

user: user-0
content: 引用 9 楼 go_and_see 的回复:[quote=引用 8 楼 lcg_1010 的回复:] @go_and_see:我利用QueryDosDeviceA想获取C盘在全局名字空间下的路径，不是获取某一个文件的路径，我最终的目的是获取硬盘每个分区的容量，每个逻辑磁盘的容量。  那你不应该使用这个API，俺还以为你要在C盘下面创建一个文件呢。你要用这个GetDiskFreeSpaceEx，具体参数查MSDN吧。另外，你要是想通知俺，点引用即可，不用@  [/quote] 好的，知道了，才注册的csdn.

user: user-0
content: @go_and_see:我利用QueryDosDeviceA想获取C盘在全局名字空间下的路径，不是获取某一个文件的路径，我最终的目的是获取硬盘每个分区的容量，每个逻辑磁盘的容量。

user: user-0
content: @go_and_see: 你说得很好，确实应该学会看MSDN，我当时的本意是“在CreateFileA函数中传递的第一个参数为调用QueryDosDeviceA函数的获得的路径呀！”，说话不严谨，原谅下

user: user-0
content: @haifeng3326: QueryDosDeviceA函数返回25，也就是cPath:"\\Device\\HarddiskVolume1",这个函数执行没有问题；

user: user-1
content: 靠，少写了个斜杠。   QueryDosDeviceA( "C:\\test.txt", cPath, MAX_PATH );

user: user-1
content: 引用 2 楼 lcg_1010 的回复:"\\Device\\HarddiskVolume1",关键是我调用QueryDosDeviceA函数成功了呀，而我在CreateFileA函数中传递的第一个参数为QueryDosDeviceA返回的路径呀！实在想不通！！！  你要学会看MSDN，注意返回值： If the function succeeds, the return value is the number of TCHARs stored into the buffer pointed to by lpTargetPath.  QueryDosDevice第一个参数应该这么写:  QueryDosDeviceA( "C:test.txt", cPath, MAX_PATH );

user: user-2
content: 你看看QueryDosDeviceA( "C:", cPath, MAX_PATH );函数返回值是0吗

user: user-0
content: "\\Device\\HarddiskVolume1",关键是我调用QueryDosDeviceA函数成功了呀，而我在CreateFileA函数中传递的第一个参数为QueryDosDeviceA返回的路径呀！实在想不通！！！

user: user-3
content: 在CreateFileA那行设断点，看下cPath中的内容是什么