Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 大一学生求教 函数引用问题

回复:
user: user-0
content: 引用 5 楼 Adol1111 的回复:int g(int p, int q)//求最小公倍数 { int w; w = (p * q)/f(x, y);//这里的x,y是什么意思？是p,q吗？  return w; } 是的是的 现在弄明白了 谢谢！

user: user-1
content: 引用 4 楼 b372119132 的回复:[quote=引用 3 楼 adeng1919 的回复:] int g(int p, int q)//求最小公倍数 { int w; w = (p * q)/f(x, y);  return w; } 这个函数里面并没有定义x和y，把x换成p，y换成q就对了，是同一个数 非常感谢[/quote]及时结贴就行

user: user-2
content: int g(int p, int q)//求最小公倍数 { int w; w = (p * q)/f(x, y);//这里的x,y是什么意思？是p,q吗？  return w; }

user: user-0
content: 引用 3 楼 adeng1919 的回复:int g(int p, int q)//求最小公倍数 { int w; w = (p * q)/f(x, y);  return w; } 这个函数里面并没有定义x和y，把x换成p，y换成q就对了，是同一个数 非常感谢

user: user-1
content: int g(int p, int q)//求最小公倍数 { int w; w = (p * q)/f(x, y);  return w; } 这个函数里面并没有定义x和y，把x换成p，y换成q就对了，是同一个数

user: user-0
content: 引用 1 楼 zshuaiqin 的回复:不要这样 我是实在找不到人问 又很苦恼 求别喷。。。

user: user-3
user-0 提问: 请教个问题！

回复:
user: user-0
content: 引用 1 楼 adeng1919 的回复:struct box_props{ unsigned int opaque:1;     unsigned int fill_color:3; unsigned int :4; unsigned int show_border:1; unsigned int border_color:3; unsigned int border_style:2; unsigned int:2; };  你传的结构体对象，fill_color=3，border_color=3，所以都是数字 colors[pb->fill_color]才是字符串，你字符串的定义是colors啊 运行结果border_color=2，不是3.

user: user-1
content: 我只看到了一串unsigned int struct box_props{     unsigned int opaque:1;     unsigned int fill_color:3;     unsigned int :4;     unsigned int show_border:1;     unsigned int border_color:3;     unsigned int border_style:2;     unsigned int:2; };

user: user-2
content: pb->border_color不是字符串yellow吗？不是，是数字，colors[pb->border_color]才是字符串yellow

user: user-2
content: struct box_props{ unsigned int opaque:1;     unsigned int fill_color:3; unsigned int :4; unsigned int show_border:1; unsigned int border_color:3; unsigned int border_style:2; unsigned int:2; };  你传的结构体对象，fill_color=3，border_color=3，所以都是数字 colors[pb->fill_color]才是字符串，你字符串的定义是colors啊
user-0 提问: swap汇编指令

回复:
user: user-1
content: temp：地址 a，b：地址的地址  []里面的是地址，没有“值”，汇编不要和c放一起读，读完汇编再看c，呵呵呵

user: user-2
content: a,b都是指针。

user: user-3
content: (int &a,int &b) 实际上传递的就是指针值。

user: user-4
content: void Myswap(int &a,int &b) {     int temp;      temp= a;     a= b;     b=temp; }  你的第4行不是给temp赋值，而是给temp初始化。 “变量赋值”和“变量初始化”不是一回事！ “变量赋值”发生在运行期，其写法遵循赋值语法规定。 “变量初始化”发生在编译期或运行期，其写法遵循初始化列表语法规定。
user-0 提问: 关于《高质量程序设计CC++语言》的编译时地址分配的问题

回复:
user: user-1
content: 引用 2 楼 xwhbwas2008 的回复:[quote=引用 1 楼 nadleeh123 的回复:] [quote=引用 楼主 xwhbwas2008 的回复:] 再看书中的话，作者说了这么一句话(见里面的红线) 有点不理解，望大侠指点。  编译时只确定了运行时需要的内存大小，地址分配是程序运行加载时os来管理的，你的程序无权直接控制[/quote]  那书中的话是说：数组下标k是一个变量，它在编译时候是没有值的。//这个话是嘛意思阿 ？ [/quote] 本来就是这样啊，那里是个循环体，在汇编层就由跳转指令，比较指令，数据构成的一段指令，下标只会对应一段地址初始值。就算这样你不能理解，换个方式，如果k那里循环5万次，是不是就得有5万个值放在内存

user: user-2
content: 就是在编译时是无法确定这个值是多少的，他可能是任何数字。即使你刚刚定义为int i = 4，然后使用这个i，编译器仍然认为是一个未知的值。因为编译器不检查整个代码，是无法确定你在定义到使用之间有没有修改的。  为了避免无意义的检查，所以编译器是一刀切的。也就是说，编译时我不关系他的值到底是多少，我都认为是不知道。直到运行的时候，我取出了这个值，我才确定了它。  量子力学里有一个叫薛定谔的猫的问题，你可以去了解下。

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:运行时  书中的话是说：数组下标k是一个变量，它在编译时候是没有值的。//这个话是嘛意思阿 ？

user: user-3
content: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）

user: user-3
content: 运行时

user: user-0
content: 引用 1 楼 nadleeh123 的回复:[quote=引用 楼主 xwhbwas2008 的回复:] 再看书中的话，作者说了这么一句话(见里面的红线) 有点不理解，望大侠指点。  编译时只确定了运行时需要的内存大小，地址分配是程序运行加载时os来管理的，你的程序无权直接控制[/quote]  那书中的话是说：数组下标k是一个变量，它在编译时候是没有值的。//这个话是嘛意思阿 ？

user: user-1
content: 引用 楼主 xwhbwas2008 的回复:首先问一个问题，  int func() { int a[2],b;//问下这个b,a[0]和 a[1]的地址是什么时候分配的啊？编译时候还是运行的时候  return 0; }  再看书中的话，作者说了这么一句话(见里面的红线) 有点不理解，望大侠指点。  编译时只确定了运行时需要的内存大小，地址分配是程序运行加载时os来管理的，你的程序无权直接控制
user-0 提问: 请帮忙推荐一本经典汇编语言的书

回复:
user: user-1
content: 引用 2 楼 hangang7403 的回复:汇编语言第2版（完全版）王爽 的 不错 就是有点老+1

user: user-2
content: 引用 11 楼 M173475237 的回复:16位的找王爽。。 windows下的找罗云彬~ linux下的看《汇编语言程序设计》红皮的那本。有中文翻译版。  汇编语言程序设计 [平装] ~ 布鲁姆 (作者)http://www.amazon.cn/%E6%B1%87%E7%BC%96%E8%AF%AD%E8%A8%80%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1-%E5%B8%83%E9%B2%81%E5%A7%86/dp/B0011BB30I/ref=wl_it_dp_o_pC_nS_nC?ie=UTF8&colid=3T498RBWYV9QV&coliid=I2UF1U0E2B7G0B

user: user-3
content: 16位的找王爽。。 windows下的找罗云彬~

user: user-4
content: 我也同求啊，希望那种不要太枯燥的

user: user-5
content: 其实能理解机器底层是如何运算的，基本上学汇编的目的就达到了，毕竟真正用汇编工作的少。

user: user-6
content: 《汇编语言》第二版PDF 王爽 http://download.csdn.net/detail/cui13aiwang/2770201#comment  王爽真真正正是个会教的老师

user: user-6
content: 这种书必须看作者的教书的水平，高手很多，但会教的高手很少，王爽写的书和其他人相比简直是鹤立鸡群。

user: user-6
content: 8086的看王爽的神作《汇编语言第2版》，win32下的汇编看《Windows环境下32位汇编语言程序设计（第2版》

user: user-7
content: 其实打本简明汇编看看就行了

user: user-8
content: 不同平台的汇编语言不同，lz 首先要确定大方向

user: user-9
content: 引用 楼主 u010334406 的回复:想学习汇编语言，想找本经典的书看看，类似于K&R的C语言书一样的书，我英语只有三级水平看不懂，英文的要有翻译版本的。 see mips run linux

user: user-10
content: 汇编语言第2版（完全版）王爽 的 不错 就是有点老

user: user-11
content: Intel微处理器结构、编程与接口（第六版）----------------------------------------------------------------------------Barry B. Brey 80x86、奔腾机汇编语言程序设计--------------------------------------------------------------------------------------Barry B. Brey Windows环境下32位汇编语言程序设计（第2版)------------------------------------------------------------------------------ --罗云彬 IBM-PC汇编语言程序设计（第2版） 本书是国内优秀教材-------------------------------------------------------------- --沈美明 温冬婵 IBM PC汇编语言程序设计（第五版） 这本书籍是国外优秀教材---------------------------------------------PETER ABEL著,沈美明 温冬蝉译
user-0 提问: 这个程序怎么将十进制转化为十六进制的，我是菜鸟，麻烦哪位大神帮我稍微详细的讲解一下

回复:
user: user-1
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试是程序员必须掌握的技能之一。

user: user-0
content: 这个程序可以实现把一个大数据以十六进制输出，我想知道是怎么实现的

user: user-2
content: for(;t;t--)printf("%X",b[t]); 数在计算机内都是用二进制存的,用printf输出时,%d就输出十进制值,%x就输出十六进制值,并没有转化
user-0 提问: 快速排序算法有问题！求发现！

回复:
user: user-0

