Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 敲回车后一闪而过 这是为啥啊 VS2010

回复:
user: user-1
content: 最“正宗”的方法是： 开始、运行、cmd、确定 cd /d 你的exe程序所在盘符和目录 你的exe程序

user: user-2
content: 添加头文件#include<stdlib.h> 在main函数最后添加system("pause");

user: user-3
content: 调试时记得下断点~

user: user-4
content: 引用 4 楼 user-6 的回复:[quote=引用 3 楼 ghx287524027 的回复:] [quote=引用 2 楼 user-6 的回复:] 在最后加上getchar()，不然程序运行完就退出了，或者用Ctrl+F5运行程序   #include <stdio.h> void main() { 	int score; 	printf("输入成绩"); 	scanf("%d",&score); 	getchar(); 	if(score>100) 		printf("数值错误从新输入");  	//return 0; 	getchar(); }   即使再加一个getchar()，应该和原来的程序也没有多大区别吧，只不过是一次输入变两次输入了[/quote]  他代码里的getchar是为了接收掉'\n'，我的是等待观看最后结果，不是同一个意思！[/quote]  恩，可以达到这个目的，就是看他想实现什么功能了。

user: user-5
content: #include <stdio.h> #Iinclude<windows.h> void main() {  int score; printf("输入成绩"); scanf("%d",&score); getchar(); if(score>100) printf("数值错误从新输入"); system("pause");  }

user: user-6
content: 引用 3 楼 ghx287524027 的回复:[quote=引用 2 楼 user-6 的回复:] 在最后加上getchar()，不然程序运行完就退出了，或者用Ctrl+F5运行程序   #include <stdio.h> void main() { 	int score; 	printf("输入成绩"); 	scanf("%d",&score); 	getchar(); 	if(score>100) 		printf("数值错误从新输入");  	//return 0; 	getchar(); }   即使再加一个getchar()，应该和原来的程序也没有多大区别吧，只不过是一次输入变两次输入了[/quote]  他代码里的getchar是为了接收掉'\n'，我的是等待观看最后结果，不是同一个意思！

user: user-4
content: 引用 2 楼 user-6 的回复:在最后加上getchar()，不然程序运行完就退出了，或者用Ctrl+F5运行程序   #include <stdio.h> void main() { 	int score; 	printf("输入成绩"); 	scanf("%d",&score); 	getchar(); 	if(score>100) 		printf("数值错误从新输入");  	//return 0; 	getchar(); }   即使再加一个getchar()，应该和原来的程序也没有多大区别吧，只不过是一次输入变两次输入了

user: user-6
content: 在最后加上getchar()，不然程序运行完就退出了，或者用Ctrl+F5运行程序   #include <stdio.h> void main() { 	int score; 	printf("输入成绩"); 	scanf("%d",&score); 	getchar(); 	if(score>100) 		printf("数值错误从新输入");  	//return 0; 	getchar(); }

user: user-4
content: 不明白你说的一闪而过是什么意思，
user-0 提问: 如何利用C语言打开本地的软件

回复:
user: user-1
content: system, _wsystem Execute a command.  int system( const char *command );  int _wsystem( const wchar_t *command );  Routine Required Header Compatibility  system <process.h> or <stdlib.h> ANSI, Win 95, Win NT  _wsystem <process.h> or <stdlib.h> or <wchar.h> Win NT    For additional compatibility information, see Compatibility in the Introduction.  Libraries  LIBC.LIB Single thread static library, retail version  LIBCMT.LIB Multithread static library, retail version  MSVCRT.LIB Import library for MSVCRT.DLL, retail version    Return Value  If command is NULL and the command interpreter is found, the function returns a nonzero value. If the command interpreter is not found, it returns 0 and sets errno to ENOENT. If command is not NULL, system returns the value that is returned by the command interpreter. It returns the value 0 only if the command interpreter returns the value 0. A return value of – 1 indicates an error, and errno is set to one of the following values:  E2BIG  Argument list (which is system-dependent) is too big.  ENOENT  Command interpreter cannot be found.  ENOEXEC  Command-interpreter file has invalid format and is not executable.  ENOMEM  Not enough memory is available to execute command; or available memory has been corrupted; or invalid block exists, indicating that process making call was not allocated properly.  Parameter  command  Command to be executed  Remarks  The system function passes command to the command interpreter, which executes the string as an operating-system command. system refers to the COMSPEC and PATH environment variables that locate the command-interpreter file (the file named CMD.EXE in Windows NT). If command is NULL, the function simply checks to see whether the command interpreter exists.  You must explicitly flush (using fflush or _flushall) or close any stream before calling system.  _wsystem is a wide-character version of system; the command argument to _wsystem is a wide-character string. These functions behave identically otherwise.  Generic-Text Routine Mappings  TCHAR.H Routine  _UNICODE & _MBCS Not Defined _MBCS Defined _UNICODE Defined  _tsystem system system _wsystem    Example  /* SYSTEM.C: This program uses  * system to TYPE its source file.  */  #include <process.h>  void main( void ) {    system( "type system.c" ); }   Output  /* SYSTEM.C: This program uses  * system to TYPE its source file.  */ #include <process.h> void main( void ) {    system( "type system.c" ); }   Process and Environment Control Routines  See Also   _exec Functions, exit, _flushall, _spawn Functions

user: user-2
content: CreateProcess

user: user-3
content: CreateProcess需要自己对文件类型做处理。 ShellExecute可以打开任何类型的文件格式。。

user: user-4
content: WinExec、ShellExecute和CreateProcess,这3个函数都能做到

user: user-2
content: https://msdn.microsoft.com/zh-cn/library/ms682425%28v=vs.85%29.aspx  里面有解释有例子

user: user-0
content: CreateProcess怎么用的
user-0 提问: 函数名和函数指针有什么不同吗？

回复:
user: user-1
content: 函数指针多用于回调函数

user: user-2
content: 一个是常量，一个是变量，其它的，也就没什么了

user: user-3
content: 引用 3 楼 qq_27874423 的回复:[quote=引用 2 楼 ghx287524027 的回复:] func1是一个指针函数，即返回值为指针类型的函数。此处应正确区分函数指针与指针函数 。。这个我知道[/quote] 首先，定义int* func1(){}说明func1()是个函数，其返回值类型为int*，故func1()是指针函数；定义int* (*func2)(){}说明func2是一个指向函数的指针，姑且假设其指向的函数为func3()，所以int* (*func2)(){}可以改写为int* (func3)(){}，类比func1()，说明func3()是一个返回指针的指针函数。而int cmp(const void* a,const void* b)仅仅是一个返回值为int类型的函数而已，只不过其形参为指针常量，与func1、func2没有必然的关系。

user: user-0
content: 引用 2 楼 ghx287524027 的回复:func1是一个指针函数，即返回值为指针类型的函数。此处应正确区分函数指针与指针函数 。。这个我知道

user: user-3
content: func1是一个指针函数，即返回值为指针类型的函数。此处应正确区分函数指针与指针函数

user: user-4
content: 函数名可以退化成函数指针 函数名你不可能重新修改一个地址，但函数指针可以 不要把数组名然当指针，同样不要把函数名当指针
user-0 提问: 数组名和指针有什么不同？

回复:
user: user-1
content: 数组不是指针 ，数组和指针只有作为函数行参的时候编译器才将两者视为一样的，因为编译器都会将数组的操作转换成对指针的操作，其他地方数组是数组，指针是指针

user: user-2
content: 数组名和指针的关系，是在表达式中体现的。 sizeof运算符，是个编译期运算符，这个运算符作用于数组名， 是求数组的占用内存单元的数量 这个表达式是个常量表达式（有些实现支持变量定义数组的大小，这种实现中不是常量表达式） 另外一处，就是 &运算符和数组名构成的表达式，这个表达式中， &a表示数组a的地址，而不是数组名作为指针的地址   程序中并没有储存表示数组首地址的指针。 取到的不是指针的地址。  C++中，函数的数组引用参数，可以匹配数组， 所以C++中数组名，表达式中，就表现为指针，数组全体对象，两种不同形态。 C中，就没有这么复杂，除了 sizeof(a) ，&a 中表示数组全体对象外，别的表达式中，通常表现为指针

user: user-3
content: 编译器会自动把数组的首地址传递过去，但数组和指针还是有区别的

user: user-0
content: 谢谢各位的帮助，我结贴了。

user: user-0
content: 引用 6 楼 ghx287524027 的回复:虽然在效果上数组名可以等同于指向数组的指针，但是在本质上它和实际的指针是有区别的。首先，数组名只是一个符号，系统不会为它分配任何空间。其次，数组名是一个常量，它不能作为左值进行运算（自增和自减也是不允许的）。而实际指针没有这方面的限制。 这样，多谢。

user: user-4
content: 虽然在效果上数组名可以等同于指向数组的指针，但是在本质上它和实际的指针是有区别的。首先，数组名只是一个符号，系统不会为它分配任何空间。其次，数组名是一个常量，它不能作为左值进行运算（自增和自减也是不允许的）。而实际指针没有这方面的限制。

user: user-0
content: 引用 4 楼 user-5 的回复:数组名不是指针！！ 说数组名是指针的都是错的 你从sizeof就发现他们的不同了 数组名和指针的联系是数组名可以退化成指针（退化后数组大小就丢失了），反之不成立 谢谢！ 我也看了另外一个帖子： http://bbs.csdn.net/topics/390800454 觉得大体明白了明白了它们并不是同样的东西。 应该要结贴了。

user: user-5
content: 数组名不是指针！！ 说数组名是指针的都是错的 你从sizeof就发现他们的不同了 数组名和指针的联系是数组名可以退化成指针（退化后数组大小就丢失了），反之不成立

user: user-0
content: 引用 1 楼 csdn1223537114 的回复:ss1是指针类型，ss2是数组类型，直接填数组名编译器会把数组首地址传过去~~ 意思就是它们两个完全是两种类型吗？ 但是数组名不就是一个指向数组第一个元素的指针吗？

user: user-3
content: ss1是指针类型，ss2是数组类型，直接填数组名编译器会把数组首地址传过去~~

user: user-3
content: sizeof数组返回的是数组的里面元素的字节数
user-0 提问: 函数中的字符常量，这段代码为什么会运行出错？

回复:
user: user-1
content: 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！ 不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！）  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）  其实电脑开机后物理内存的每个字节都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。  崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。

user: user-2
content: printf()在stdio.h中定义，所以要加一句#include "stdio.h"，另外，如果你返回0的话，会提示无法将int转为char*，所以还需要明白你这段代码想实现什么功能。

user: user-3
content: 您的函数不是返回指针么，return 0是什么鬼，而且和楼上说的一样，不要返回局部指针

user: user-4
content: Char p[] = “hello world”;  以上这句代码，并不是字符串常量。 以下这句才是  Char *p = “hello world”;  其实  Char p[] = “hello world”; 等价于 Char p[12] = “hello world”;

user: user-5
content: 不确定 不要返回局部变量指针 你返回一个指向局部数组的指针，函数结束后，内存就销毁了，所以行为是不确定的
user-0 提问: 满二叉树的定义

回复:
user: user-0
content: 引用 3 楼 zhangxiangDavaid 的回复:二叉树 http://blog.csdn.net/zhangxiangdavaid/article/details/36189717你的是对的，感觉百度的定义有点错误。

user: user-1
content: 二叉树 http://blog.csdn.net/zhangxiangdavaid/article/details/36189717

user: user-1
content: 一样的意思啊~

user: user-2
content: 我不知道你上面那个是不是从维基百科上搜到的，那个应该是Completed  Binary Tree（完全二叉树）的定义，每个节点有0或者2个子节点 而满二叉树的每一次有2的k-1次方个节点，k为该层的层数。即百度百科，，，
user-0 提问: 打印100到200之间的素数，我是初学者，大神帮帮忙

回复:
user: user-1
content: 引用 3 楼 ghx287524027 的回复:正确代码见楼上。 从代码中可知你已经知道怎么确定一个数是否为素数了。但是有一点，对于数a，必须当2~（a-1）中不存在a的约数时，才能确定数a为素数，也就是说只有当这（a-2）个数全部检测完之后才可以确定数a是不是素数。因此只有在外层循环中才可以对数进行输出。 我记得只需要测试2-a的平方根之间的数即可 也就是for(int i = 2 ; i < a * a ; i++)

user: user-0
content: 谢谢各位大神的细心指导，问题解决了，令小弟恍然大悟，感动的热泪盈眶！

user: user-2
content: #include<stdio.h> int main() {     int temp;          for(temp=101;temp<200;temp++)     {         for(int i=2;i<temp;i++)         {             if(temp%i!=0) //逻辑错误，应改为temp%i ==0                 break;                 printf("%d ",temp);     //逻辑错误，一个数不被2整除不代表就是素数 参看1楼的写法        }         }     return  0; }

user: user-3
content: 确定一个数是否为素数了。但是有一点，对于数a，必须当2~（a-1）中不存在a的约数时，才能确定数a为素数，也就是说只有当这（a-2）个数全部检测完之后才可以确定数a是不是素数。因此只有在外层循环中才可以对数进行输出。

user: user-4
content: 素数  #include<stdio.h> int main() { 	int n, i, t; 	int a[10000] = { 0 }; 	for (i = 2; i<10000; i++)//建立10000以内的素数表 		if (!a[i]) 			for (t = i + i; t<10000; t += i) 				if (!a[t]) 					a[t] = 1;  	for (i = 2; i<100; i++)//输出10000以内的素数   //素数从2开始 		if (a[i] == 0) 			printf("%d\n", i);  	return 0; }  //验证哥德巴赫猜想  char primes[10000]; int i, j, n; int main58(void)//58 { 	//先找出10000以内的所有素数 	memset(primes, '1', 10000); 	for (i = 2; i < 5000; i++) 		for (j = i*2; j < 10000; j+=i) 			primes[j] = '0'; 	while (1 == scanf("%d", &n)) 	{ 		j = n / 2; 		while ('0' == primes[j] || '0' == primes[n - j]) j--; 		printf("%d %d\n", j, n - j); 	}  	return 0; }

user: user-5
content: 正确代码见楼上。 从代码中可知你已经知道怎么确定一个数是否为素数了。但是有一点，对于数a，必须当2~（a-1）中不存在a的约数时，才能确定数a为素数，也就是说只有当这（a-2）个数全部检测完之后才可以确定数a是不是素数。因此只有在外层循环中才可以对数进行输出。

user: user-6
content: #include<stdio.h> int main() { 	int temp;  	for(temp=101;temp<200;temp++) 	{ 		bool bPrime = true; 		for(int i=2;i<temp;i++) 		{ 			if(temp%i==0) 			{ 				bPrime = false; 				break; 			} 		} 		if(bPrime) 			printf("%d ",temp);  	} 	return  0; }

user: user-7
content: #include <stdio.h> int main() {  	for (int i = 101; i < 201; ++i) 	{ 		 		for (int j = 2; j < i; ++j) 		{ 			if (i%j == 0) 				break; 		} 		if (j == i) 		{ 			printf("%d ", i);  		} 	}  	return 0; }
user-0 提问: C语言基础问题

回复:
user: user-1
content: 1、算是吧 2、也算是吧，这个在scanf函数里实现 3、printf是直接把a的值复制到函数内，是按值传递的，并没有取地址

user: user-2
content: 虽然在效果上数组名可以等同于指向数组的指针，但是在本质上它和实际的指针是有区别的。首先，数组名只是一个符号，系统不会为它分配任何空间。其次，数组名是一个常量，它不能作为左值进行运算（自增和自减也是不允许的）。而实际指针没有这方面的限制。

user: user-2
content: 这就涉及到了scanf()和print()的工作原理和实现，scanf()的作用本质上就是给变量赋值，当你输入7时，这个7会被存放在一个叫键盘缓冲区的地方，按下回车之后scanf会读取这个缓冲区，并通过&获取要将7存放给的变量，实现赋值。输出时，print()并不知道参数个数，它只是逐个解析format字符串。对于特定类型%，使用va_arg去取相应参数的值，直到遍历字符串结束。

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

user: user-4
content: 刨根问底不总是好事！ 特别是在前期。 要知道“未知是永远存在的”。
user-0 提问: C文件处理问题！

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

user: user-2
content: 引用 15 楼 libinden71 的回复:[quote=引用 12 楼 paschen 的回复:] [quote=引用 11 楼 libinden71 的回复:] [quote=引用 9 楼 paschen 的回复:] 楼上说得对，max已经是指针了 max已经是指针了？我不是很懂这个意思[/quote]  int *max [/quote]   paixu(&max, cons);  ==> paixu(max, cons); 取地址去掉就可以了！我表示无法理解！传递给指针*p 不是应该传的是数组的地址吗？[/quote]  max本身已经是数组的首地址了，如果再&就变成max这个指针变量的地址了

user: user-0
content: 引用 14 楼 paschen 的回复:[quote=引用 13 楼 libinden71 的回复:] [quote=引用 8 楼 user-3 的回复:] paixu(&max, cons);  ==> paixu(max, cons);  为什么传递地址反而错了？ max是数组，传递给指针*p 不应该传的是max的地址吗？ 还有个问题 为什么说max已经是指针了 表示不是很明白 ！[/quote]  你传递&max传递的就是max这个指针的地址，也就是int**类型了 max本身已经是一个指针了，只是他指向的内存作为了一个数组用[/quote]   懂了懂了 恍然大悟！万分感谢！