user: user-1
content: 引用 5 楼 lt114896 的回复:没事写的，可以研究下 void QuikSort(int a[], long low, long high) { 	if(low >= high) 	{ 		return; 	} 	long nlow = low; 	long nhigh = high; 	int temp = 0;	 	bool flag = false;  	while(nlow<nhigh) 	{ 		if(a[nlow] > a[nhigh]) 		{ 			temp = a[nlow]; 			a[nlow] = a[nhigh]; 			a[nhigh] = temp; 			flag = !flag; 		} 		if(flag) 		{ 			nlow++; 		} 		else 		{ 			nhigh--; 		} 	}  	QuikSort(a, low, nhigh); 	QuikSort(a, nhigh+1, high); }  呵呵，你这个应该不是快速排序吧？

user: user-2
content: 引用 2 楼 worldy 的回复:void QuickSort(int array[], int n)  快速排序看这个函数参数就知道不对，快排函数直接或间接的参数必须必须有三个，第一个参数数组，第二个参数开始下标，第三参数个结束下标re

user: user-3
content: 没事写的，可以研究下 void QuikSort(int a[], long low, long high) { 	if(low >= high) 	{ 		return; 	} 	long nlow = low; 	long nhigh = high; 	int temp = 0;	 	bool flag = false;  	while(nlow<nhigh) 	{ 		if(a[nlow] > a[nhigh]) 		{ 			temp = a[nlow]; 			a[nlow] = a[nhigh]; 			a[nhigh] = temp; 			flag = !flag; 		} 		if(flag) 		{ 			nlow++; 		} 		else 		{ 			nhigh--; 		} 	}  	QuikSort(a, low, nhigh); 	QuikSort(a, nhigh+1, high); }