user: user-0
content: 引用 12 楼 paschen 的回复:[quote=引用 11 楼 libinden71 的回复:] [quote=引用 9 楼 paschen 的回复:] 楼上说得对，max已经是指针了 max已经是指针了？我不是很懂这个意思[/quote]  int *max [/quote]   paixu(&max, cons);  ==> paixu(max, cons); 取地址去掉就可以了！我表示无法理解！传递给指针*p 不是应该传的是数组的地址吗？

user: user-2
content: 引用 13 楼 libinden71 的回复:[quote=引用 8 楼 user-3 的回复:] paixu(&max, cons);  ==> paixu(max, cons);  为什么传递地址反而错了？ max是数组，传递给指针*p 不应该传的是max的地址吗？ 还有个问题 为什么说max已经是指针了 表示不是很明白 ！[/quote]  你传递&max传递的就是max这个指针的地址，也就是int**类型了 max本身已经是一个指针了，只是他指向的内存作为了一个数组用

user: user-0
content: 引用 8 楼 user-3 的回复:paixu(&max, cons);  ==> paixu(max, cons);  为什么传递地址反而错了？ max是数组，传递给指针*p 不应该传的是max的地址吗？ 还有个问题 为什么说max已经是指针了 表示不是很明白 ！

user: user-2
content: 引用 11 楼 libinden71 的回复:[quote=引用 9 楼 paschen 的回复:] 楼上说得对，max已经是指针了 max已经是指针了？我不是很懂这个意思[/quote]  int *max

user: user-0
content: 引用 9 楼 paschen 的回复:楼上说得对，max已经是指针了 max已经是指针了？我不是很懂这个意思

user: user-2
content: 楼上说得对，max已经是指针了

user: user-3
content: paixu(&max, cons);  ==> paixu(max, cons);

user: user-0
content: 引用 5 楼 paschen 的回复:点重试，然后点中断，然后看断在哪，通过调用堆栈定位到你代码的位置，然后通过相关变量窗口观察分析原因 如果还是找不到，你发下断下是在哪，还有文件内容是什么，我帮你试下

user: user-0
content: 引用 5 楼 paschen 的回复:点重试，然后点中断，然后看断在哪，通过调用堆栈定位到你代码的位置，然后通过相关变量窗口观察分析原因 如果还是找不到，你发下断下是在哪，还有文件内容是什么，我帮你试下   初学者 还不会调试和断点 文件的内容就是一堆自己写的数字： 12 65 95 ... 把这些数字排序！   这个是断点的结果： Run-Time Check Failure #2 - Stack around the variable 'len' was corrupted.

user: user-2
content: 点重试，然后点中断，然后看断在哪，通过调用堆栈定位到你代码的位置，然后通过相关变量窗口观察分析原因 如果还是找不到，你发下断下是在哪，还有文件内容是什么，我帮你试下

user: user-0

user: user-2
content: 引用 2 楼 libinden71 的回复:[quote=引用 1 楼 paschen 的回复:] int *max = (int*)calloc(cons, sizeof(int));  不行啊 还是错误！[/quote]  什么错误

user: user-0
content: 引用 1 楼 paschen 的回复:int *max = (int*)calloc(cons, sizeof(int));  不行啊 还是错误！

user: user-2
content: int *max = (int*)calloc(cons, sizeof(int));
user-0 提问: 求帮助QAQ 关于用控制台显示图片的问题 非常感谢

回复:
user: user-1
content: 就是说你要调试那个dll你需要导入符号，而通常你不可能去调试那些

user: user-2
content: 控制台能显示位图？ 发代码上来看看。
user-0 提问: C单链表问题 [讨论]

回复:
user: user-1
content: 代码本身木有问题~

user: user-2
content: 请检查scanf和malloc的返回值。

user: user-3
content: 如果  由于某种原因   malloc申请失败，p会变成null  ，全是一个潜在的bug把。虽然基本上这种情况不会出现

user: user-1
content: 单链表 http://blog.csdn.net/zhangxiangdavaid/article/details/25109205

user: user-0
content: 引用 1 楼 user-4的回复:没发现有什么问题。 LZ觉得哪边不妥，有疑虑？ 我在做内存泄露查询，这段代码是我摘录出来的算法，我担心的是列表插入有问题了，刚刚查到问题的原因了，这段代码没问题，谢谢你的帮助。

user: user-4
content: 没发现有什么问题。 LZ觉得哪边不妥，有疑虑？
user-0 提问: 关于内存变量输出问题

回复:
user: user-1
content: 你这程序应该是64位程序，指针是8个字节，所以按指针输出的才是正确的，%x是32位的整数 如果32位的程序那就一样了

user: user-2
content: 格式指示符与提供的数据类型不一致的时候，结果是未知的。

user: user-3
content: 0x7fff5fbff86c  5fbff86c  其实是一样的啊

user: user-4
content: 显然你的地址是64位, 整型是32位的

user: user-5
content: “内存地址”与“整数”位数不一定相同 不能想当然认为它们一样

user: user-6
content: %llx
user-0 提问: 求助 大侠来看下为什么运行不出来

回复:
user: user-1
content: “给定一个小点的输入，完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门！ 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出

user: user-0
content: 引用 4楼弓长羊羽 的回复:至少  int q=(p+q)/2; 应改为： int q=(p+r)/2; 唉，打错了！

user: user-2
content: 至少  int q=(p+q)/2; 应改为： int q=(p+r)/2;

user: user-2
content: 归并排序： http://blog.csdn.net/zhangxiangdavaid/article/details/34463409

user: user-3
content: int q=(p+q)/2; 中q没有定义 还有局部变量在定义的时候 请初始化，否则其值是未定

user: user-4
content: int q=(p+q)/2; 这个q未初始化

user: user-2
content: 建议清楚理解了归并排序的思想后，再去使用代码实现。 引用 3 楼 zhangxiangDavaid 的回复:归并排序： http://blog.csdn.net/zhangxiangdavaid/article/details/34463409
user-0 提问: C语言数组传入函数赋值到指针传出指针出错，萌新一枚跪求答案666666666666

回复:
user: user-1
content: 修改如下：  #include<stdio.h> //从m个字母开始截取n个字母  char *chang(char *a, int m, int n) { 	int i; 	//分配内存 	char *string = malloc(sizeof(char)*(n + 1)); 	for (i = 0; i<n; i++) { 		printf("1\n"); 		*(string + i) = a[m - 1 + i]; 		printf("2\n"); 	} 	printf("3\n"); 	*(string + i) = '\0'; 	printf("4\n"); 	printf("%s\n", string); 	return string; } int main() { 	char a[] = "abcdefghi"; 	char *string; 	string = chang(a, 2, 3); 	printf("5\n"); 	printf("%s\n", string); 	//释放内存 	free(string); 	return 0; }

user: user-2
content: 第一，在char *string;定义之后要对该指针分配足够使用的内存（可以利用malloc()或者calloc()函数进行内存分配，两者的用法，百度上有很多），此外也可以将该指针定义为数组，则省去了手动分配内存。 第二，一楼说的说的很清楚，局部变量只在函数中有效，随着函数结束，该变量也将失效，所以当函数结束后返回指向局部变量的指针是没有意义的。

user: user-3
content: 你这代码看着真累啊

user: user-4
content: 因为你char *string; 后，没有为string分配内存，就开始对string指向的内存赋值  另外，函数不应返回局部变量的指针
user-0 提问: 关于读取缓冲区\n的问题求解

回复:
user: user-1
content: 引用 3 楼 zhourqaiai 的回复:我也想到了 但是我改了以后还是不行。。。不知道咋回事  不行是指什么，另外把结构体名day换一个名称，不然和里面的变量day成员名重复了  把这些修改下，还不行发下你修改好的代码以及你期望的结果来

user: user-0
content: 我也想到了 但是我改了以后还是不行。。。不知道咋回事

user: user-0
content: 引用 6 楼 user-1 的回复:[quote=引用 5 楼 zhourqaiai 的回复:] 现在好了，我刚才改错了 改了printf里的d%，我想对齐表头和对应的数据怎么办？能不能算出应该怎么控制屏幕上输出的空格的个数，用个控制语句什么的。 这个长度是指的屏幕显示一个空格的宽度是吗？

user: user-1
content: 引用 7 楼 zhourqaiai 的回复:[quote=引用 6 楼 user-1 的回复:] [quote=引用 5 楼 zhourqaiai 的回复:] 现在好了，我刚才改错了 改了printf里的d%，我想对齐表头和对应的数据怎么办？能不能算出应该怎么控制屏幕上输出的空格的个数，用个控制语句什么的。 这个长度是指的屏幕显示一个空格的宽度是吗？[/quote]  算是吧， 一个字符宽度