user: user-4
content: 引用 3 楼 Adol1111 的回复:你的快排参数有问题，你一直都是从0排到n这个是不对。其实下标和结束下标都是动态变化的，先由分治算法算出一个点n，然后分别排序改点的两侧 low - n-1 和 n+1 - high。你试试看这个：int partition(int array[], int low,int high) { 	int pivot = array[low];  	if (low>=high) return low;  	while (low<high) { 		while (low < high && array[high] >= pivot) --high; 		array[low]=array[high];//算出high之后记得立刻赋值 		while (low < high && array[low] <= pivot) ++low; 		array[high]=array[low]; 	} 	//array[0] = array[lh];这句话你写的，完全没必要，至少我没看懂。 	array[low] = pivot; 	return low; }  void QuickSort(int array[], int low,int high) { 	int boundary; 	if (low>=high)return; 	boundary = partition(array, low , high); 	QuickSort(array , low , boundary-1);//排low  -  boundary-1 	QuickSort(array , boundary + 1, high );//排boundary+1 - high }++

user: user-5
content: 你的快排参数有问题，你一直都是从0排到n这个是不对。其实下标和结束下标都是动态变化的，先由分治算法算出一个点n，然后分别排序改点的两侧 low - n-1 和 n+1 - high。你试试看这个：int partition(int array[], int low,int high) { 	int pivot = array[low];  	if (low>=high) return low;  	while (low<high) { 		while (low < high && array[high] >= pivot) --high; 		array[low]=array[high];//算出high之后记得立刻赋值 		while (low < high && array[low] <= pivot) ++low; 		array[high]=array[low]; 	} 	//array[0] = array[lh];这句话你写的，完全没必要，至少我没看懂。 	array[low] = pivot; 	return low; }  void QuickSort(int array[], int low,int high) { 	int boundary; 	if (low>=high)return; 	boundary = partition(array, low , high); 	QuickSort(array , low , boundary-1);//排low  -  boundary-1 	QuickSort(array , boundary + 1, high );//排boundary+1 - high }

user: user-6
content: 貌似最后移动pivot的位置有误...      //if (array[lh] >= pivot)     //    return 0;     array[0] = array[lh-1];     array[lh-1] = pivot;     return lh-1;

user: user-7
content: 先 http://www.microsoft.com/visualstudio/chs/downloads#d-2010-express 点开Visual C++ 2010 Express下面的语言选‘简体中文’，再点立即安装  再参考C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\qsort.c

user: user-1
content: void QuickSort(int array[], int n)  快速排序看这个函数参数就知道不对，快排函数直接或间接的参数必须必须有三个，第一个参数数组，第二个参数开始下标，第三参数个结束下标
user-0 提问: 二进制ip显示成点分十进制

回复:
user: user-1
content: #include <stdio.h> #include <string.h>  typedef union ip_addr_t { unsigned int nip; unsigned char cip[4]; }ip_addr;  int main(int argc, char** argv) { ip_addr ip; ip.nip=0x726F6F74;//your_int_ip;  char buf[16]; memset(buf, 0x00, sizeof(buf)); sprintf(buf,"%d.%d.%d.%d",ip.cip[3],ip.cip[2],ip.cip[1],ip.cip[0]); printf("%s", buf); return 0; }

user: user-2
content: 使用sprintf组成字符串

user: user-3
content: 很好办， 先确定自己电脑的字节序， 然后一个字节一个字节取，（用无符号字符指针即可） 然后将取得的字节转化成数字，根据ASCII码 OK，组合一下就行了

user: user-0
content: 不是这样啦，， int 占4个字节，第一个字节是 0x72                第二个字节是 0x6F                第三个字节是 0x6F                第四个字节是 0x74 也就是 int value = 726F6F74; 转换成字符串 "114.111.111.116".

user: user-4
content: 引用 楼主 u012889234 的回复:二进制IP ： 72 6F 6F 74   要显示成 :114.111.111.116  c语言代码要怎么写啊？ 四个数，用%d打印就是了！只是16进制而已！

user: user-0
content: 必须给！！！

user: user-1
content: 引用 7 楼 u012889234 的回复:5楼的方法还可以，，我咋忘了联合呢，，我是新手！  多指教！！！ 这种写法在项目里面真的用过的，就是要注意大小端的问题。 另外，楼主给分不

user: user-0
content: 感谢6楼再次光临！！！！

user: user-0
content: 5楼的方法还可以，，我咋忘了联合呢，，我是新手！  多指教！！！

user: user-5
content: #include<stdio.h> void main() {     int ip[4];     int i;     for(i=0;i<4;i++)         scanf("%x",&ip[i]);     for(i=0;i<3;i++)         printf("%d.",ip[i]);     printf("%d\n",ip[i]); }

user: user-6
content: #include <stdio.h> char IP[4] = {0x72,0x6F,0x6F,0x74}; int main() {     printf("%d.%d.%d.%d",(unsigned)IP[0],(unsigned)IP[1],(unsigned)IP[2],(unsigned)IP[3]);     return 0; } 114.111.111.116

user: user-7
content: 这明显是十六进制啊怎么会是二进制 自己写一个十六进制转十进制的的函数，最后再凑成ip字符串形式
user-0 提问: OpenGL glut如何固定窗体大小

回复:
user: user-1
content: WM_GETMINMAXINFO The WM_GETMINMAXINFO message is sent to a window when the size or position of the window is about to change. An application can use this message to override the window's default maximized size and position, or its default minimum or maximum tracking size.   WM_GETMINMAXINFO  lpmmi = (LPMINMAXINFO) lParam; // address of structure    Parameters lpmmi  Value of lParam. Pointer to a MINMAXINFO structure that contains the default maximized position and dimensions, and the default minimum and maximum tracking sizes. An application can override the defaults by setting the members of this structure.  Return Values If an application processes this message, it should return zero.   Remarks The maximum tracking size is the largest window size that can be produced by using the borders to size the window. The minimum tracking size is the smallest window size that can be produced by using the borders to size the window.   QuickInfo   Windows NT: Requires version 3.1 or later.   Windows: Requires Windows 95 or later.   Windows CE: Unsupported.   Header: Declared in winuser.h.  See Also Windows Overview, Window Messages, MoveWindow, SetWindowPos, MINMAXINFO

user: user-2
content: 参考http://libsh.org/ref/online/onlinese2.html，稍作修改即可。  引用 楼主 wuyanxue 的回复:RT 在网上搜过 说可以利用resize()函数将height和width固定死    但不知道怎么固定死这两个参数? 请大神给出解决办法 或者用其他办法也行

user: user-3
content: 引用 楼主 wuyanxue 的回复:RT 在网上搜过 说可以利用resize()函数将height和width固定死    但不知道怎么固定死这两个参数? 请大神给出解决办法 或者用其他办法也行 const类型或者宏...
user-0 提问: 队伍长度为L米，并匀速前进。传令兵以匀速，先从队尾跑到队头，再从队头跑回队尾，期间队伍行进了S米。请问传令兵一共跑了多少米？ 

回复:
user: user-0
content: 引用 引用 3 楼 user-6 的回复:用double不要用float试试，数据大的时候float精度不够专业。几天前用double通过了！ 谢谢各位！受教了

user: user-1
content: int 是几位的？ 如果是16位的，l*l就溢出了。

user: user-2
content: 这是数学题，还是递归，循环的题？

user: user-3
content: 纯数学解法： 设士兵速度为x,部队速度为y 部队行走时间t1=S/y 士兵行走时间t2=L/(x-y)+L/(x+y) t1=t2，得到S/y=2xL/(x^2-y^2)，得到x/y-y/x=2L/S 需要求的是距离A = x*t=x*S/y，得到A/S=x/y，带入得 A/S-S/A=2L/S，得到A^2-2LA-S^2=0。 利用一元二次方程组的解得到，A=L+sqrt(L^2+S^2)。  算完了发现和楼主提供的代码一样的....没啥问题啊！！！！

user: user-4
content: 引用 2 楼 u012540439 的回复:引用算完了发现和楼主提供的代码一样的....没啥问题啊！！！！  OJ通不过嘞…… WA还是ot? 不过这题。。我怎么觉得好像是相对运动的那题啊。。就是把队伍当成火车，然后传令兵走的距离是2L。。

user: user-5
content: 运行代码，输入样例输入，看能否得到跟样例输出一样的输出。

user: user-6
content: 用double不要用float试试，数据大的时候float精度不够

user: user-0
content: 引用算完了发现和楼主提供的代码一样的....没啥问题啊！！！！  OJ通不过嘞……
user-0 提问: 这个程序的输出该怎么改才正确啊？？

回复:
user: user-1
content: 楼主很幸运，居然还能输出一个学生的信息而不是程序崩溃。循环里面每次都输入同一个地址就先不说了。关键是这个地址在数组的有效地址之外，数组长度为5的话，有效下标应该是0到4

user: user-2
content: http://download.csdn.net/detail/max_min_/6333711 好好看基础书籍，上面的例程都敲下  磨刀不误砍材工！

user: user-3
content: “多一少一”问题占程序员常犯错误的10%以上！

user: user-4
content: #include<stdio.h> struct student  {     int num;     char name[50];     float score[3]; }; void inputSore(struct student *p); void printScore(struct student *s);//这里做了修改  void main ()     {     struct student stu[3];     int i;     for(i=0;i<3;i++)//这里做了修改     { 		printf("请输入\n学号:  姓名:     三科考试成绩:\n");         inputSore (&stu[i]);     }     printScore(stu);     }  void inputSore(struct student *p) {     scanf("%d %s %f %f %f",&p->num,p->name,&p->score[0],&p->score[1],&p->score[2]);     printf("\n"); }  void printScore(struct student *s) {     int i;     printf("学号:    姓名:     三科考试成绩:\n");     for (i=0;i<3;i++)     {         printf("%d   ",s[i].num);         printf("%s   ",s[i].name); 		printf("%f   %f   %f\n",s[i].score[0],s[i].score[1],s[i].score[2]);//有修改     } }

user: user-5
content: for(i=1;i<=5;i++)for(i=0;i<5;i++)下标从0开始     {         printf("请输入\n学号:  姓名:     三科考试成绩:\n");         inputSore (&stu[5]);这里不是该用i么？      }
user-0 提问: C和指针 第六章，编程题目，第二题

回复:
user: user-0
content: #include "stdio.h" #include "string.h" char* ptr (char * p1, char * p2); int  del_substr ( char * st1, char * st2); int main() {	char * d; 	int cmp,cnp,cp,clp,p;				  	char  a [100]= "abcdefghij";		  	char  b[100] = "cde";  	cnp = strlen(a);  	cp = strlen(b);  	d = ptr(a,b);  	cmp = del_substr(a,b);  	if(cmp)  	{  		  			for(clp = 0;clp<cp;clp++)  			  				for(p = 0;p<cnp;p++)	  					  					a[d-a+p] = a[d-a+p+1];	   				printf("%s",a);  			  	}  	else  	printf("没有任何子串");  	 } char * ptr (char * p1, char * p2) { 	char *str1,*str2; 	for(str1 = p1;*str1 != '\0';str1++) 		for(str2 = p2; *str2 != '\0';str2++) 			if(*str1 == *str2) 			return str1; 			 	return NULL; 	 } int del_substr( char * st1, char *st2) { 	char * temp; 	int i,count,p; 	count = 0; 	i = strlen(st2); 	if (st1 == NULL && st2 == NULL)	 		return 0; 	temp = ptr(st1 ,st2); 	if(temp == NULL) 		return 0; 	for(p = 0;p<i;p++) 		if(*temp++ == *st2++) 			count ++; 			if(i == count) 			return 1; 			 	return 0;					 }  这个是我写的代码。测试过了

user: user-1
content: 仅供参考#include <stdio.h> #include <string.h> #include <locale.h> char s[256]; char *p; int r,n,i; int main() {     setlocale(LC_ALL,"chs");     while (1) {         printf("请输入一行文字(空行结束),\"%%20\"将替换为\" \",\"你懂得\"将替换为\"XXXXXX\":\n");         fgets(s,256,stdin);         if ('\n'==s[0]) break;         p=s;         while (1) {             p=strstr(p,"%20");             if (p) {                 memmove(p+1,p+3,strlen(p)-3+1);                 p[0]=' ';             } else break;         }         p=s;         while (1) {             p=strstr(p,"你懂得");             if (p) {                 memmove(p+6,p+6,strlen(p)-6+1);                 for (i=0;i<6;i++) p[i]='X';             } else break;         }         printf("%s",s);     }     return 0; } //请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXXXXX": //abcdefg%20helloworld%20something.pdf //abcdefg helloworld something.pdf //请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXXXXX": //这是测试文字你懂得，在这个你懂的地方，就得做你懂得的事 //这是测试文字XXXXX，在这个你懂的地方，就得做XXXXX的事 //请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXXXXX": //

user: user-2
content: 楼主去搜一下KMP算法，做字符串模式匹配，然后再删除就好了。

user: user-3
content: 引用 楼主 u012804737 的回复:题目说起来不难，编写一个函数，删除一个字符串的一部分。函数原型如下，  int del_substr(char *str ,char const * substr) 要求是不使用操纵字符的库函数。 首先判断，子串在不在主串中，在的话，返回1 不在的话返回0； 举例， str = abcdef  substr = cde 那么返回1 如果   str = abcdef   substr bce  那么返回0 我想了半天，想了好多办法，就是没有一种可行的，最接近的方法也差了点，没办法只能求救。只希望大家帮我写到返回值那一块，剩下的删除字符串，我可以自己写，或则可以告诉我一个思路。  想了差不多一天的时间，才想出来，老的帖子没办法回复了，网上也没有符合要求的代码，自己写的，贴一个，算是鼓励自己，我这智商实在不适合学习C语言，看来 不用string.h下的函数就自己写个类似的呗-.-,string.h里面的玩意儿经常被当作面试题
user-0 提问: 多维数组排序

回复:
user: user-1
content: 先横排再纵排

user: user-2
content: sorry想错了，看成一维数组排序，正解。

user: user-2
content: 引用 楼主 landuodejiafeimao 的回复:给定一个10*10数组,对其进行排序,使其满足，每行从左到右升序排列,同时每列从上到下升序排列 只能分别对行和列进行排序么？那样，我觉得有可能会无解啊？比如如果中间排出现了最大值，那无论如何也不行了，所以，是不是这些输入不是随意的？或者是可以出现无解的情况？ 如果可以全部任意排序，那就如楼上说的。 引用 7 楼 ForestDB 的回复:看成100个元素的一维数组，排序之。 看成一维数组排序

user: user-3
content: 看成100个元素的一维数组，排序之。

user: user-4
content: 如果觉得麻烦，可以先将这个10*10的二维数组赋值给100的一维数组，然后再对这个一位数组进行排序，排好后存进二维数组即可，反正没有空间复杂度的限制。

user: user-5
content: 做两个函数，第一个先对行排序，然后第二个对每一行循环排序

user: user-6
content: 不难阿，我的思路，你把这个二维数组按照一维排序方式排序（二维数组可以看做一维数组，对吧？），就行了。就是你当成是100大小的一维数组就行了，从小到大排。 能写出来吗？

user: user-7
content: 结果不唯一,不过正常从小到大排就行

user: user-0
content: 就是说随机输入一个10*10的矩阵用数组存储，现在对其进行排序，使得最终结果为每一行从左到右为升序，同时满足每一列从上到下也为升序，请给出排序算法

user: user-8
content: 问题描述不够详细
user-0 提问: 求助，同一结构体居然打印出不同结果

回复:
user: user-1
content: #include <stdio.h> #define field_offset(s,f) (int)(&(((struct s *)(0))->f)) struct AD  { int a; char b[13]; double c;}; #pragma pack(push) #pragma pack(1) struct A1  { int a; char b[13]; double c;}; #pragma pack(2) struct A2  { int a; char b[13]; double c;}; #pragma pack(4) struct A4  { int a; char b[13]; double c;}; #pragma pack(8) struct A8  { int a; char b[13]; double c;}; #pragma pack(16) struct A16 { int a; char b[13]; double c;}; #pragma pack(pop) int main() {     printf("AD.a %d\n",field_offset(AD,a));     printf("AD.b %d\n",field_offset(AD,b));     printf("AD.c %d\n",field_offset(AD,c));     printf("\n");     printf("A1.a %d\n",field_offset(A1,a));     printf("A1.b %d\n",field_offset(A1,b));     printf("A1.c %d\n",field_offset(A1,c));     printf("\n");     printf("A2.a %d\n",field_offset(A2,a));     printf("A2.b %d\n",field_offset(A2,b));     printf("A2.c %d\n",field_offset(A2,c));     printf("\n");     printf("A4.a %d\n",field_offset(A4,a));     printf("A4.b %d\n",field_offset(A4,b));     printf("A4.c %d\n",field_offset(A4,c));     printf("\n");     printf("A8.a %d\n",field_offset(A8,a));     printf("A8.b %d\n",field_offset(A8,b));     printf("A8.c %d\n",field_offset(A8,c));     printf("\n");     printf("A16.a %d\n",field_offset(A16,a));     printf("A16.b %d\n",field_offset(A16,b));     printf("A16.c %d\n",field_offset(A16,c));     printf("\n");     return 0; } //AD.a 0 //AD.b 4 //AD.c 24 // //A1.a 0 //A1.b 4 //A1.c 17 // //A2.a 0 //A2.b 4 //A2.c 18 // //A4.a 0 //A4.b 4 //A4.c 20 // //A8.a 0 //A8.b 4 //A8.c 24 // //A16.a 0 //A16.b 4 //A16.c 24 // //

user: user-0
content: 引用 7 楼 liuhongwei110 的回复:同一地址，同一结构体不能保证相同的值，比如你fork（）一个子进程，就会出现相同变量的地址一样，但值不同，这个很正常，因为用的都是虚拟地址。 这个程序当中没有使用多进程和多线程，是一个实时程序

user: user-2
content: 同一地址，同一结构体不能保证相同的值，比如你fork（）一个子进程，就会出现相同变量的地址一样，但值不同，这个很正常，因为用的都是虚拟地址。

user: user-0
content: 引用 5 楼 nice_cxf 的回复:看所有文件，是不是有 类似#pragma pack (4)，之后都#pragma pack ()回来了，如果设置完没置回，加上就可以了 应该不是这个问题，我写程序从来不用#pragma语句

user: user-3
content: 看所有文件，是不是有 类似#pragma pack (4)，之后都#pragma pack ()回来了，如果设置完没置回，加上就可以了

user: user-0
content: 引用 3 楼 nice_cxf 的回复:字节对齐设置不一致把 自己对齐吗，要在哪里设置呢，我也感觉是对齐的问题

user: user-3
content: 字节对齐设置不一致把

user: user-0
content: 引用 1 楼 abc594986308 的回复:看不懂？你要干嘛？ 同一地址，同一结构体，为何打印的数据不一样呢

user: user-4
content: 看不懂？你要干嘛？
user-0 提问: 求解答，关于scanf函数问题

回复:
user: user-1
content: 楼上正解，

user: user-2
content: #include <stdio.h> char s[]="123 ab 4"; char *p; int v,n,k; void main() {     p=s;     while (1) {         k=sscanf(p,"%d%n",&v,&n);         printf("k,v,n=%d,%d,%d\n",k,v,n);         if (1==k) {             p+=n;         } else if (0==k) {             printf("skip char[%c]\n",p[0]);             p++;         } else {//EOF==k             break;         }     }     printf("End.\n"); } //k,v,n=1,123,3 //k,v,n=0,123,3 //skip char[ ] //k,v,n=0,123,3 //skip char[a] //k,v,n=0,123,3 //skip char[b] //k,v,n=1,4,2 //k,v,n=-1,4,2 //End.

user: user-3
content: #include<stdio.h> #define M 3 #define N 4  void main() { 	int i,j; 	char a[M][N];  	for(i=0;i<M;i++) 		for(j=0;j<N;j++){ 			scanf("%c",&a[i][j]);                         getchar();                 } 	printf("\n\n数组为:\n"); 	for(i=0;i<M;i++) 	{ 		for(j=0;j<N;j++) 			printf("%c\t",a[i][j]); 		printf("\n");  	} }

user: user-3
content: 引用 5 楼 u011471910 的回复:[quote=引用 3 楼 waynexuan 的回复:] 制表符换成空格不好意思，我没表达清楚。。我其实是想问输入数组的时候为什么输入 w w w w s s s s  h h h h 敲下回车无法结束循环输入，必须再输入一个除了空格，回车以外的字符才能完成输入，还有什么其他方法可以不用再输入其他字符就可以完成数组的输入吗[/quote] 去掉scanf()里的空格,后面加getchar()

user: user-0
content: 引用 3 楼 waynexuan 的回复:制表符换成空格不好意思，我没表达清楚。。我其实是想问输入数组的时候为什么输入 w w w w s s s s  h h h h 敲下回车无法结束循环输入，必须再输入一个除了空格，回车以外的字符才能完成输入，还有什么其他方法可以不用再输入其他字符就可以完成数组的输入吗

user: user-4
content: 楼上正解！制表符换成空格

user: user-3
content: 制表符换成空格

user: user-3
content: #include<stdio.h> #define M 3 #define N 4   void main() {     int i,j;     char a[M][N];       for(i=0;i<M;i++)         for(j=0;j<N;j++)             scanf("%c ",&a[i][j]);     printf("\n\n数组为:\n");     for(i=0;i<M;i++)     {         for(j=0;j<N;j++)             printf("%c ",a[i][j]);         printf("\n");       } }

user: user-5
content: printf("%c\t",a[i][j]);
user-0 提问: float 类型数据输出问题

回复:
user: user-1
content: 引用 7 楼 huabinsir 的回复:[quote=引用 3 楼 zhao4zhong1 的回复:] 用10进制小数不能精确表示某些三进制小数0.1(3)=0.33333333333……(10) 同理，用二进制小数也不能精确表示某些10进制小数。  用10进制小数不能精确表示某些三进制小数0.1(3)=0.33333333333……(10)? 为什么?  如何理解你的意思? [/quote]  3进制的0.1 转换成10进制就是0.33333333……

user: user-2
content: 看看内存中到底是什么

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:用10进制小数不能精确表示某些三进制小数0.1(3)=0.33333333333……(10) 同理，用二进制小数也不能精确表示某些10进制小数。  用10进制小数不能精确表示某些三进制小数0.1(3)=0.33333333333……(10)? 为什么?  如何理解你的意思?

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

user: user-4
content: 理解  计算机中整型数据最精确

user: user-5
content: 引用 4 楼 huabinsir 的回复:[quote=引用 2 楼 Adol1111 的回复:] 你的scale估计是0.0000000000000000000001这种，浮点数无法精确，所以输出的是0.0000 你改成这样应该就可以了：if((scale-0)>1e5) 浮点数无法精确，比较所以处理的时候会很麻烦，不要直接进行比较。  if (scale>0) 正确的写法应是以下吗?  ==> if((scale-0)>0.000001) [/quote] 具体精度按自己的情况取，浮点数一般是是这样比较的。因为如你所见的，当非常接近这个浮点数的时候比较会出现异常。最好把0写成0.0浮点数的格式。

user: user-0
content: 引用 2 楼 Adol1111 的回复:你的scale估计是0.0000000000000000000001这种，浮点数无法精确，所以输出的是0.0000 你改成这样应该就可以了：if((scale-0)>1e5) 浮点数无法精确，比较所以处理的时候会很麻烦，不要直接进行比较。  if (scale>0) 正确的写法应是以下吗?  ==> if((scale-0)>0.000001)

user: user-5
content: 你的scale估计是0.0000000000000000000001这种，浮点数无法精确，所以输出的是0.0000 你改成这样应该就可以了：if((scale-0)>1e5) 浮点数无法精确，比较所以处理的时候会很麻烦，不要直接进行比较。

user: user-6
content: 太扯了，首先判断浮点数不应该直接用这样简单的>0 判断还有，输出结果一定不应该是这样子的
user-0 提问: 我的VC++跟office2010冲突了，要怎么解决，我看网上给出的一些解决方案了，没看明白，求一个能私聊指导的

回复:
user: user-1
content: VC++6.0吧，之前遇到过这个问题，解决方法是装一个插件，能够替代VC自带的打开http://www.cr173.com/soft/35169.html

user: user-2
content: FileTool.exe 替换打开和添加到项目中 Visual C++ 的新功能 http://support.microsoft.com/kb/241396/zh-cn

user: user-3
content: 引用 2 楼 user-4 的回复:VC++6？本身的问题吧，直接换了...微软要是连自己产品都不支持，这是在作死啊！ 确实作死过 以前安装VC++6.0是总是失败，然后把微软拼音卸载了就OK了...

user: user-4
content: VC++6？本身的问题吧，直接换了...微软要是连自己产品都不支持，这是在作死啊！

user: user-3
content: 只见过跟微软拼音冲突导致安装失败 没见过与office冲突！！！ 围观一下
user-0 提问: 在Win7 64bit环境下  MinGW + msys 编译 ffmpeg 

回复:
user: user-0
content: 1、根据网上的MinGW + msys搭建环境， 然后 启动 msys.bat ,输入： ./configure --enable-memalign-hack ，完成后不做make操作。 2、使用eclipse， new -->other-->c/c++中的 c project,下一步，输入 project name：ffmpeg  project type中选择： Makefile project-- Empty Project Toolchains中选择：MinGW GCC 然后finish即可  接着把第1步的ffmpeg目录中的内容复制到项目ffmpeg目录下， 编译工程，看到错误就修正；  3、注意： c:\MinGW\include\SDL 需放置在c:\MinGW\include前面

user: user-0
content: 基本已经编译出来啦，谢谢各位的关注

user: user-0
content: ./configure --enable-memalign-hack  后就出现上面的错误哦， 在 config.err 中 ，我现在用IDE编译一下 ，好像是没有定义  __STRICT_ANSI__这个的原因 。

user: user-1
content: ./configure make

user: user-1
content: 查看README文件

user: user-0
content: 想玩玩...

user: user-2
content: 干嘛要编译，下一个就行了

user: user-0
content: 有哪些老大 弄过，或编译成功的，教教小弟，不胜感激.
user-0 提问: 怎样去掉else没有返回值提示警告？？？

回复:
user: user-1
content: int judge(Lqueue *l,char chch)  //判断方向，1,2,3,4分别为上下左右 这个函数要回返回值。LZ的代码要是都不满足执行else,就是缺少返回值吧。在else后面加一条return 0;试试。 if(chch==105) return 1; if(chch== 107) return 2; if(chch== 106) return 3; if(chch== 108) return 4; 这些if 应该都改为else if要不然else只对应最后一个if

user: user-2
content: 引用 12 楼 ForestDB 的回复:如果chch只可能有那四个值，那么else就是多余的，既可以省略，也可以随便返回值，因为else一定走不到； 但是如果chch不只那四个值，且只有那四个值是有意义的，那么else就必需返回一个“与众不同”（错误值）的值，表示chch不是四种情况中的一种，程序有错（chch输入有问题）。++++

user: user-3
content: 引用 4 楼 jiakao123 的回复:[quote=引用 3 楼 worldy 的回复:] 返回一个非控制值，比如-1什么的返回-1，会影响 while(judge(l,chch))     {       snakemove(l,judge(l,chch));     }中，judge(1,chch)的值，怎么办？[/quote] 不使用while(judge(l,chch))这种写法

user: user-4
content: 你先弄清楚你要实现的效果到底是什么 首先，else的情况可能出现吗？如果不会出现，那就不需要这个else，如果会出现，那你当然要给出明确的返回值，没有“不需要返回什么”一说，否则你若int i=judge(XXX,XXX)这么写，那当judge里面出现了else情况的时候，你这个i应该是多少？

user: user-5
content: 如果else不做任何事，那么你说的这段该怎么处理：while(judge(l,chch)){     snakemove(l,judge(l,chch)); }你先想清楚正常的结果是什么，如果的确是else了，程序应该会怎么运行，想清楚了就可以处理了。而不是盲目把错误隐藏掉。

user: user-0
content: 还是不行啊。。。

user: user-6
content: .... else {  while(judge(l,chch))    {       snakemove(l,judge(l,chch));     } } return -1;//能会有什么问题？ ｝

user: user-0
content: 引用 3 楼 worldy 的回复:返回一个非控制值，比如-1什么的返回-1，会影响 while(judge(l,chch))     {       snakemove(l,judge(l,chch));     }中，judge(1,chch)的值，怎么办？

user: user-6
content: 返回一个非控制值，比如-1什么的

user: user-0
content: 引用 1 楼 akirya 的回复:你不写的话,就可能得到一个垃圾值,错的可能性更大.我知道规范的形式应该写一下，但是不知道怎么写不会影响主函数？

user: user-7
content: 你不写的话,就可能得到一个垃圾值,错的可能性更大.

user: user-8
content: 如果chch只可能有那四个值，那么else就是多余的，既可以省略，也可以随便返回值，因为else一定走不到； 但是如果chch不只那四个值，且只有那四个值是有意义的，那么else就必需返回一个“与众不同”（错误值）的值，表示chch不是四种情况中的一种，程序有错（chch输入有问题）。

user: user-9
content: 不要使用 while (条件) 更不要使用 while (组合条件) 要使用 while (1) {  if (条件1) break;  //...  if (条件2) continue;  //...  if (条件3) return;  //... } 因为前两种写法在语言表达意思的层面上有二义性，只有第三种才忠实反映了程序流的实际情况。 典型如： 下面两段的语义都是当文件未结束时读字符 whlie (!feof(f)) {  a=fgetc(f);  //...  b=fgetc(f);//可能此时已经feof了！  //... } 而这样写就没有问题： whlie (1) {  a=fgetc(f);  if (feof(f)) break;  //...  b=fgetc(f);  if (feof(f)) break;  //... } 类似的例子还可以举很多。

user: user-4
content: 引用 9 楼 czarten 的回复: int i=judge(l,chch);  while(i) {       if(i==-1)            continue;       snakemove(l,i);       i=judge(l,chch); }   我没细看你代码，这样不行么？  哦，这个不对，continue前要先更新i

user: user-4
content: int i=judge(l,chch);  while(i) {       if(i==-1)            continue;       snakemove(l,i);       i=judge(l,chch); }   我没细看你代码，这样不行么？
user-0 提问: C新手，大神帮忙看下我的程序错在哪儿？

回复:
user: user-1
content: 在变量kuatuo为赋值时就进行计算。  float kuatuo; double mass; long double fenzi; printf("Input your kuatuo:"); scanf("%f",&kuatuo); mass=kuatuo*950.0f; fenzi=mass/3.0e-23; printf("There are %10.4Le fenzi\n",fenzi); return 0;

user: user-2
content: scanf("%f",&kuatuo);//这一句丢在上面去，先给了值，再计算！

user: user-3
content: 引用 1 楼 xiaoliang1201 的回复:float kuatuo;变量kuatuo没有赋初值。把scanf("%f",&kuatuo);语句放到double mass=kuatuo*950.0f; long double fenzi=mass/3.0e-23;前面去也行。

user: user-3
content: float kuatuo;变量kuatuo没有赋初值。

user: user-0
content: 谢谢大家  可以了，这个不能变声明变量边计算而且先要赋值再计算。新手 以后还请多照顾  一起交流。

user: user-4
content: 引用 2 楼 xiaoliang1201 的回复:[quote=引用 1 楼 xiaoliang1201 的回复:] float kuatuo;变量kuatuo没有赋初值。把scanf("%f",&kuatuo);语句放到double mass=kuatuo*950.0f; long double fenzi=mass/3.0e-23;前面去也行。[/quote]re

user: user-5
content: 。。。。都没有赋值就计算了
user-0 提问: gcc 4.7.2如何使用gets_s

回复:
user: user-1
content: http://en.cppreference.com/w/c/io/gets  The gets_s function is an extension and is optional. It is guaranteed to be present only if __STDC_LIB_EXT1__ is defined.  可以打开stdio.h，在里面找gets_s的声明，有就表示是支持的，否则就不支持。 另外它是可选的，即使支持也得将__STDC_LIB_EXT1__宏打开。

user: user-0
content: 且不说链接的事吧，光是使用gets不给warning已经不对了啊。我明明试过出现warning的，除非我记错了。但是我就用过VS和GCC而已，VS都几乎不开的。

user: user-0
content: 引用 16 楼 Exaybachay 的回复:mingw 默认链接 msvcrt.dll,   *_s 的不属于 msvcrt.dll  那该链接哪个？

user: user-2
content: mingw 默认链接 msvcrt.dll,   *_s 的不属于 msvcrt.dll

user: user-3
content: 好像也不行

user: user-3
content: 自己声明一下就行了 char *gets_s(char *s, int n); 然后：  gcc -std=c1x -c 。。。。。。。。。

user: user-0
content: 今晚再试试吧。

user: user-3
content: 试试更高版的gcc吧

user: user-3
content: 还真的

user: user-0
content: 引用 7 楼 Exaybachay 的回复:mingw 用的c库是哪个, 你知道不.  要是我知道就不会上来问了。

user: user-0
content: 引用 3 楼 ForestDB 的回复:"可是C11明确了使用gets_s代替gets啊" 求出处。 同时求gcc 4.7.2完整支持C11的出处。  貌似GCC官方都不给出4.7.2的手册- -  我这个是MinGW，不知道有什么不同，MinGW声称是 Minimalist GNU for Windows.

user: user-0
content: 我曾经试过出现gets是不被建议使用的函数的提示的（当然是英文提示），但是版本不记得了。 可能是MinGW 开启 -std=99吧,我记得好像是测试 restrict 关键字时出现的。

user: user-2
content: mingw 用的c库是哪个, 你知道不.

user: user-0
content: 引用 2 楼 buyong 的回复:可是C11明确了使用gets_s代替gets啊.  这个说法谁告诉你的？ http://zh.wikipedia.org/zh-cn/C%2B%2B11  不是C++11，是C11 百度百科 第5点： http://baike.baidu.com/link?url=ZQTAB8aQgU_oC2wbNpXcg8oZ8FO-9l58zwQtWdqALKZE2tsdfnf1G3vVkQBSzHaZ91rUvgcpRmA9B1V0iKY6XK 维基百科 3.5 C11： http://zh.wikipedia.org/wiki/C%E8%AF%AD%E8%A8%80

user: user-0
content: 引用 1 楼 akirya 的回复:非标准函数，gcc不能用很正常。  百度百科 第5点： http://baike.baidu.com/link?url=ZQTAB8aQgU_oC2wbNpXcg8oZ8FO-9l58zwQtWdqALKZE2tsdfnf1G3vVkQBSzHaZ91rUvgcpRmA9B1V0iKY6XK 维基百科 3.5 C11： http://zh.wikipedia.org/wiki/C%E8%AF%AD%E8%A8%80

user: user-0
content: 不好意思，最近忙，没来上网。我逐一回复。

user: user-4
content: 非标准函数，gcc不能用很正常。

user: user-1
content: "可是C11明确了使用gets_s代替gets啊" 求出处。 同时求gcc 4.7.2完整支持C11的出处。

user: user-3
content: 可是C11明确了使用gets_s代替gets啊.  这个说法谁告诉你的？ http://zh.wikipedia.org/zh-cn/C%2B%2B11
user-0 提问: 关于memmove实现问题

回复:
user: user-1
content: 引用 楼主 Zhc1993 的回复:最近看了下网上讲解memmove, 代码如下  void * __cdecl memmove （ void * dst,const void * src,size_t count)  {           void * ret = dst;           if (dst <= src || (char *)dst >= ((char *)src + count))           {                     // 若dst和src区域没有重叠，则从起始处开始逐一拷贝                     while (count--)                     {                              *(char *)dst = *(char *)src;                              dst = (char *)dst + 1;                              src = (char *)src + 1;                     }           }           else           { // 若dst和src 区域交叉，则从尾部开始向起始位置拷贝，这样可以避免数据冲突                     dst = (char *)dst + count - 1;                     src = (char *)src + count - 1;                     while (count--)                     {                              *(char *)dst = *(char *)src;                              dst = (char *)dst - 1;                              src = (char *)src - 1;                     }           }           return(ret);  }  为什么最后处理重叠情况的代码，只有一个反向处理，我怎么感觉有两种情况： src尾部地址 > dest尾部地址， 直接正向处理 src尾部地址 < dest尾部地址， 就用反向处理。 就是先处理掉重叠部分。 不知道是不是我搞错了。望赐教。 第一注释错了吧。if (dst <= src || (char *)dst >= ((char *)src + count))处理两种情况，其中就包含一种交叉的情况。

user: user-0
content: 对啊，注释是错了，懂了，谢谢啊！！！

user: user-2
content: 自己模拟下交叉的集中情形，再来看代码。

user: user-3
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试是程序员必须掌握的技能之一。
user-0 提问: 关于里linux下的dup2

回复:
user: user-0
content: 用fork子进程解决了

user: user-1
content: 如果不是有错误发生， exec 是一个不会返回的函数，就像 exit 这样的函数一样.

user: user-0
content: execl的man手册：The  exec()  family  of functions replaces the current process image with a new process image.整个进程空间都已经被替换成新的进程了，好像是这么回事

user: user-2
content: 调用execl之后，后面的close和printf都不可能执行了。  相当于新启动的sh的标准输入和标准输出都是这个sock.  这是我个人的理解。

user: user-0
content: 在程序开始的时候 int sid=dup(STDIN_FILENO); int sod=dup(STDOUT_FILENO);

user: user-0
content: 引用 1 楼 user-3 的回复:fprintf(stderr,"client ended\n"); 试试？ 好像是没有恢复输出定向，小小改了一下还是没有输出 if(connect(sock, (struct sockaddr *)&server, sizeof(struct sockaddr)) == -1) { close(sock); sleep(5); goto loop; } send(sock, message, sizeof(message), 0); dup2(sock, STDIN_FILENO);//输入 dup2(sock, STDOUT_FILENO);//输出 execl(shell,"/bin/sh",(char *)0); dup2(sid,STDIN_FILENO); dup2(sod,STDOUT_FILENO); close(sock); fprintf(stderr,"client ended\n"); }

user: user-3
content: fprintf(stderr,"client ended\n"); 试试？
user-0 提问: 帮我看看错在哪里，谢谢！！！

回复:
user: user-1
content: 那把错误贴出来吧！埃 提问的学问纳

user: user-2
content: #include<stdio.h> #include<stdlib.h> #define MAX 50 typedef struct  {     char data[MAX];     int top; }SeqStack;  SeqStack *Init_SeqStack() {     SeqStack *s;     s=malloc(sizeof(SeqStack));     s->top=-1;     return s; }  int IsEmpty(SeqStack *s) {     if(s->top==-1)          return 1;     else          return 0; }  char Push_SeqStack(SeqStack *s,char x) {     if(s->top==MAX-1)     {          printf("栈满!\n");          return 0;     }     else    {          s->top++;          s->data[s->top]=x;          return 1;     } }  char Pop_SeqStack(SeqStack *s,char x) {     if(IsEmpty(s))     {         printf("栈空!\n");         return 0;     }     else     {         x=s->data[s->top];         s->top--;         return 1;     } }  typedef struct node { 	char data; 	struct node *Lchild; 	struct node *Rchild; }BiTree; BiTree *Init_BiTree() { 	BiTree *root; 	root=(BiTree *)malloc(sizeof(BiTree)); 	root->Lchild=NULL; 	root->Rchild=NULL; 	return root; }   BiTree *Creat_BiTree() { 	BiTree *root; 	char ch; 	ch=getchar(); 	if(ch==' ') 		root=NULL; 	else 	{ 		root=(BiTree *)malloc(sizeof(BiTree)); 		root->data=ch; 		root->Lchild=Creat_BiTree(); 		root->Rchild=Creat_BiTree(); 	} 	return root; }  void PreOder(BiTree *root) { 	SeqStack *s; 	BiTree *p; 	s=Init_SeqStack(); 	p=root; 	while(p!=NULL||!IsEmpty(s)) 	{ 		while(p!=NULL) 		{ 			printf("%c ",p->data); 			Push_SeqStack(s,p->data); 			p=p->Lchild; 		} 		if(!IsEmpty(s)) 		{ 			Pop_SeqStack(s,p->data); 			p=p->Rchild; 		} 	} }  int main(void) { 	BiTree *root; 	root=Init_BiTree(); 	root=Creat_BiTree(); 	PreOder(root); 	return 0; }

user: user-0
content: 引用 2 楼 user-3 的回复:先学排版， 再学debugger 最后学指针。 我追踪到进入右子树的时候就出错了，但不知道怎么错了？？？

user: user-3
content: 先学排版， 再学debugger 最后学指针。

user: user-0
content: 来个大神啊  ，我都头疼了
user-0 提问: 求代码阅读工具

回复:
user: user-0
content: Source Insight我试了，好像只能查找函数，查找不了结构体变量

user: user-1
content: code navigation source insight lxr

user: user-2
content: 我就用的vs，呜呜

user: user-3
content: Source Insight吧。 另外lxr项目，可以搜索下，它的原理就是把一套源代码解析后做成html，然后类型／函数什么的都可以点击跳转；可以试试。

user: user-4
content: 推荐source insight或者slickedit 后者看c++好点

user: user-5
content: source Insight 啊！ 阅读源码必备的。

user: user-6
content: source Insight / Eclipse +CDT
user-0 提问: 新人求教：5行4列的数组 使用while和for的时候  ，for正确而while不对

回复:
user: user-0
content: 谢谢楼上的几位  我又学到了点方法

user: user-0
content: 引用 5 楼 zhao4zhong1 的回复: #include <stdio.h> #include <stdlib.h>  int main (void) {  int a=0,arr[10];   while (1)  { /*        if (a<10)        {           arr[a]=a;           a++;             } else {          break  ;             } */ /*这样写代码简洁不少，嘻嘻*/        arr[a]=a++;        if (a>9) break;  }    for (a=0;a<10;a++)  {                   printf("%d,%d\n",arr[a],a);   }   //printf("%d",rand());  system("pause");     return 0;    }

user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:不要使用 while (条件) 更不要使用 while (组合条件) 要使用 while (1) {  if (条件1) break;  //...  if (条件2) continue;  //...  if (条件3) return;  //... } 因为前两种写法在语言表达意思的层面上有二义性，只有第三种才忠实反映了程序流的实际情况。 典型如： 下面两段的语义都是当文件未结束时读字符 whlie (!feof(f)) {  a=fgetc(f);  //...  b=fgetc(f);//可能此时已经feof了！  //... } 而这样写就没有问题： whlie (1) {  a=fgetc(f);  if (feof(f)) break;  //...  b=fgetc(f);  if (feof(f)) break;  //... } 类似的例子还可以举很多。   谢谢你，你的回复很仔细，while(1) { }

user: user-1
content: for (b=0;b<5;b++) 记得给a、b清零。

user: user-2
content: 不要使用 while (条件) 更不要使用 while (组合条件) 要使用 while (1) {  if (条件1) break;  //...  if (条件2) continue;  //...  if (条件3) return;  //... } 因为前两种写法在语言表达意思的层面上有二义性，只有第三种才忠实反映了程序流的实际情况。 典型如： 下面两段的语义都是当文件未结束时读字符 whlie (!feof(f)) {  a=fgetc(f);  //...  b=fgetc(f);//可能此时已经feof了！  //... } 而这样写就没有问题： whlie (1) {  a=fgetc(f);  if (feof(f)) break;  //...  b=fgetc(f);  if (feof(f)) break;  //... } 类似的例子还可以举很多。

user: user-3
content: while (a<5)  {      // add code      b = 0;      while (b<4)      {            arr[a][b]=rand();            printf("\n%d\t%d\n",a,b);           b++;      }      a++;    }

user: user-4
content: 应该都不正确  while ,在while（b。。）之前要加b=0; for b的值超出范围，b最大是3不是4

user: user-5
content: 引用 1 楼 redmangame 的回复:while (a<5)  {      while (b<4)      {            arr[a][b]=rand();            printf("\n%d\t%d\n",a,b);           b++;      }      a++;       b=0;  }  循环体内b=4了 在a循环内设置a=0初始值就可以了 楼上正解。

user: user-6
content: while (a<5)  {      while (b<4)      {            arr[a][b]=rand();            printf("\n%d\t%d\n",a,b);           b++;      }      a++;       b=0;  }  循环体内b=4了 在a循环内设置a=0初始值就可以了
user-0 提问: 简单问题

回复:
user: user-1
content: 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  为什么要有数据结构这个东东？ 因为要将现实世界或者抽象理论中的各种数据保存在计算机外存（光盘、硬盘、U盘……）或内存（ROM、RAM、SRAM……）里面的二进制字节数组中。 然后让CPU这个只会执行预先保存好的加减乘除移位条件转移……等机器指令的家伙按照人的意志去处理这些数据。至于具体如何处理就是所谓算法。  电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……

user: user-2
content: 0跟1表示一切,包括數據,控制的指令,地扯 通過數據總線傳送的0,1都是數據,實際上我都不懂,也不想懂,太恐怖了,知道概念就算了

user: user-3
content: 看一下《计算机组成原理》这本书吧，基础的东西了解以后学习计算机方面都有好处。

user: user-4
content: int，二进制补码 float/double，IEEE 754编码 char，常见的有ascii，utf⋯⋯

user: user-5
content: 引用 3 楼 u010952247 的回复:关键是理解计算机系统的电路结构去表征代数结构，程序员修炼的深层功夫。  那是硬件

user: user-6
content: 很多个0,1

user: user-7
content: 这问题……  在现在的“数字式计算机”中，最基本的就是0和1了。 你能看到的图片、文字、视频，以及各种声音、磁盘上的文件/目录等等，终归结底，都全部是用 0和1 来表示的……

user: user-8
content: 通过逻辑门（logic gates）来控制生成二进制数0,1

user: user-0
content: 关键是理解计算机系统的电路结构去表征代数结构，程序员修炼的深层功夫。

user: user-9
content: 0,1                            .

user: user-10
content: 二进制位。  引用 楼主 u010952247 的回复:计算机的数据怎么表示的？
user-0 提问: 程序员至少要精读哪些经典书

回复:
user: user-1
content: 引用 20 楼 akirya 的回复:注意身体啊，养生预防之类的书也要看 ++++ 程序猿必修------养生之道。

user: user-2
content: 注意身体啊，养生预防之类的书也要看

user: user-0
content: MSDN 比较适合 C++。

user: user-0
content: 关键看你要学习那些专业方向，例如 C 或 C++ ，或者 JAVA ，那么需要仔细看的书籍会有些差异的。

user: user-3
content: 引用 7 楼 jxlijunhao 的回复:引用 4 楼 zhao4zhong1 的回复:MSDN 赵老师还在啊，几年前就见过您了  哈哈 头像依然潇洒难辨啊~他

user: user-4
content: 引用 14 楼 truelance 的回复:[quote=引用 13 楼 Adol1111 的回复:] 《TCPL》《APUE》《TCP/IP详解》《计算机网络》《设计模式》《代码大全》《程序员修炼之道——从小工到专家》《敏捷软件开发原则 模式与实践》《人月神话》《TAOCP》《编译原理》？  不知道楼主说的是啥方面的书。上面列了好多，都太厚了，等看完不知道何年何月了... 慢慢看，一口吃不成胖子， 这些书我已经看完70%左右了。[/quote] 好毅力....希望都完全吸收了，不是单纯的“看”完

user: user-5
content: 引用 13 楼 Adol1111 的回复:《TCPL》《APUE》《TCP/IP详解》《计算机网络》《设计模式》《代码大全》《程序员修炼之道——从小工到专家》《敏捷软件开发原则 模式与实践》《人月神话》《TAOCP》《编译原理》？  不知道楼主说的是啥方面的书。上面列了好多，都太厚了，等看完不知道何年何月了... 慢慢看，一口吃不成胖子， 这些书我已经看完70%左右了。

user: user-4
content: 《TCPL》《APUE》《TCP/IP详解》《计算机网络》《设计模式》《代码大全》《程序员修炼之道——从小工到专家》《敏捷软件开发原则 模式与实践》《人月神话》《TAOCP》《编译原理》？  不知道楼主说的是啥方面的书。上面列了好多，都太厚了，等看完不知道何年何月了...

user: user-6
content: 深入理解计算机系统

user: user-7
content: 引用 11 楼 ForestDB 的回复:我扭头看了一下我的书架，发现这几本是可以推荐的： Compter System, A Programmer's Perpective The C Programming Language +++++

user: user-8
content: 我扭头看了一下我的书架，发现这几本是可以推荐的： Compter System, A Programmer's Perpective The C Programming Language

user: user-9
content: 认真上课 。看你想做的方向

user: user-10
content: 专业课教材  认真上课

user: user-11
content: 引用 楼主 u010952247 的回复:您好，我是初级程序员。请问程序员至少要精读哪些经典书？  看应该看的

user: user-12
content: 引用 4 楼 zhao4zhong1 的回复:MSDN 赵老师还在啊，几年前就见过您了

user: user-13
content: 引用 5 楼 user-14 的回复:[quote=引用 4 楼 zhao4zhong1 的回复:] MSDN  不是Windows开发程序员呢？亲[/quote] man命令

user: user-14
content: 引用 4 楼 zhao4zhong1 的回复:MSDN  不是Windows开发程序员呢？亲

user: user-13
content: MSDN

user: user-14
content: http://bbs.csdn.net/topics/390638386 前几天发的帖子，给你借鉴下！

user: user-5
content: 太泛了. 你现在打算学的是哪个方面? 某种语言, java? c? c++? python? erlang? 数据结构和算法? 编译原理? 操作系统? 数据库? 人工智能? 图像处理? 计算机网络? 嵌入式开发? 电商系统? 网游开发?
user-0 提问: 一个链表的小问题

回复:
user: user-1
content: 问题出在这里：  p1->next=p2;             p1=p2;             p2=(struct Student*)malloc(LEN);             scanf("%d",&p2->num); 你让p1=p2后，p1->next = p2->next,但是，p2经过malloc且while循环不再执行后，p1->next指向哪里？这就造成了野指针。

user: user-2
content: 引用 2 楼 K5082 的回复:[quote=引用 1 楼 wildcrazy 的回复:]  struct Student* creat() {     struct Student *p1,*p2,*head;     p1=p2=(struct Student*)malloc(LEN);     scanf("%d",&p2->num);     head=NULL;  //这里为什么还要把head给NULL一下？     while(p2->num!=0)     { [/quote] 也可以是一个空的链表吧

user: user-3
content: 引用 2 楼 K5082 的回复:[quote=引用 1 楼 wildcrazy 的回复:]  struct Student* creat() {     struct Student *p1,*p2,*head;     p1=p2=(struct Student*)malloc(LEN);     scanf("%d",&p2->num);     head=NULL;  //这里为什么还要把head给NULL一下？     while(p2->num!=0)     { [/quote] 如果不给它赋 NULL，想象一下，你输入的时候，上来就输 0 ，会发生什么

user: user-0
content: 引用 1 楼 wildcrazy 的回复: struct Student* creat() {     struct Student *p1,*p2,*head;     p1=p2=(struct Student*)malloc(LEN);     scanf("%d",&p2->num);     head=NULL;  //这里为什么还要把head给NULL一下？     while(p2->num!=0)     {

user: user-3
content: while(p2->num!=0)     {         n=n+1;         if(n==1)         {             head=p1;         }         else         {             p1->next=p2;  ///////// 最后输入 0 之后，没有执行这里！！             p1=p2;             p2=(struct Student*)malloc(LEN);             scanf("%d",&p2->num);         }     }     p2->next=NULL;//将这里的p2改成p1之后就没事了
user-0 提问: 关于++，printf问题

回复:
user: user-1
content: 这样做，只是为了验证一些工作原理，的确没有实际的意义。

user: user-2
content: 千万不要写这样的代码

user: user-3
content: 引用 8 楼 u012967319 的回复:7,6 8 以前看過這問題  printf("%d, [%d]\n", a++, [第一個處理a++]); 將A用%D輸出,所以最後一個D是6,然後再++,A是7  printf("[%d], %d\n", [這是第2個處理a++], a++);  將A用%D輸出,然後再++,A=8 别解释了，标准里明确说了是Undefined_behavior，不同的编译器下输出不同的，没有意义，看下置顶贴吧。

user: user-4
content: 7,6 8 以前看過這問題  printf("%d, [%d]\n", a++, [第一個處理a++]); 將A用%D輸出,所以最後一個D是6,然後再++,A是7  printf("[%d], %d\n", [這是第2個處理a++], a++);  將A用%D輸出,然後再++,A=8

user: user-5
content: 这些都是入门的，少发这种问题吧

user: user-6
content: 如果不会用debugger，就先不要问这样的问题，先去学debugger。

user: user-7
content: 7,6 8 printf()函数式从右向左输出的。 至于++应该好理解。

user: user-8
content: http://bbs.csdn.net/topics/370153775

user: user-9
content: 未定义行为，结果要看编译器的实现，参看置顶贴，不要写这种代码

user: user-10
content: 看置顶帖吧，无需过多纠结这个，也尽量不要写这样的代码

user: user-11
content: 输出的是:   7,6 8 因为对于printf(..)这样的可变参数的函数，调用约定应该是__cdecl,即函数的参数是从到右压入栈中，由调用者(Caller)释放栈。这里的关键是由调用者释放栈，原因是对于可变参数的函数，在函数内部是不知道参数的个数的，所以只有在函数调用的外部，即调用者来释放栈。  对于自增运算看左++还是右++就行了，右++就是先执行，后自增，左++相反。
user-0 提问: 越看越懵，麻烦帮一下我

回复:
user: user-1
content: 引用 14 楼 u010334406 的回复:[quote=引用 5 楼 ZXC5geren 的回复:] 二维数组 a[m][n] 共有m行 每行n列 &a[0][0] 数组起始地址。 &a[0][0] + n*2 第3行的首地址  = &a[2][0] &a[0][0] + n*2 + 2 第3行第3元素的地址 = &a[2][2] 明白了，是不是这样？比如说二维数组a[3][5]，&a[0][0] + n*2是二维数组的第11个元素，正好是&a[2][0] [/quote] 每一行都有n列，用数组地址每次加上一行的列数就是下一行的地址对应元素的位置。数组a[m][n]. &a[j][k] + n * l = &a[j+l][k] j<m,k<n

user: user-0
content: 引用 5 楼 ZXC5geren 的回复:二维数组 a[m][n] 共有m行 每行n列 &a[0][0] 数组起始地址。 &a[0][0] + n*2 第3行的首地址  = &a[2][0] &a[0][0] + n*2 + 2 第3行第3元素的地址 = &a[2][2] 明白了，是不是这样？比如说二维数组a[3][5]，&a[0][0] + n*2是二维数组的第11个元素，正好是&a[2][0]

user: user-2
content: 引用 11 楼 ForestDB 的回复:[quote=引用 9 楼 AnYidan 的回复:] 似乎认定数组元素是 char 别的类型也一样吧。[/quote]  一时糊涂

user: user-3
content: 可能是這樣看&a[0][0] + (n * 2) + 2

user: user-4
content: 引用 5 楼 ZXC5geren 的回复:二维数组 a[m][n] 共有m行 每行n列 &a[0][0] 数组起始地址。 &a[0][0] + n*2 第3行的首地址  = &a[2][0] &a[0][0] + n*2 + 2 第3行第3元素的地址 = &a[2][2]

user: user-5
content: 引用 9 楼 AnYidan 的回复:似乎认定数组元素是 char 别的类型也一样吧。

user: user-5
content: *可以是乘，也可以是解应用，按上下文很容易区分才对。

user: user-2
content: 似乎认定数组元素是 char

user: user-0
content: 引用 5 楼 ZXC5geren 的回复:二维数组 a[m][n] 共有m行 每行n列 &a[0][0] 数组起始地址。 &a[0][0] + n*2 第3行的首地址  = &a[2][0] &a[0][0] + n*2 + 2 第3行第3元素的地址 = &a[2][2] 我是新手，看错了，我把乘号理解成指针了。

user: user-6
content: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）

user: user-7
content: 引用 5 楼 ZXC5geren 的回复:二维数组 a[m][n] 共有m行 每行n列 &a[0][0] 数组起始地址。 &a[0][0] + n*2 第3行的首地址  = &a[2][0] &a[0][0] + n*2 + 2 第3行第3元素的地址 = &a[2][2]re

user: user-1
content: 二维数组 a[m][n] 共有m行 每行n列 &a[0][0] 数组起始地址。 &a[0][0] + n*2 第3行的首地址  = &a[2][0] &a[0][0] + n*2 + 2 第3行第3元素的地址 = &a[2][2]

user: user-0
content: 引用 2 楼 missheaven2011 的回复:&a[2][2], *表示相乘 如果是乘法，如果算出的结果是&a[2][2]

user: user-8
content: 先把运算符那部分学了吧

user: user-9
content: &a[2][2], *表示相乘

user: user-10
content: 指针的加法 把a[m][n]看成一维数组a[m * n], 然后把m*n看成m个n份
user-0 提问: win7为什么不执行啊

回复:
user: user-0
content: 就是ASLR，我忘记了，0x771ab277是函数的入口地址。

user: user-1
content: 1、x64 的 win7 不支持 16bit realmode的dos程序。 2、你call的那个0x772ab177是什么，在哪里？ 有考虑过ASLR吗？我不太清楚ASLR对你这个程序是否有影响，当作提供一个信息吧！  你这样的问题，最好把开发坏境也给大家看下。

user: user-2
content: 哥们，这个是C语言论坛，汇编的请到汇编论坛发帖子
user-0 提问: 关于指针的一个简单的问题

回复:
user: user-0
content: 我自己总结了一下，是不是可以这么认为，++*p++ 凡是间接操作符可以直接接触到指针p的，都要直接操作指针P，凡是间接操作符，不能直接接触到指针P的。多要操作在指针自增或自减后的指针

user: user-0
content: 哦，好像知道了，我理解的是错误的，*p++   后缀的++的优先级高于间接操作符。但是还是有一个地方不明白， p++先拷贝一份 p 的值，然后 在把P 的值 ++，最后在拷贝的那个值上求间接操作符。为什么不是在++后的值上求那个操作符呢？

user: user-1
content: 乱总结 在 c 中，“! ~ ++ -- + - * (type) sizeof” 的优先级相同，此时应以 Associativity 来判断谁先执行，一般 一元 operator 的 Associativity 是 right to left，  所以 ，*p++ = *(p++), 至于 p 的值何时 update, 请看 置顶 的帖子  另外，在 c 中根本就没有所谓的 前置++, 后前置--的区别，  lz 可参阅 The C programming Language 书中 2.12 节
user-0 提问: 分配内存

回复:
user: user-0
content: 那怎样判断是否分配了内存呢？

user: user-1
content: sizeof(str)求的是指针的大小

user: user-2
content: sizeof(char*)  就是计算一个字符指针的长度，和sizeof(int*)等等指针的值都是一样的。如果是sizeof(数组名)那么就是这个数组所占的字节空间(单个元素字节*元素个数)了

user: user-3
content: 那需要char str[8]这样声明。  引用 楼主 wasdfgh951 的回复:#include "stdio.h" #include "string.h" #include <MALLOC.H> int main() {  	char * str; 	str=(char*)malloc(8*sizeof(char)); 	int b; 	b=sizeof(str)/sizeof(char); 	printf("%d",b); 	strcpy(str,"hello"); 	printf("%s\n",str); 	return 0; }  为什么b=4? 不是等于8吗？ 求解。。。

user: user-4
content: sizeof(str)  求的是指针的大小。

user: user-5
content: str 是一个指针，32位系统，楼主大哥  sizeof（str) 的值是 4

user: user-6
content: sizeof求的是类型大小，不是分配的内存块大小。 内存分配的大小由系统来管理，需要了解系统的API。你要计算分配的内存大小，应该用_msize（windows下）、malloc_usable_size（linux）。这两个函数都在malloc.h下。 char* str = (char*)malloc(8*sizeof(char)); size_t i = _msize(str)/sizeof(char);

user: user-7
content: str 是指針變量  所以STR本身是4字節,這個明白嗎?  char * str; 即宣告了一個裝指針的變量 str 本身是4字節 而str未知,指針未初始化時不確定內容,但肯定是1字節,因為你用了CHAR聲明  而b=sizeof(str)/sizeof(char); 沒意思.將一個數除1,CHAR的類型就是1,大部系統來說  與數組分別在於char c[200]當printf c 時 會輸出數組總大小 而char *c 時 只會輸出C 本身的大小   #include "stdio.h" #include "stdlib.h" #include "string.h"  int main() { char * str; if(!(str=(char*)malloc(8*sizeof(char)))) { printf("內存分配失敗 \n"); } strcpy(str,"hello");  printf("%d \n",sizeof(str)); printf("%d \n",sizeof(*str)); printf("%s \n",str);  free(str); //養成這種習慣  system("pause"); return 0; }

user: user-8
content: 引用 楼主 wasdfgh951 的回复:#include "stdio.h" #include "string.h" #include <MALLOC.H> int main() {  	char * str; 	str=(char*)malloc(8*sizeof(char)); 	int b; 	b=sizeof(str)/sizeof(char); 	printf("%d",b); 	strcpy(str,"hello"); 	printf("%s\n",str); 	return 0; }  为什么b=4? 不是等于8吗？ 求解。。。  因为sizeof（str）指针str的大小。 为什么是4呢？--因为你的测试机是32位（4*8）的。 指针str是char *型的，它所指向的类型是char型的，它的值是malloc出的内存区首地址，它本身所占的内存区是一个32位的地址，所以，sizeof(str)就是32/8,也就是4了。

user: user-9
content: sizeof 常考的题 楼主太大意了 这算是基本问题了

user: user-10
content: 引用 5 楼 wasdfgh951 的回复:那怎样判断是否分配了内存呢？  char * str = NULL; str=(char*)malloc(8*sizeof(char)); if( NULL == str ) {     printf("malloc failed!\n"); //很少会出现这中情况，除非内存不足了！ }

user: user-11
content: 引用 5 楼 wasdfgh951 的回复:那怎样判断是否分配了内存呢？ 这个问题估计楼主没弄太清楚指针和sizeof的作用 首先sizeof的值是判断数据类型的到的    sizeof(str),这里的str本身是一个指针，str保存的是你分配的内存的地址而已，一个地址值实际上就是一个整型数值，也就是指针本身，不管str指向了一个多大的内存，他还是一个指针，就是固定的4个字节  如果想判断是否成功分配了内存，判断下malloc的返回值呗
user-0 提问: 单步调试问题

回复:
user: user-1
content: 引用 6 楼 u012889234 的回复:不是NULL ，，因为前面有(struct Family *) 在linux下用gdb调试 可以打印出来。不懂你这个！！！  。。。难道空指针加上类型强转就不是空指针了？

user: user-2
content: 这个具体看你的代码是怎么写的呢？

user: user-2
content: 不是NULL ，，因为前面有(struct Family *) 在linux下用gdb调试 可以打印出来。不懂你这个！！！

user: user-3
content: 看你代码预期她应该是什么值了？

user: user-4
content: 指针为NULL吧，应该不正常。

user: user-1
content: 引用 楼主 pokerLee 的回复:请问在单步调试中下面的情况算是调试出正常值么~~  我用的编译器是codeblocks~~求指点~~ 这是个空指针啊。

user: user-5
content: 引用 楼主 pokerLee 的回复:请问在单步调试中下面的情况算是调试出正常值么~~  我用的编译器是codeblocks~~求指点~~ 是否正常要看你struct Family *是否使用了 目测现实的是此时指针为NULL  要使用应先申请空间 <个人意见，出书扯淡>

user: user-6
content: 为什么不用VS，谁推荐的？ 个人觉得新手最好用VC++和VS之类的，这类比较简单，适于上手，找人帮忙也容易，其他用的不多的，遇到问题了都没人来帮你