user: user-1
content: 引用 5 楼 zhourqaiai 的回复:现在好了，我刚才改错了 改了printf里的d%，我想对齐表头和对应的数据怎么办？能不能算出应该怎么控制屏幕上输出的空格的个数，用个控制语句什么的。  比如 printf("%08d")  输出如果不够长度8，会用空格补

user: user-0
content: 现在好了，我刚才改错了 改了printf里的d%，我想对齐表头和对应的数据怎么办？能不能算出应该怎么控制屏幕上输出的空格的个数，用个控制语句什么的。

user: user-1
content: 应该是scanf("%4d%2d%2d", &s[i].d.year, &s[i].d.month, &s[i].d.day1);吧  你年份需要4个数字

user: user-0
content: 话说我上个帖子已经结贴了啊 为啥结贴率50%.....
user-0 提问: 为什么scanf无法循环QAQ

回复:
user: user-1
content: scanf函数不能格式说明符中间不能有标点符号

user: user-2
content: 要是用你的程序想得到结果输入的时候就要加逗号，比如输入     5，6，8    然后回车 下一行还要加getchar（）； 我就知道这么多了，是不是其它地方错了？

user: user-3
content: 不知道，单步跟踪调试程序，然后观察分析原因

user: user-2
content: 你输错了吧，多了几个逗号，应该是 printf("请输入菜数据 =w= 格式为：餐桌号，可容纳人数，是否有人（1为有，0为没有）\n"); for(i=0;i<c;i++) scanf("%d%d%d",&desk[i].id,&desk[i].r,&desk[i].kong);  scanf（”%d%d%d“，...，...，...）；才对吧。
user-0 提问: fork一个子进程， 子进程的代码从那一句开始执行？

回复:
user: user-1
content: 一旦调用fork，操作系统就复制 一份父进程代码 和 进程环境，注意进程环境里有一个pc指针，父进程在调用fork时指向代码哪里，子进程也是指向哪里，所以子进程从调用fork的地方开始执行bia

user: user-0

user: user-0
content: 引用 1 楼 zhangxiangDavaid 的回复:从  pid=fork();  开始  按照你的说法，我肯定是用错了     /* fork childs */   for(i=0;i<clients;i++)   { 	   pid=fork(); 	   if(pid <= (pid_t) 0) 	   { 		   /* child process or error*/ 	           sleep(1); /* make childs faster */ 		   break; 	   }   }    if( pid< (pid_t) 0)   {           fprintf(stderr,"problems forking worker no. %d\n",i); 	  perror("fork failed."); 	  return 3;   }    if(pid== (pid_t) 0)     本来的意图是，一个父进程创建clients子进程，  按照你说的说法，fork出第一个字进程后，子进程会不会执行for循环？  应该会!!!， 那么就造成了 child fork孙进程了。

user: user-2
content: pid_t pid = fork(); if (pid < 0)    //错误 else if (pid == 0)   //子进程 else if (pid>0)  //父进程

user: user-3
content: 楼主 你说对了 它会创建 孙进程，不过 前提是 你的 clients 大于1，但  结果 并不会出错，因为你if 之后 break了，所以 从创建进程数上来说 是正确的。

user: user-4
content: 从  pid=fork();  开始
user-0 提问: linux链表求偏移量的问题

回复:
user: user-1
content: 参考gcc源代码相关片断。

user: user-2
content: #define FIELD_OFFSET(type, field)    ((LONG)(LONG_PTR)&(((type *)0)->field))

user: user-2
content: 偏移量是编译时就求出了，而不是运行时
user-0 提问: 这是个死循环？

回复:
user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:为什么不使用ftell函数呢我还没有学过这个函数

user: user-0
content: 你好，我还没学到这个函数。自学

user: user-1
content: 为什么不使用ftell函数呢

user: user-2
content: 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22   #include<stdio.h> #include<stdlib.h>//为了使用exit() int main() {     char    ch;     FILE    *fp=NULL;     char fname[50];//用于存放文件名     printf("输入文件名：");     scanf("%s",fname);     fp=fopen(fname,"r");//只供读取     if(fp==NULL)//如果失败了     {         printf("错误！");         exit(1);//中止程序     }     while((ch=getc(fp))!=EOF)     putchar(ch);     fclose(fp);//关闭文件     fp=NULL;//需要指向空，否则会指向原打开文件地址           return 0; } /* fopen example */ #include <stdio.h> int main () {   FILE * pFile;   pFile = fopen ("myfile.txt","w");   if (pFile!=NULL)   {     fputs ("fopen example",pFile);     fclose (pFile);   }   return 0; } http://www.cplusplus.com/reference/cstdio/fopen/

user: user-3
content: feof只是报告一个状态, fputc不改变这个状态,
user-0 提问: 用C语言如何实现打开指定网站？求解答 拜托

回复:
user: user-1
content: loadlibarary(shell32.dll) shellexcute(...)

user: user-2
content: 引用 4 楼 fangwenkang 的回复:必须定义头文件#include <stdlib.h>   stdlib  意思是什么？有什么功能呢  system函数在其中定义  http://baike.baidu.com/link?url=hXzD22uVYFSIwKZ3uVWNVe2n6_Z1dAimzBEBlrEPJL31OzYuoxnGwiVy1eKicfRJazA0EjnQhadq7JmzpmWcLa

user: user-0
content: 必须定义头文件#include <stdlib.h>   stdlib  意思是什么？有什么功能呢

user: user-3
content: 引用 1 楼 user-4 的回复:1、ShellExecute(NULL, "open", "http://www.baidu.com", NULL, NULL, SW_MINIMIZE); 2、system("start http://www.baidu.com"); 同意！

user: user-2
content: system("explorer http://www.baidu.com");

user: user-4
content: 1、ShellExecute(NULL, "open", "http://www.baidu.com", NULL, NULL, SW_MINIMIZE); 2、system("start http://www.baidu.com");
user-0 提问: 关于C语言的结构体，洗牌

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

user: user-1
content: char *a[]={"1","2","3"};//在常量区分配6个字节31 00 32 00 33 00并将其中31 32 33所在的地址比如04000100 04000102 04000104分别保存在a[0],a[1],a[2]中，即如果a[0]在内存地址04000200处的话，小端存储32位系统中 04000200 04 01 00 04 02 01 00 04 00 01 00 04  电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

user: user-2
content: 关于指针： http://blog.csdn.net/zhangxiangdavaid/article/details/37885275 多多指教~

user: user-3
content: 因为是个数组  拆分后是这样：  char * s1 = "Spades"; char * s2 = "Hearts"; .....  然后一个数组，包含了s1、s2....

user: user-2
content: 理解char *Suit[3];的含义 1.首先[]的优先级比*高，所以Suit先与[]结合。也就是说，Suit是一个数组。 2.那么数组中存放的是什么呢？那自然是剩下的部分，即char *。 综上所述，char *Suit[3]的含义是： 有这么一个名为Suit的数组，数组中存放的数据类型是char*，元素个数是3。 理解了Suit的含义后，就不难理解为什么报这种错误了。

user: user-4
content: 字符指针数组。  字符   指针          数组  char     *         a   []
user-0 提问: ffMpeg 视频编码的一个问题

回复:
user: user-1
content: 如楼上，学会调试~

user: user-2
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。
user-0 提问: 用fputs将链表中的信息写入本地文件

回复:
user: user-0
content: 已经解决了  。。

user: user-1
content: 参考：  #include <stdio.h> #include <stdlib.h> typedef struct Student{ 	char name[20]; 	float score; 	struct Student *next; }Student; void saveToFile(Student *head){ 	if (head) { 		Student *p = head; 		FILE *fp = fopen("1.txt", "w"); 		if (fp) { 			while (p){ 				fprintf(fp, "%-20s %.2f\n", p->name, p->score); 				p = p->next; 			} 			fclose(fp); 		} 	} } int main(void){ 	Student *head; 	struct Student s1 = { "David",78.5 }; 	struct Student s2 = { "Jane",88.6 }; 	struct Student s3 = { "Tim",98.3 }; 	head = &s1; 	s1.next = &s2; 	s2.next = &s3; 	s3.next = NULL; 	saveToFile(head); 	return 0; } //1.txt David                78.50 Jane                 88.60 Tim                  98.30

user: user-2
content: 作为一个C程序员，对  scanf,sscanf,fscanf  printf,sprintf,fprintf 这类函数的用法，还是要做到“拳不离手，曲不离口”的。
user-0 提问: C语言有没有这种高级用法

回复:
user: user-1
content: 你这个可能不行 只说明了a,b为指针，但是没有分配空间

user: user-2
content: 有啊，这个也算不上什么高级语法！

user: user-3
content: 可以，前提你的a、b应该分配好内存

user: user-4
content: http://bbs.csdn.net/topics/390471779

user: user-5
content: 应该这么用：  int main(void) { 	char a[20], b[20]; 	scanf("%19s%19s", a, b); 	printf("a=%s\nb=%s", a, b); 	return 0; } //zhangxiangdavid lalalalalalala //a=zhangxiangdavid //b=lalalalalalala

user: user-4
content: 仅供参考：//NAME: essaie bla bla //DIMENSION: 8 //DATA //1  14  15 //2  11  10 //3  6   4 //4  7   13 //5  9   21 //6  19  3 //7  1   5 //8  8   8 //EOF // // 文本文件中可能还含有其他内容，但是需要用到的内容即以上  //比如data.txt: //NAME: essaie bla bla //其它内容 //DIMENSION: 8 //其它内容 //DATA //其它内容 //1  14  15 //其它内容 //2  11  10 //其它内容 //3  6   4 //其它内容 //4  7   13 //其它内容 //5  9   21 //其它内容 //6  19  3 //其它内容 //7  1   5 //其它内容 //8  8   8 //其它内容 //EOF  // 目标是要获取NAME后字串，DIMENSION后数值，以及DATA以下的数值 // 其中NAME就是随便个字句，DIMENSION是城市数量，DATA以下是城市编号，X坐标，Y坐标 // 所有的这些将赋值给一个事先定义好的结构 #include <stdio.h> #include <string.h> #define MAXCPL   80   //每行最大字符数 #define MAXCITY  100  //每组数据中DATA最多项数，DIMENSION的最大值 #define MAXNAMEL 32   //NAME最大长度 struct S {     char NAME[MAXNAMEL+1];     int  DIMENSION;     struct D {         int NO;         int X;         int Y;     } DATA[MAXCITY]; } s; FILE *f; int st,n,i; char ln[MAXCPL]; int main() {     f=fopen("data.txt","r");     if (NULL==f) {         printf("Can not open file data.txt!\n");         return 1;     }     st=0;     n=0;     while (1) {         if (NULL==fgets(ln,MAXCPL,f)) break;         if (st==0) {             if (1==sscanf(ln,"NAME: %32[^\n]",s.NAME)) st=1;         } else if (st==1) {             if (1==sscanf(ln,"DIMENSION: %d",&s.DIMENSION)) st=2;         } else if (st==2) {             if (0==strcmp(ln,"DATA\n")) st=3;         } else if (st==3) {             if (3==sscanf(ln,"%d%d%d",&s.DATA[n].NO,&s.DATA[n].X,&s.DATA[n].Y)) {                 n++;                 if (n>=MAXCITY || n>=s.DIMENSION) break;             }         }     }     fclose(f);     printf("s.NAME=[%s]\n",s.NAME);     printf("s.DIMENSION=%d\n",s.DIMENSION);     for (i=0;i<n;i++) {         printf("s.DATA[%d].NO,X,Y=%d,%d,%d\n",i,s.DATA[i].NO,s.DATA[i].X,s.DATA[i].Y);     }     return 0; } //s.NAME=[essaie bla bla] //s.DIMENSION=8 //s.DATA[0].NO,X,Y=1,14,15 //s.DATA[1].NO,X,Y=2,11,10 //s.DATA[2].NO,X,Y=3,6,4 //s.DATA[3].NO,X,Y=4,7,13 //s.DATA[4].NO,X,Y=5,9,21 //s.DATA[5].NO,X,Y=6,19,3 //s.DATA[6].NO,X,Y=7,1,5 //s.DATA[7].NO,X,Y=8,8,8

user: user-6
content: 引用 楼主 natuper 的回复:一个scanf中输入两个%s，能不能实现，如下： char *a;char *b; scanf("%s%s", a, b); 可以的的呢  前提条件  a, b必须有指向的地址空间

user: user-7
content: 用char a[50],b[50];

user: user-8
content: 楼上已经说的很明了,直接用的话就是野指针

user: user-9
content: 这个算高级用法？
user-0 提问: 求助一道OJ题

回复:
user: user-1
content: 最后一次：  #include <stdio.h> int T, N; int nums[1000]; int partition(int *arr, int from, int to)  { 	int i, j; 	i = j = from; 	while (j <= to)  	{ 		if (nums[j] <= nums[to])  		{ 			int tmp = nums[i]; 			nums[i] = nums[j]; 			nums[j] = tmp; 			i++; 		} 		j++; 	} 	return i - 1; } void _quickSort(int *arr, int from, int to)  { 	if (from < to)  	{ 		int i = partition(arr, from, to); 		_quickSort(arr, from, i - 1); 		_quickSort(arr, i + 1, to); 	} } void quickSort(int *arr, int n)  { 	_quickSort(arr, 0, n - 1); } int main(void){ 	int i, j; 	j = 1; 	scanf("%d",&T); 	while (j <= T)  	{ 		scanf("%d", &N); 		//读入数组 		for (i = 0; i < N; i++)  		{ 			scanf("%d", nums + i); 		} 		//修改数组 		for (i = N - 1; i > 0; i--)  		{ 			nums[i] = nums[i] - nums[i - 1]; 		} 		//排序 		quickSort(nums, N); 		//输出 		printf("Case %d:\n", j); 		for (i = 0; i < N; i++)  		{ 			printf("%d ", nums[i]); 		} 		printf("\n"); 		j++; 	} 	return 0; } //2 //5 //1 3 2 4 5 //Case 1: //-1 1 1 2 2 //6 //3 2 7 8 2 4 //Case 2: //-6 -1 1 2 3 5

user: user-1
content: 格式乱了，不是我的错：  #include <stdio.h> int T, N; int nums[1000]; int partition(int *arr, int from, int to) { 	int i, j; 	i = j = from; 	while (j <= to) { 		if (nums[j] <= nums[to]) { 			int tmp = nums[i]; 			nums[i] = nums[j]; 			nums[j] = tmp; 			i++; 		} 		j++; 	} 	return i - 1; } void _quickSort(int *arr, int from, int to) { 	if (from < to) { 		int i = partition(arr, from, to); 		_quickSort(arr, from, i - 1); 		_quickSort(arr, i + 1, to); 	} } void quickSort(int *arr, int n) { 	_quickSort(arr, 0, n - 1); } int main(void){ 	int i, j; 	j = 1; 	scanf("%d",&T); 	while (j <= T) { 		scanf("%d", &N); 		//读入数组 		for (i = 0; i < N; i++) { 			scanf("%d", nums + i); 		} 		//修改数组 		for (i = N - 1; i > 0; i--) { 			nums[i] = nums[i] - nums[i - 1]; 		} 		//排序 		quickSort(nums, N); 		//输出 		printf("Case %d:\n", j); 		for (i = 0; i < N; i++) { 			printf("%d ", nums[i]); 		} 		printf("\n"); 		j++; 	} 	return 0; } //2 //5 //1 3 2 4 5 //Case 1: //-1 1 1 2 2 //6 //3 2 7 8 2 4 //Case 2: //-6 -1 1 2 3 5

user: user-1
content: 参考：  #include <stdio.h> int T, N; int nums[1000]; int partition(int *arr, int from, int to) { 	int i, j; 	i = j = from; 	while (j <= to) { 		if (nums[j] <= nums[to]) { 			int tmp = nums[i]; 			nums[i] = nums[j]; 			nums[j] = tmp; 			i++; 		} 		j++; 	} 	return i - 1; } void _quickSort(int *arr, int from, int to) { 	if (from < to) { 		int i = partition(arr, from, to); 		_quickSort(arr, from, i - 1); 		_quickSort(arr, i + 1, to); 	} } void quickSort(int *arr, int n) { 	_quickSort(arr, 0, n - 1); } int main(void){ 	int i, j; 	j = 1; 	scanf("%d",&T); 	while (j <= T) { 		scanf("%d", &N); 		//读入数组 		for (i = 0; i < N; i++) { 			scanf("%d", nums + i); 		} 		//修改数组 		for (i = N - 1; i > 0; i--) { 			nums[i] = nums[i] - nums[i - 1]; 		} 		//排序 		quickSort(nums, N); 		//输出 		printf("Case %d:\n", j); 		for (i = 0; i < N; i++) { 			printf("%d ", nums[i]); 		} 		printf("\n"); 		j++; 	} 	return 0; } //2 //5 //1 3 2 4 5 //Case 1: //-1 1 1 2 2 //6 //3 2 7 8 2 4 //Case 2: //-6 -1 1 2 3 5

user: user-2
content: 象是最后一行差回车
user-0 提问: C语言贪吃蛇如何实现用鼠标点击控制方向啊

回复:
user: user-0
content: 非常感谢大家。。

user: user-1
content: 收藏下

user: user-2
content: http://blog.csdn.net/lyh66/article/details/7367561  http://blog.sina.com.cn/s/blog_5f1ca7070100cnja.html  请参考

user: user-3
content: console屏幕处理例子程序。终端窗口屏幕处理相关API使用例子。来自MSVC20\SAMPLES\win32\console\ http://download.csdn.net/detail/zhao4zhong1/3461309

user: user-4
content: 捕获鼠标事件：   	INPUT_RECORD irInBuf; 	DWORD cNumRead; 	ReadConsoleInput(GetStdHandle(STD_INPUT_HANDLE),&irInBuf,1,&cNumRead);    if(irInBuf.EventType == MOUSE_EVENT)  //鼠标事件  if(irInBuf.Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED)//左键按下  COORD pos = irInBuf.Event.MouseEvent.dwMousePosition; //鼠标坐标
user-0 提问: 【弱鸡求助】浙大PAT Sort with Swap(0, i) 

回复:
user: user-1
content: http://www.fengmiyilei.cn/archives/150

user: user-0
content: 引用 2 楼 tu_lq 的回复:看不懂你的算法，我的想法是 不在自己位子上的数 n  加上环数 circles - 1 如果0不在0的位置上 没注释 抱歉 1.s这个数组呢是用来存一些信息的：如果i是环的起点，那么s[i]就是这个环里的数字个数；如果i是环里的一个数，我们在访问他之后就令他为-1；如果i是在它应该在的位置上，那么s[i]就会是0；你看这样的话我们按顺序遍历这个a数组，如果a[i]不是0的话，就说明它已经被遍历过了。 2.count就是s数组里面所有大于0得数。ok，这就是环数 2.sum其实就是Σ（每个环里面的数量-1），也就是你说的n-环数 然后分情况输出结果就好了

user: user-2
content: 看不懂你的算法，我的想法是 不在自己位子上的数 n  加上环数 circles - 1 如果0不在0的位置上

user: user-0
content: 快考试了 兄弟们 帮个忙
user-0 提问: 结构体指针数组

回复:
user: user-1
content: 引用 4 楼 qq_33151401 的回复:[quote=引用 3 楼 zhangxiangDavaid 的回复:] 全局与局部的区别~ 可在程序运行时他都被压在栈里  没有影响吧[/quote] 跟栈没有关系！一个局部的类型，如何被全局所知。

user: user-0
content: 引用 3 楼 zhangxiangDavaid 的回复:全局与局部的区别~ 可在程序运行时他都被压在栈里  没有影响吧

user: user-1
content: 全局与局部的区别~

user: user-0
content: 引用 1 楼 zhangxiangDavaid 的回复:修改如下：  #include<stdio.h> #define N 100 struct strec { 	int num; 	int score; }a[N], *s[N];    //定义结构体指针数组,即储存结构体中各个元素 void fun(struct strec a[], struct strec *s[], int n); void main() { 	//struct strec 	//{ 	//	int num; 	//	int score; 	//}a[N], *s[N];    //定义结构体指针数组,即储存结构体中各个元素 	int i, n; 	printf("请输入学生的数目："); 	scanf("%d", &n); 	for (i = 0; i<n; i++) 	{ 		printf("请分别输入第%d个学生的学号和成绩：", i + 1); 		scanf("%d%*c%d", &a[i].num, &a[i].score); 		s[i] = a + i;     //结构体指针数组依次赋值 	} 	fun(a, s, n); } void fun(struct strec a[], struct strec *s[], int n) { 	int i, max, nummax; 	max = a[0].score; 	for (i = 0; i<n; i++) 	{ 		if (s[i]->score >= max)   //数组的第一个指针即指向第一个结构体的指针 		{ 			max = s[i]->score; 			nummax = i; 		} 	} 	printf("最高成绩的学生的学号和成绩为：%d %d", max, nummax); }  请问把他放在前面有什么不同吗

user: user-1
content: 修改如下：  #include<stdio.h> #define N 100 struct strec { 	int num; 	int score; }a[N], *s[N];    //定义结构体指针数组,即储存结构体中各个元素 void fun(struct strec a[], struct strec *s[], int n); void main() { 	//struct strec 	//{ 	//	int num; 	//	int score; 	//}a[N], *s[N];    //定义结构体指针数组,即储存结构体中各个元素 	int i, n; 	printf("请输入学生的数目："); 	scanf("%d", &n); 	for (i = 0; i<n; i++) 	{ 		printf("请分别输入第%d个学生的学号和成绩：", i + 1); 		scanf("%d%*c%d", &a[i].num, &a[i].score); 		s[i] = a + i;     //结构体指针数组依次赋值 	} 	fun(a, s, n); } void fun(struct strec a[], struct strec *s[], int n) { 	int i, max, nummax; 	max = a[0].score; 	for (i = 0; i<n; i++) 	{ 		if (s[i]->score >= max)   //数组的第一个指针即指向第一个结构体的指针 		{ 			max = s[i]->score; 			nummax = i; 		} 	} 	printf("最高成绩的学生的学号和成绩为：%d %d", max, nummax); }
user-0 提问: c语言中的位运算

回复:
user: user-1
content: 位运算：即按位运算

user: user-2
content: http://blog.csdn.net/zxj1988/article/details/8552180 请参考~~~  正在学C语言，其中讲到的位运算，按位于，按位或，按位异或，取反具体是怎么算的，最好能举个例子，还有其中讲到的低八位，高八位是什么意思，求解  比如  a= 0000 0001 0000 0001 b= 0000 0000 1000 0001 a&b =0000 0000 0000 0001 a^b = 0000 0001 1000 0000 a|b = 0000 0001 1000  0001 ^a = 1111 1110 1111 1110 b的高八位就是0000 0000 b的低八位就是1000 0001

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

user: user-4
content: 如果你的变量是一个2字节的（也就是16位）， xxxxxxxxyyyyyyyy中：yyyyyyyy就低8位，xxxxxxxx就高8位  按位与就是两个相同的位都是1结果是1，否则是0；或则是只要一位是1结果就为1；异或就只要不同时为1或0结果就为1；取反就是0变1，1变0
user-0 提问: C语言问题

回复:
user: user-1
content: 这句话就是让编译器以警告的方式显示后面的话。

user: user-0
content: 知道了，谢谢各位

user: user-2
content: 引用 2 楼 Dore_Woo 的回复:[quote=引用 1 楼 fefe82 的回复:] 这句话就是让编译器以警告的方式显示后面的话。  可以说得再详细一点吗？谢谢！[/quote]  编译时会输出字符串的警告内容

user: user-3
content: 就是说，如果之前定义过BT_USE_IO 这个宏的话，就让编译器发一条warning。 我自己测试的结果，应该能看明白吧，大概就是这个效果： [Warning] C:\Users\Main\Documents\C-Free\Temp\未命名3.c:5:2: warning: #warning "MV: BT_USE_IO!" [-Wcpp]

user: user-0
content: 引用 1 楼 fefe82 的回复:这句话就是让编译器以警告的方式显示后面的话。  可以说得再详细一点吗？谢谢！
user-0 提问: C语言中用宏定义函数中加入自增产生的结果与常规定义函数的结果相异

回复:
user: user-1
content: 函数是调用，宏只是展开或者说是替换，把里面y全部替换而已

user: user-0
content: 引用 1 楼 user-1 的回复:因为宏展开变成了 (i++*i++)  加了两次！ 那为什么另一个不会 不是都是形参吗

user: user-1
content: 因为宏展开变成了 (i++*i++)  加了两次！
user-0 提问: 函数的形参前面加&是什么意思？

回复:
user: user-1
content: 引用···········

user: user-2
content: 这是C++语法。

user: user-3
content: 指针即地址 引用即别名

user: user-4
content: 你可以看作是一个非 NULL 的指针的解析。

user: user-5
content: 此参数 & 表示为传递的是实参的别名~~~引用传递 也就是如果你函数里面修改了变量，变量的值会改变~~~

user: user-6
content: 多多关注下 C++ Primer

user: user-7
content: 声明函数时，在返回值后加&表示整个函数代表一个变量的引用，这样在函数调用时给函数赋值的操作才有意义，比如F(a)=b;

user: user-7
content: 格式A&a表示创建一个类型A的引用，当然创建时必须初始化给一个变量，当然用作函数形参就不用初始化，因为调用该函数时才完成初始化。  格式&a表示这个表达式的取值是变量a的地址

user: user-8
content: 引用，意为这个形参是传入传出参数，也就是从外部将这个参数传进去，然后函数里的ArrayCount与函数外面的那个相应的变量是同一变量。

user: user-9
content: 参考： 引用 http://blog.csdn.net/zhangxiangdavaid/article/details/43700497

user: user-9
content: C++语法：引用

user: user-10
content: 取地址符，多用于面向对象中没有指针的语言，当然C语言也可以用。

user: user-11
content: C语言里面不会出现这个格式的，在C++中，&可做取地址符，可做引用。此处的&表示的是引用，可以看做是函数的对于的那个参数的实参的别名，通过引用改变这个值参数的值，那么就相当于改变了主函数里的那个参数的值。可以通过这种方法来变相的增加函数的返回值。而一般如果没有引用的话，传进函数的是实参的一个拷贝，改变参数的值就只是局部改变。这就是加了&和不加&的区别。

user: user-12
content: C++中的东西 谁说C语言时用到这个，基本上就是误人子弟

user: user-13
content: 引用，借用C++里面的引用。 若用C语言实现，还得用指针！

user: user-14
content: “&”加在一个变量前时可以理解为“取地址符”， 它表示的是该变量的地址。“&ArrayCount”表示的就是ArrayCount这个变量的地址。

user: user-15
content: 传地址，使得函数内对该变量的修改全局有效。

user: user-16
content: 传递引用，可以在函数内部更改传入变量的值
user-0 提问: C语言中关于switch赋值的问题

回复:
user: user-1
content: 正解canf里面的%和变量以及变量前加不加&的一一对应关系

user: user-2
content: 引用 1 楼 user-5 的回复:printf("OK,you choose %.2ld\n", BASIC);  因为你把一个浮点数当作整数来输出 说的对  我调试了 的确此地方~~~ 写的有问题~~~ 变量值 是正确的~~

user: user-3
content: printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。

user: user-4
content: 引用 1楼user-5 的回复:printf("OK,you choose %.2ld\n", BASIC);  因为你把一个浮点数当作整数来输出正解

user: user-5
content: printf("OK,you choose %.2ld\n", BASIC);  因为你把一个浮点数当作整数来输出
user-0 提问: 想开发一个http服务器，，需要注意什么？

回复:
user: user-1
content: 简单的请求响应就行了。别搞那么复杂。先把http协议搞熟搞透。然后把unix网络编程那本书高透，然后把epoll搞透。

user: user-2
content: 需要高性能可以考虑c-fcgi或者直接http server，做业务通常选择Jsp,PHP这种更专业的语言。

user: user-3
content: //一个最简单的http服务，访问localhost:8888/hello package main  import ( 	"fmt" 	"net/http" )  func Hello(w http.ResponseWriter, r *http.Request) { 	fmt.Fprintln(w, "hello world") } func main() { 	http.HandleFunc("/hello", Hello) 	http.ListenAndServe(":8888", nil) }

user: user-4
content: 引用 7 楼 u010155023 的回复:最重要的当然是高并发和内存占用这两个问题。  一个能用的http server活很多的，高并发和内存效率是基本要求，常用的功能挨个开发一遍费时费力，光http就有1.0/1.1/2.0三个版本，加上websocket支持，协议就要忙个几个月了，此外reverse proxy是必备的，rewrite也没法不用，调用php还得支持fastcgi协议，调用python要支持wsgi/uwsgi协议，就算是BAT这样体量的公司，也是基于nginx做定制

user: user-4
content: 都用nginx或者apache，谁还自己写http server啊，最多基于nginx/apache做点定制

user: user-5
content: 最重要的当然是高并发和内存占用这两个问题。

user: user-6
content: 目前用的libevent做的，效率还可以

user: user-0
content: 引用 4 楼 user-7 的回复:[quote=引用 2 楼 u012879787 的回复:] [quote=引用 1 楼 user-7 的回复:] 支持cgi还是可以的。要支持jsp，asp就等于自己写一个编译器了。难度还是蛮大的。  阁下的意思是是说，一般项目中自己开发的http服务器， 只是实现静态页面的请求？  [/quote] 如果是学习完全可以支持动态脚本，但是在实际项目中使用，别说支持动态页面，就连支持静态页面的请求也极少有公司愿意自己动手写web服务器。因为就算是静态页面也要考虑比如并发，服务器响应时间，安全，内存占用，cpu占用等。    引用 3 楼 u012879787 的回复:[quote=引用 1 楼 user-7 的回复:] 支持cgi还是可以的。要支持jsp，asp就等于自己写一个编译器了。难度还是蛮大的。  不是有apache这些开源的吗？  为什么还要自己开发呢？ 是为了练手还是什么原因？[/quote] 这个纯粹练手，工作和学习还是要分开的[/quote]  那你的呢？  你自己做的有没有支持静态页面？   第2个问题：  boost 开发的http服务器是怎么回事？你不是说了吗， 它支持http， 但是这些东西顶多算练手，那么为什么还有那么  多人在网上写boost http方面的项目啊？  他们的项目 的应用场景是什么？ 我感觉他们的不是b/s架构而是c/s架构？     客户端不是浏览器，而是自己开发的gui程序，   然后去request服务器， 服务器response而已。 也不支持支持静态页面。   不知道我说的对不对？

user: user-7
content: 引用 2 楼 u012879787 的回复:[quote=引用 1 楼 user-7 的回复:] 支持cgi还是可以的。要支持jsp，asp就等于自己写一个编译器了。难度还是蛮大的。  阁下的意思是是说，一般项目中自己开发的http服务器， 只是实现静态页面的请求？  [/quote] 如果是学习完全可以支持动态脚本，但是在实际项目中使用，别说支持动态页面，就连支持静态页面的请求也极少有公司愿意自己动手写web服务器。因为就算是静态页面也要考虑比如并发，服务器响应时间，安全，内存占用，cpu占用等。    引用 3 楼 u012879787 的回复:[quote=引用 1 楼 user-7 的回复:] 支持cgi还是可以的。要支持jsp，asp就等于自己写一个编译器了。难度还是蛮大的。  不是有apache这些开源的吗？  为什么还要自己开发呢？ 是为了练手还是什么原因？[/quote] 这个纯粹练手，工作和学习还是要分开的

user: user-0
content: 引用 1 楼 user-7 的回复:支持cgi还是可以的。要支持jsp，asp就等于自己写一个编译器了。难度还是蛮大的。  不是有apache这些开源的吗？  为什么还要自己开发呢？ 是为了练手还是什么原因？

user: user-0
content: 引用 1 楼 user-7 的回复:支持cgi还是可以的。要支持jsp，asp就等于自己写一个编译器了。难度还是蛮大的。  阁下的意思是是说，一般项目中自己开发的http服务器， 只是实现静态页面的请求？

user: user-7
content: 支持cgi还是可以的。要支持jsp，asp就等于自己写一个编译器了。难度还是蛮大的。
user-0 提问: 能否访问数组下标为-1的单元，如a[-1] ?

回复:
user: user-1
content: 这应该也算一种越界吧

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

user: user-3
content: 这就是所谓的野指针。。值永远不知。。

user: user-4
content: 可以得。 比如你申请一个内存。 int p = new int[11]; 你需要把第0个元素标识为一个标识。 那么你返回给用户的就是 q = p+1; 当你用回调的时候，使用 q[-1] 来获取这个标识。  这只是一个语法而已。

user: user-5
content: 语法检查不出来的 但是 属于越界 内存操作错误 运行时会有 未知错误~~~

user: user-6
content: 运行结果是不可预料的。。

user: user-7
content: 不要试图做一些越界操作，虽然不一定出错，但不出错只是暂时的~

user: user-8
content: 这种做法比较危险，访问a[-1]实际上是访问了栈内位于a下方的数据，运行结果是不可预料的。

user: user-9
content: 1.我觉得不会报错。这个数组是在栈内分配的，访问a[-1]实际上是访问了栈内位于a下方的数据，你的函数不可能是最底层调用，所以访问这个内存一般没什么问题。 2.从位置上来讲，它是a[0]的前一个，但是它并不在a数组里面，所以从成员上来讲a[0]是第一个，它没有前一个元素。 另外，常量下标超出数组范围会导致编译器报警告或者报错，这种写法是不可取的。

user: user-10
content: a[-1]、即*(a-1)的值是不可预知的

user: user-11
content: a[-1] = 0; 编译时不会报错，访问的其实是*(a-1)，运行时是否会出问题，就要看你访问的是正确的内存了 如果a是指向数组中间的一个指针，访问的将仍然是数组内的元素，但通常不会这样用

user: user-12
content: 没研究过  不过感觉和int a[100]里面存100个活人差不多。
user-0 提问: gcc -W 和-W1参数分别是什么意思？ 

回复:
user: user-1
content: gcc -v --help的输出中有：   -W                      Enable extra warnings

user: user-0
content: 引用 6 楼 zhao4zhong1 的回复:gcc --help gcc -v --help  找到了 -Wl 中的 l是 link的缩写， 为什么-W 这个参数没有问题，因为：  Options starting with -g, -f, -m, -O, -W, or --param are automatically  passed on to the various sub-processes invoked by gcc.  In order to pass  other options on to these processes the -W<letter> options must be used.  For bug reporting instructions, please see:  也就说， -W 后面可能为空，没有出错，呵呵，结贴

user: user-1
content: gcc --help gcc -v --help

user: user-0
content: gcc -W 这个参数。  google都谷歌不到！！

user: user-1
content: 搜“跟我一起写makefile”

user: user-0
content: 引用 2 楼 fefe82 的回复:makefile自身发生变化，make的时候，重新make一次，怎么写？  把 Makefile 加到依赖里面去。  加那个依赖？  makefile  target:依赖文件  target填写什么？填写all ?还是什么？

user: user-2
content: makefile自身发生变化，make的时候，重新make一次，怎么写？  把 Makefile 加到依赖里面去。

user: user-3
content: 请在控制台上输入：man gcc 回车，然后使用PgDn键翻看你要找的问题。
user-0 提问: 软件外形

回复:
user: user-1
content: 软件外遇

user: user-2
content: 引用 7 楼 zhao4zhong1 的回复:软件外遇 我也来试个

user: user-2
content: 建议楼主去淘宝买本C++ Builder的书入门学习（不知道买哪本可以问我），C++ Builder是RAD工具，也就是说，程序外观界面可以用鼠标拖拉就可以设计出来，一个有外观各种界面元素的程序（没有实际功能），不用写一行代码，鼠标设计完编译一下就可以运行。 参考： http://blog.163.com/tab_98/blog/static/11924097201511274543737/ 里面有C++ Builder写的程序例子。

user: user-1
content: 维基百科词条“软件外形”正等着楼主去填写。

user: user-0
content: 引用 2 楼 _郭的回复:楼主说的是外观吗，可以搜索一下GUI 搜索了一下应该就是这东西谢谢了

user: user-0
content: 引用 2 楼 _郭的回复:楼主说的是外观吗，可以搜索一下GUI 就是软件所有能被看到的部分，那种怎么说呢。。。就是如何给显示器发送固定位置固定形状固定颜色的图片当然那个所谓的固定是自己定义的意思，不过多借助其他什么mfc什么可视化的东西，一个像素点一个像素点的自己编写的那种东西嘛

user: user-0
content: 引用 1 楼 赵4老师的回复:维基百科词条“软件外形”正等着楼主去填写。 新手见谅，不过那样说其实也没多大问题的吧，

user: user-3
content: 楼主说的是外观吗，可以搜索一下GUI
user-0 提问: 新手求助

回复:
user: user-1
content: 不一样啊，其实是C的副作用问题。每个语句的副作用都要在分号处结束，也就是说所有的自增，自减操作都会在 对应的第一个分号处完成。

user: user-2
content: i--是在执行完这行代码后，才会减去。  参照我的博客：http://blog.csdn.net/user-2/article/details/50186417

user: user-0
content: 为啥屏显不同啊 C语言不是从上倒下 自右向左么？
user-0 提问: 在嵌套循环中的死循环问题

回复:
user: user-1
content: 虽然是新手，但是while（）在C中是一个循环结构吧括号内是条件。

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

user: user-3
content: while(k--)         {             printf("%d",k);           } 这个循环的终止条件是k--为0，即k为0时，执行之后k的值为-1. 终止之后进入下一次外层循环，然后又开始执行内层循环，此时k=-1，递减无法到0，所以一直循环输出负数
user-0 提问: 虚拟打印机调用真实打印机

回复:
user: user-1
content: Printing and Print Spooler Functions The following functions are used to print.        AbortDoc   DeviceCapabilities   EndDoc   EndPage   Escape   ExtEscape   SetAbortProc   StartDoc   StartPage

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:你要知道，输出到打印机驱动的文件中的文字多半已经被转换成位图了，你想把“123”改成“456”？是哪个“123”？一号字？宋体？黑色？艺术字？页眉中的改不改？表格中的改不改？页码中的改不改？ 建议还是先洗洗睡吧。 不是说，在“详细说明在PrintDocumentOnPrintProcessor中如何将打印任务转换为图像文件的过程”这里不是可以取到原始数据吗？应该有办法可以在某个地方修改打印数据的吧！

user: user-1
content: 你要知道，输出到打印机驱动的文件中的文字多半已经被转换成位图了，你想把“123”改成“456”？是哪个“123”？一号字？宋体？黑色？艺术字？页眉中的改不改？表格中的改不改？页码中的改不改？ 建议还是先洗洗睡吧。

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:Printing and Print Spooler Functions The following functions are used to print.        AbortDoc   DeviceCapabilities   EndDoc   EndPage   Escape   ExtEscape   SetAbortProc   StartDoc   StartPage 其实我的需求就像是想在虚拟打印机里将打印文件里面的“123”改成“456”，那我到底如何将打印机内容保存在一个文件，修改后再将这文件传给真实打印机呢？
user-0 提问: 一个关于指针的示例！！！初学求指教！！

回复:
user: user-0
content: 引用 4 楼 user-3 的回复:temp和ptr1是指向了同一个地址，所以a的地址不变，你的程序只是把b的值给了a，*temp=*ptr1都是b的值，最后*ptr2=*temp又把b的值给自己，所以都是b的值，a和b的地址始终不变  谢谢！！学习了！

user: user-1
content: 引用 4 楼 user-3 的回复:temp和ptr1是指向了同一个地址，所以a的地址不变，你的程序只是把b的值给了a，*temp=*ptr1都是b的值，最后*ptr2=*temp又把b的值给自己，所以都是b的值，a和b的地址始终不变 是的

user: user-2
content: 关于指针： http://blog.csdn.net/zhangxiangdavaid/article/details/37885275

user: user-3
content: temp和ptr1是指向了同一个地址，所以a的地址不变，你的程序只是把b的值给了a，*temp=*ptr1都是b的值，最后*ptr2=*temp又把b的值给自己，所以都是b的值，a和b的地址始终不变

user: user-1
content: 引用 2 楼 Peggy_Chang 的回复:[quote=引用 1 楼 paschen 的回复:] void swap(int *ptr1,int *ptr2) {     int temp;     temp=*ptr1;     *ptr1=*ptr2;     *ptr2=*temp; }  变量值变化不影响变量地址 所以即使a的值改变了，他的地址也不改变是吗？那么最终ptr1和ptr2是不是都指向的地址不一样但是*ptr1=*ptr2=20？？ [/quote]  没懂你意思，请注意交换指针本身与交换指针把指变量的区别

user: user-0
content: 引用 1 楼 paschen 的回复:void swap(int *ptr1,int *ptr2) {     int temp;     temp=*ptr1;     *ptr1=*ptr2;     *ptr2=*temp; }  变量值变化不影响变量地址 所以即使a的值改变了，他的地址也不改变是吗？那么最终ptr1和ptr2是不是都指向的地址不一样但是*ptr1=*ptr2=20？？

user: user-1
content: void swap(int *ptr1,int *ptr2) {     int temp;     temp=*ptr1;     *ptr1=*ptr2;     *ptr2=*temp; }  变量值变化不影响变量地址
user-0 提问: 新人malloc问题求解答

回复:
user: user-1
content: Linux下的malloc是开源的。

user: user-2
content: “我发现malloc的空间有16b的下限，也就是malloc（0）和malloc（16）应该是一样的” 你是怎么发现的？

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

user: user-3
content: malloc(0)是一个不确定行为，没出错只是运气好，如果我没猜错猜错，你运行free(ptr);程序就崩了

user: user-4
content: 每个编译器的处理都不一样。  这能说没出错是你运气好。  想看具体的，只能单步到 malloc 里面去看怎么实现的。

user: user-0
content: 可以说具体一点吗？我就是整不明白为啥头一个可以，后一个不对。这个有啥原理吗？

user: user-0
content: 我明白了，蟹蟹！

user: user-4
content: 这样使用是错误的，错误的的程序结果是未知的。

user: user-5
content: 这与系统底层实现有关，不同的系统可能会有不同结果。  malloc分配的内存并不完全等同于是你指定的大小（要考虑字节对齐的方式，以及保存一些信息使得调用free（）可以正确释放这个内存块）。  引用If size is 0, then malloc() returns either NULL, or a unique pointer value that can        later be successfully passed to free().   malloc(0)的结果可能为NULL，也可能是一个可以安全传递给free()的指针。 在后一种情况下，malloc(0)也会分配一定的空间（比如24字节或32字节）。 可以调用 size = malloc_usable_size(a)；看一下实际分配了多少字节。

user: user-6
content: malloc()的原则是够用，而不是恰好够用 因此，可能会多分配一些内存， 但是是否一定会多分配一点，这是不确定的 标准也没规定，一定会多分配一点。 这是由实现决定的。