Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 行指针   一维数组 

回复:
user: user-1
content: void output(int *p,int n) { 	for(int j = 0;j!=n;j++) 		printf("%d",*(p+j)); } void test() {  	int a[3][3]={{11,23,25},{2,31,52},{73,568,79}}; 	int (*p)[3]; 	int ida  = 0; 	for(int i=0;i<3;i++) 	{ 		p = &a[i]; //如何将行指针赋给一个该类型的一维指针呢 		output(*p,3);	//写法一  		//for(int j = 0;j!=3;j++)	//写法二 		//	ida = *(*p+j); 	} }

user: user-2
content: 修正：  int (*p)[3]; //这是一个指针变量，不是一个数组  “不能对p算术运算”这句话意思只针对此语句。离开这个上下文，就不再有意义！如果后文给p赋值了，那么可以对指针做算术加减！提醒这么一点！

user: user-2
content: #include <stdio.h>  void main() { 	int a[3][3]={{1,2,3},{4,5,6},{7,8,9}}; 	int (*p)[3]; //这是一个指针变量，不是一个数组，不能对p算术运算 	 	p = a + 2; //第3行 	printf("%d\n", (*p)[0]); //7 	p = a + 1; //第2行 	printf("%d\n", (*p)[2]);//6  }

user: user-1
content: 好像写混了。。。尼玛~敢不敢别指针都写成p！！！ void output(int *pout,int n) {     for(int j = 0;j!=n;j++)         printf("%d",*(pout+j)); } output里面*(pout+j)也就是对应的二维数组指针里的p[x][0],p[x][1],p[x][2]。 p[x]是你传进来的二维指针的第一个元素地址，上面说过了~

user: user-1
content: 引用 2 楼 u012804783 的回复:[quote=引用 1 楼 tpnndhqc 的回复:] 请问一下写法一中的参数传递仅仅是值传递吧？[/quote] 传递的是二维指针的首地址，也就是一个普通指针了，指向二维指针int (*p)[3]的第一个元素，也就是p[0][0]; 因为你用了p = &a[i];    所以这个传进去的p二维指针实际传进去的也就是 ： 第一次传入：{11,23,25},第二次传入：{2,31,52},第三次传入：{73,568,79} 后面output里面*(p+j)也就是对应的二维数组指针里的p[0],p[1],p[2]了。 试着编译运行跟踪看，会清楚很多。

user: user-0
content: 引用 1 楼 tpnndhqc 的回复: void output(int *p,int n) { 	for(int j = 0;j!=n;j++) 		printf("%d",*(p+j)); } void test() {  	int a[3][3]={{11,23,25},{2,31,52},{73,568,79}}; 	int (*p)[3]; 	int ida  = 0; 	for(int i=0;i<3;i++) 	{ 		p = &a[i]; //如何将行指针赋给一个该类型的一维指针呢 		output(*p,3);	//写法一  		//for(int j = 0;j!=3;j++)	//写法二 		//	ida = *(*p+j); 	} }  请问一下写法一中的参数传递仅仅是值传递吧？
user-0 提问: C语言数组问题

回复:
user: user-1
content: /*************************************************************************     > File Name: mygetchar.c     > Author: 傻李     > Mail: hellojukay@gmail.com      > Created Time: 2014年11月21日 星期五 21时54分52秒  ************************************************************************/ //#include<string.h> #include<stdio.h> int main() { 	char a[100]; 	int ch; 	int i=0; 	//memset(a,'\0',sizeof(a)); 	while((ch = getchar()) != '\n' && i <100) 	{ 		a[i++] = ch; 	} 	printf("%s\n",a); 	return 0; }

user: user-0
content: 那用scanf试试？还是其他什么的，就是我输入回车，就停止输入了，我想得到这个，然后呢用下面这个好像是行的 #include <stdio.h> #include <stdlib.h> //#include <ctype.h>  int main() {     char ch,word[100];     int i=0,n;     ch=getchar();     while(ch!='\n')     {         word[i++]=ch;         ch=getchar();     }     n=i-1;     for(i=0;i<=n;i++)         printf("%c",word[i]);     return 0; } 怎么回事呢

user: user-1
content: /* Copyright (C) 1993-2014 Free Software Foundation, Inc.    This file is part of the GNU C Library.     The GNU C Library is free software; you can redistribute it and/or    modify it under the terms of the GNU Lesser General Public    License as published by the Free Software Foundation; either    version 2.1 of the License, or (at your option) any later version.     The GNU C Library is distributed in the hope that it will be useful,    but WITHOUT ANY WARRANTY; without even the implied warranty of    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU    Lesser General Public License for more details.     You should have received a copy of the GNU Lesser General Public    License along with the GNU C Library; if not, see    <http://www.gnu.org/licenses/>.     As a special exception, if you link the code in this file with    files compiled with a GNU compiler to produce an executable,    that does not cause the resulting executable to be covered by    the GNU Lesser General Public License.  This exception does not    however invalidate any other reasons why the executable file    might be covered by the GNU Lesser General Public License.    This exception applies to code released by its copyright holders    in files containing the exception.  */  #include "libioP.h" #include "stdio.h"  #undef getchar  int getchar (void) {   int result;   _IO_acquire_lock (_IO_stdin);   result = _IO_getc_unlocked (_IO_stdin);   _IO_release_lock (_IO_stdin);   return result; }  #if defined weak_alias && !defined _IO_MTSAFE_IO #undef getchar_unlocked weak_alias (getchar, getchar_unlocked) #endif

user: user-1
content: １.getchar()返回值是int 2.数组容会越界，除非你数组足够的
user-0 提问: 求助 c的三角形

回复:
user: user-1
content: 引用 2 楼 zhouqinghe24 的回复:   #include <stdio.h>  int main (void) {     int i=0,j,k=1,l=0;     while(k<=15)     {         j=i+1;         l=0;         printf("%3d",k);         while(l+k+j+1<=15)         {             l+= ++j;             printf("%3d",l+k);         }        k+=++i;         printf("\n");     }     return 0; }    谢谢！ 能不能解释一下变量的含义，为什么那么写。

user: user-2
content: 引用 楼主 xiachulml 的回复:请用C语言编写一个程序实现 1 3 6 10 15 2 5 9  14 4 8 13 7 12 11 void main() { 	int i =1,a = 2, b= 0, n = 0;  	for (int j = 0;i+b<=15;j++) 	{ 		n = i; 		printf("%-3d",n); 		for (int k = 0;n+a+k<=15;k++) 		{	 			n =n+a+k;			 			printf("%-3d",n);			 		} 		printf("\n"); 		b++; 		i = i+b; 		a++; 	} }

user: user-3
content: printf中还是都改成%-3d吧 楼主注意好好看看代码的流程，不要只要答案而不认真看

user: user-4
content: 引用 2 楼 zhouqinghe24 的回复:   #include <stdio.h>  int main (void) {     int i=0,j,k=1,l=0;     while(k<=15)     {         j=i+1;         l=0;         printf("%3d",k);         while(l+k+j+1<=15)         {             l+= ++j;             printf("%3d",l+k);         }        k+=++i;         printf("\n");     }     return 0; }

user: user-5
content: #include <stdio.h>  int main (void) {     int i=0,j,k=1,l=0;     while(k<=15)     {         j=i+1;         l=0;         printf("%3d",k);         while(l+k+j+1<=15)         {             l+= ++j;             printf("%3d",l+k);         }        k+=++i;         printf("\n");     }     return 0; }

user: user-0
content: 求助呀大神们
user-0 提问: 程序在acm网站上出现Runtime Error，请求解决原因

回复:
user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。回答的好详细，学到了，太感谢了！

user: user-1
content: 试试static sHeapElement sPriorityQ[100001];

user: user-2
content: 在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。

user: user-3
content: 溢出，访问异常

user: user-4
content: 代码太长倒也懒得看了，觉得这代码一开始就申请这么大空间。要栈溢出的
user-0 提问: 求助

回复:
user: user-1
content: 这个就是自加和返回值两个动作，若++在前，则先进行+1，再返回值；++在后，则先返回值，后执行+1操作。我是这样理解的，你的理解跟我一样哈。

user: user-2
content: 建议不要写这种自己无法掌控的代码，不清楚计算机制的最好勤快些，分几步来以明确的意图实现

user: user-2
content: 前自增：++i 表示i已经被刷新为自增后的值，同时返回的是i的值； 后自增：i++ 返回i的值，"随后"i才自增。
user-0 提问: c语言二维数组地址问题，求大神帮忙解答！(*^__^*) 

回复:
user: user-1
content: 指针减指针，得到的是该类型指针的步长的倍数   比如     0x30 -0x10      如果是32位int 类型指针运算， 得到的就是有几个  sizeof(int)    的个数  8

user: user-2
content: 引用 6 楼 konglong0416 的回复:[quote=引用 3 楼 u013163178 的回复:] #include<stdio.h>  int main() {     int a[3][4] = {      {1,2,3,4},     {5,6,7,8},      {11,12,13,14}     };         printf("addr(a[1]-a[0]):%d\n", (int)a[1]-(int)a[0]);  //打印a[1]和a[2]地址之差     printf("addr(a[1]-a[0]):%d\n", a[1]-a[0]);//打印指针之差      return 0; }  好像有点明白，又不是特别明。。。 a[1]和a[0]不是第二维数组的首地址吗，既然地址，那两者相减的时候应该是地址相减呀 为什么必须强制转换为int类型，结果才正确。。。[/quote] a[0]是指针，不是地址，指针和地址是有很微妙的区别的

user: user-0
content: 引用 7 楼 starytx 的回复:[quote=引用 5 楼 konglong0416 的回复:] [quote=引用 2 楼 starytx 的回复:] 这样操作本来就是“个数”  呃，不明白。。能详细点说明吗。。[/quote]指针的相减有特殊的意义，不是简单的数值计算，就表示两个位置元素个数差（一般需要这样的机制，因为这样的需求比较多，没有人在意地址的实际差值，更多的是他们之间差几个元素，而且你不必根据地址的差值和每个元素的类型所占空间大小来自己计算个数）。如果将指针强制转化为数值（地址值）相减，那就是你预料的结果，地址的差值。[/quote]  3Q,明白啦^_^

user: user-3
content: 引用 5 楼 konglong0416 的回复:[quote=引用 2 楼 starytx 的回复:] 这样操作本来就是“个数”  呃，不明白。。能详细点说明吗。。[/quote]指针的相减有特殊的意义，不是简单的数值计算，就表示两个位置元素个数差（一般需要这样的机制，因为这样的需求比较多，没有人在意地址的实际差值，更多的是他们之间差几个元素，而且你不必根据地址的差值和每个元素的类型所占空间大小来自己计算个数）。如果将指针强制转化为数值（地址值）相减，那就是你预料的结果，地址的差值。

user: user-0
content: 引用 3 楼 u013163178 的回复:#include<stdio.h>  int main() {     int a[3][4] = {      {1,2,3,4},     {5,6,7,8},      {11,12,13,14}     };         printf("addr(a[1]-a[0]):%d\n", (int)a[1]-(int)a[0]);  //打印a[1]和a[2]地址之差     printf("addr(a[1]-a[0]):%d\n", a[1]-a[0]);//打印指针之差      return 0; }  好像有点明白，又不是特别明。。。 a[1]和a[0]不是第二维数组的首地址吗，既然地址，那两者相减的时候应该是地址相减呀 为什么必须强制转换为int类型，结果才正确。。。

user: user-0
content: 引用 2 楼 starytx 的回复:这样操作本来就是“个数”  呃，不明白。。能详细点说明吗。。

user: user-0
content: 引用 1 楼 user-4 的回复:a[1]=5,a[0]=1...a[1]-a[0]=4.这是正确的呀  a[1],a[0]只是第二维数据的首地址呀， a[1]不等于5，a[0]也不等于1，*a[1]才为5，*a[0]才为1, 就算我将a[1][0]改成6，a[1]-a[0]的结果还是4

user: user-2
content: #include<stdio.h>  int main() {     int a[3][4] = {      {1,2,3,4},     {5,6,7,8},      {11,12,13,14}     };         printf("addr(a[1]-a[0]):%d\n", (int)a[1]-(int)a[0]);  //打印a[1]和a[2]地址之差     printf("addr(a[1]-a[0]):%d\n", a[1]-a[0]);//打印指针之差      return 0; }

user: user-3
content: 这样操作本来就是“个数”

user: user-4
content: a[1]=5,a[0]=1...a[1]-a[0]=4.这是正确的呀
user-0 提问: c语言ini的使用

回复:
user: user-0
content: 有给代码的吗？

user: user-1
content: 这个就是文件操作。 用二进制将链表挨个写入文件。     改的话，直接将读写指针seek到要改的元素 将要修改的节点重新写入覆盖即可   其实都是对读写指针操作，然后读写文件

user: user-0
content: 是作业，但如果用其他的方法也可以，但我是个初学者，所以。。。。。。

user: user-2
content: 作业题吗？不是的话，建议使用csv文件格式
user-0 提问: 二叉树题目

回复:
user: user-1
content: 用递归, 伪码如下  int get_depth(int root, int depth) {     left = get_left(root);     left_depth = (left == '#') ? depth: get_depth(left, depth+1);     right= get_right(root);     right_depth = (right == '#') ? depth: get_depth(right, depth+1);     return max(left_depth, right_depth); }
user-0 提问: 看c和指针课后习题疑问

回复:
user: user-1
content: 引用 3 楼 u014041540 的回复:改过就OK了，谢谢。但是我想弄明白我的原程序是什么问题造成结果缺失呢？  while(str<last_char) { char temp; temp=*str; *str++=*last_char; //这里移动了str *last_char--=temp; } printf("%s",str); //这里输出 就不是你想要的结果了

user: user-0
content: scanf是手误，明白了。谢谢

user: user-1
content: void reverse_string(char* pStr) { 	if (pStr == NULL) 	{ 		return; 	} 	char* pTempStr = pStr;  	int nLen = 0;  	while (*pTempStr != '\0') 	{ 		pTempStr++;  		nLen++; 	} 	for (int i = 0;i < nLen/2;i++) 	{ 		char temp;  		temp = pStr[i];  		pStr[i] = *(pTempStr - i - 1);  		*(pTempStr - i - 1) = temp; 	} 	printf("%s\n",pStr);  	return; }

user: user-0
content: 改过就OK了，谢谢。但是我想弄明白我的原程序是什么问题造成结果缺失呢？

user: user-2
content: 代码写得不错，问题是reverse_string到了最后printf的时候，str已经被移到字符串中间去了，已经不是开始的str了。 还有 scanf("%s",&a); // 把&去掉

user: user-2
content: 把这一行删掉 printf("%s",str); 在main里面return之前 printf("%s",a);
user-0 提问: 菜鸟求助C语言

回复:
user: user-0
content: 输出结果是： x = 0, y = -1, z = 0, w = 0

user: user-1
content: 也就是 ++ x  =0                      ++ y  ++  z  都没有执行。

user: user-1
content: w= ++x&& ++y || ++z  && 运算符  左边已经为0时，再&& 任意值 还是为0  所以  语言在实现时，只要 && 左边为0 则后面的 都不再执行，直接返回表达式的值  0

user: user-2
content: 引用 5 楼 SuperRancho 的回复:[quote=引用 4 楼 baijiaheizhiganmao 的回复:] ++Z执行了一次。 相当于w = (++x && ++y) || ++z. &&求解了括号左边的，括号右边的没有求解。||接着执行右边的。  理解了，计算机也会偷懒。&&运算，左边为0，就不计算右边了。[/quote] 计算机不会偷懒，这是C语言的规则。也有为了提高响应速度的考虑。

user: user-0
content: 引用 4 楼 baijiaheizhiganmao 的回复:++Z执行了一次。 相当于w = (++x && ++y) || ++z. &&求解了括号左边的，括号右边的没有求解。||接着执行右边的。  理解了，计算机也会偷懒。&&运算，左边为0，就不计算右边了。

user: user-2
content: 引用 2 楼 zhouqinghe24 的回复:也就是 ++ x  =0                      ++ y  ++  z  都没有执行。 ++Z执行了一次。 相当于w = (++x && ++y) || ++z. &&求解了括号左边的，括号右边的没有求解。||接着执行右边的。
user-0 提问: 关于C语言中指针数组的问题.

回复:
user: user-1
content: 不要想的那么复杂，就跟平常的.和->一样的……只不过外面包装了一个数组而已， 你可以这样理解 book* tmpa = a[g]; 	(*tmpa).title;	// (*a)[g].title; 	tmpa->title;	//a[g]->title;
user-0 提问: c语言处理http报文中中文字符编码\uXXXX无法正常打印

回复:
user: user-1
content: 仅供参考//将文件1中所有'\uAABB'替换为'\xBB'+'\xAA','C'替换为'C\x00',且文件头加'\xFF\xFE',结果保存到文件2中。 #include <stdio.h> FILE *f1,*f2; int c,s,n,i; char fuAABB[7]; int AA,BB; void main(int argc,char **argv) {     if (argc<3) {         printf("%s 文件1 文件2\n将文件1中所有\"\\uAABB\"替换为\"\\xBB\\xAA\",\'C\'替换为\"C\\x00\",且文件头加\"\\xFF\\xFE\",结果保存到文件2中。\n",argv[0]);         return;     }     f1=fopen(argv[1],"rb");     if (NULL==f1) {         printf("找不到文件[%s]!\n",argv[1]);         return;     }     f2=fopen(argv[2],"wb");     if (NULL==f2) {         fclose(f1);         printf("创建文件[%s]出错!\n",argv[2]);         return;     }     fuAABB[6]=0;     fputc(0xFF,f2);fputc(0xFE,f2);     s=0;     while (1) {         c=fgetc(f1);         if (EOF==c) {             for (i=0;i<s;i++) {fputc(fuAABB[i],f2);fputc(0,f2);}             break;//         }         switch (s) {         case 0:             if ('\\'==c) {                 n=0;                 fuAABB[n++]=c;                 s=1;             } else {                 fputc(c,f2);fputc(0,f2);             }         break;         case 1:             if ('u'==c) {                 fuAABB[n++]=c;                 s=2;             } else {                 for (i=0;i<n;i++) {fputc(fuAABB[i],f2);fputc(0,f2);}                 fputc(c,f2);fputc(0,f2);                 s=0;             }         break;         case 2:             if (('0'<=c&&c<='9')||('A'<=c&&c<='F')||('a'<=c&&c<='f')) {                 fuAABB[n++]=c;                 s=3;             } else {                 for (i=0;i<n;i++) {fputc(fuAABB[i],f2);fputc(0,f2);}                 fputc(c,f2);fputc(0,f2);                 s=0;             }         break;         case 3:             if (('0'<=c&&c<='9')||('A'<=c&&c<='F')||('a'<=c&&c<='f')) {                 fuAABB[n++]=c;                 s=4;             } else {                 for (i=0;i<n;i++) {fputc(fuAABB[i],f2);fputc(0,f2);}                 fputc(c,f2);fputc(0,f2);                 s=0;             }         break;         case 4:             if (('0'<=c&&c<='9')||('A'<=c&&c<='F')||('a'<=c&&c<='f')) {                 fuAABB[n++]=c;                 s=5;             } else {                 for (i=0;i<n;i++) {fputc(fuAABB[i],f2);fputc(0,f2);}                 fputc(c,f2);fputc(0,f2);                 s=0;             }         break;         case 5:             if (('0'<=c&&c<='9')||('A'<=c&&c<='F')||('a'<=c&&c<='f')) {                 fuAABB[n++]=c;                 sscanf(fuAABB+2,"%02x%02x",&AA,&BB);                 fputc(BB,f2);fputc(AA,f2);                 s=0;             } else {                 for (i=0;i<n;i++) {fputc(fuAABB[i],f2);fputc(0,f2);}                 fputc(c,f2);fputc(0,f2);                 s=0;             }         break;         }     }     fclose(f2);     fclose(f1);     printf("%s %s %s OK.\n",argv[0],argv[1],argv[2]); }

user: user-2
content: http://bbs.csdn.net/topics/370131690

user: user-3
content: 仿造printf，重新写个打印函数即可。这个函数很简单的  只不过printf格式串是用%来转义,你改用\作转义符
user-0 提问: CCS3.3 ，DSP28335无法Load Program

回复:
user: user-1
content: Trouble Writing Memory Block at 0x9000 on Page 0 of Length 0x1480: Cannot access memory address0xA000    上面的提示很明显了: 0xA000 不能访问, 我猜要访问地址 0x9000+0x1480 = 0xa480,由于0xa000之后不能访问,所以访问0xa480出错.  确认一下你的硬件地址的起始地址,以及你代码的长度.然后再做修改.
user-0 提问: 编程计算九宫格解锁个数

回复:
user: user-1
content: 题目能不能描述清楚一点，如果说数字不能跳跃那不就是只有连续数字的几种组合而已了么

user: user-0
content: 能否说的详细点呢

user: user-2
content: 搜索树...

user: user-3
content: 二位数组 计算
user-0 提问: 想在音频WAV文件播放时能显示字幕，主要是显示一些状态参数，请问如何处理？不用专业软件，最好编码实现

回复:
user: user-0
content: 显示的状态参数其实不是音频文件本身的，是一些外部的，比如采集时间，采集地点之类的，是后期添加的，由于wav文件好像不能标记标签属性，有没有解决的思路？

user: user-1
content: 这个好办，wav无压缩格式，网上有它头文件格式结构（自行搜索），读取文件的头格式，把其中的信息输出就是你想要的。
user-0 提问: C语言，初学函数，大神帮忙看看哪里错了

回复:
user: user-1
content: 哥们，这不关函数的事情，先弄清楚全局变量跟局部变量的作用域！

user: user-2
content: p1、k都是局部变量，在main函数中，那就不会再fee函数中，你调用fee函数，把sum的值传了进去，但sum根本没有初值，楼主需要好好看书啊 楼主可以看看这个，简单的函数方面的知识——http://blog.csdn.net/u012421456/article/details/19006893 http://blog.csdn.net/u012421456/article/details/19074525

user: user-3
content: #include <stdio.h> double fee(double pl, double k) {      if (pl == -1) { 	if (k <= 2) 	    return 6; 	else if (k > 2 && k <= 7) 	    return 6 + (k - 2) * 1.6; 	else if (k > 7) 	    return 5 * 1.6 + (k - 7) * 1.8 + 6;     }     if (pl == -2) {  	if (k <= 2) 	    return 6; 	else if (k > 2 && k <= 7) 	    return 6 + (k - 2) * 1.8; 	else if (k > 7) 	    return 5 * 1.8 + (k - 7) * 2.0 + 6;     } }  int main(void) {     int T, i;     double pl, k, sum;     scanf("%d", &T);     for (i = 1; i <= T; i++) { 	scanf("%lf %lf", &pl, &k); 	printf("Case %d:%f\n", i, fee(pl, k));     }     return 0; }

user: user-4
content: pl,k完全没有传递到函数里面去。。。讲清楚确实很麻烦，初学者，还是看看谭浩强的C程序设计吧。。。。。

user: user-5
content: 朋友，虽然我很能理解你想要在fee这个函数中进行各种判断，计算，并能够改变pl，k，sum的值，但是你的fee函数的写法，实际上会完全没有用到pl，k的值，但要是直接讲给你也挺麻烦的，你从简单的函数开始练练吧~

user: user-6
content: 引用 1 楼 u010030181 的回复:不是这样使用参赛的，你在翻书看看如何传参及局部变量的使用……参数

user: user-6
content: 不是这样使用参赛的，你在翻书看看如何传参及局部变量的使用……
user-0 提问: 求助 用vs2013写括号的匹配检查时候出的问题

回复:
user: user-1
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。  仅供参考#include<stdio.h> #include<malloc.h> #include<string.h> #define STACK_INIT_SIZE 10 #define STACK_GROW_SIZE 5 #define ELEMTYPE char #define OK 1 #define ERROR 0 typedef struct { /*建立一个栈的首结点*/     ELEMTYPE * base;     ELEMTYPE * top;     int stacksize; } SpStack; int InitStack(SpStack *s) { /*建立空的栈并返回首地址*/     s->base=((ELEMTYPE*)malloc(STACK_INIT_SIZE*sizeof(ELEMTYPE)));     if (!s->base) return ERROR;     s->top=s->base;     s->stacksize=STACK_INIT_SIZE;     return OK; } int StackEmpty(SpStack *s) { /*判断栈是否为空*/     if (s->top==s->base) return OK;     else                 return ERROR; } int Push(SpStack *s,ELEMTYPE e) { /*往栈顶插入元素即进栈*/     if (s->top-s->base>=s->stacksize) { /*判断是否栈满*/         s->base=((ELEMTYPE*)realloc(s->base,(s->stacksize+STACK_GROW_SIZE)*sizeof(ELEMTYPE)));         if (!s->base) return ERROR;         s->stacksize+=STACK_GROW_SIZE;         s->top=s->base+s->stacksize;     }     *s->top++=e;     return OK; } int Pop(SpStack *s,ELEMTYPE *e) { /*让栈顶元素依次输出即出栈*/     if (StackEmpty(s)) return ERROR;     *e=*(--s->top);     return OK; } int Comp(ELEMTYPE a,ELEMTYPE b) {     if ((a=='('&&b!=')')       ||(a=='['&&b!=']')       ||(a=='{'&&b!='}')) {         return ERROR;     } else return OK; } int Count(SpStack *s) {     ELEMTYPE e[STACK_INIT_SIZE*2];     ELEMTYPE e1;     int i;      InitStack(s);     fgets(e,STACK_INIT_SIZE*2,stdin);     if ('\n'==e[strlen(e)-1]) e[strlen(e)-1]=0;     printf("%s\n",e);     for (i=0;e[i]!='\0';i++) {         switch (e[i]) {         case '(':         case '[':         case '{':             Push(s,e[i]);             break;         case ')':         case ']':         case '}':             if (StackEmpty(s)) {                 printf("%*s↖右括号多余\n",i+1,"");                 return(ERROR);             } else Pop(s,&e1);             if (!Comp(e1,e[i])) {                 printf("%*s↖左右匹配出错\n",i+1,"");                 return(ERROR);             }         }     }     if (!StackEmpty(s)) {         printf("%*s↖左括号多余\n",i,"");         return(ERROR);     } else {         printf("匹配正确\n");         return(OK);     } } void main() {     SpStack s;     Count(&s);     free(s.base); }
user-0 提问: 关于网络流量监控软件

回复:
user: user-1
content: 学习使用winpcap

user: user-0
content: 主要是对本级发出去和接收回来的数据包进行分析，类似于一个抓包软件一样

user: user-2
content: 如果某类应用的流量 ，这个要看这个软件的端口啥的，要过滤统计

user: user-2
content: 你是监控网卡上的所有流量，还是某类应用的软件应用。
user-0 提问: Linux c语言 epoll怎么监听一个队列？ 或一块内存？

回复:
user: user-0
content: eventfd 有用过的没，   用他实现异步队列， 会有一个文件描述符，   可不可以加入 epoll,  我看到的这个代码是用select做的  不是特别好，  在这：  http://www.tuicool.com/articles/NJjmaq， 我不是特别了解select，  不知道用epoll可以不 ，

user: user-1
content: 你肯定理解错了，epoll只能监听描述符吧，可读、可写这些事件能够触发epoll_wait返回。

user: user-2
content: epoll 主要作用是用作网络链接的高并发。    尤其是对于 链接数很多，活跃数很少的情况下。
user-0 提问: linux下c fork出来的子进程中 execlp调用gcc编译问题

回复:
user: user-0
content: 引用 1 楼 user-1 的回复:你是用了管道来通信吗？ 重定向子进程的标准输出，父进程读对应的管道恩，已经解决了，谢谢了

user: user-1
content: 你是用了管道来通信吗？ 重定向子进程的标准输出，父进程读对应的管道
user-0 提问: C语言printf的问题

回复:
user: user-0
content: 真的是使用的VC6.  那我应该用什么编译器好点。还有问题懂了，谢谢大家。

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

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

user: user-3
content: *  3.863e+03*是符合ANSI C标准的输出。你使用的编译器不符合标准(不会是臭名昭著的VC6吧?) 按照标准定义 %10.3e 10表示整个输出有10个字符，不足10个时前面用空格补齐补齐(7.19.6.1.4 If the converted value has fewer characters than the field width, it is padded with spaces (by default) on the left) 3表示小数点后面有3位(7.19.6.1.4 An optional precision that gives the minimum number of digits to appear) e的指数部分一般是2位，只有指数值大于99时才会占3位(7.19.6.1.8 The exponent always contains at least two digits, and only as many more digits as necessary to represent the exponent.)  你用的编译器在指数值等于3时占了3位与标准不一致。

user: user-4
content: e+03是数字的科学计数法10^3=1000

user: user-5
content: 书上说的也没错，Linux下输出确实是 * 3.853e+03*

user: user-6
content: http://bbs.csdn.net/topics/380151308 上面是类似问题，没必要纠结这个

user: user-7
content: 首先，不要太迷信书，古时候不是“有尽信书不如无书”吗？ 其次，不同的编译器，不同的系统，c语音输出结果可能会不同的。 最后，楼主通过自己的实际运行结果和书上的比对，可以得出疑惑，从而寻找问题的答案，这个得向楼主学习。

user: user-8
content: 书上错了。什么书？
user-0 提问: 初学者的编程问题求助~~~

回复:
user: user-0
content: 引用 11 楼 hitxingkong 的回复:引用 6 楼 zhao4zhong1 的回复:在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。全局数据段的大小是多大呢？ 一共有100000个数据的说。是不是因为数据太大的原因QAQ，我参考了大家的意见改了还是不行

user: user-1
content: 引用 6 楼 zhao4zhong1 的回复:在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。全局数据段的大小是多大呢？

user: user-2
content: 引用 11 楼 hitxingkong 的回复:引用 6 楼 zhao4zhong1 的回复:在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。全局数据段的大小是多大呢？ 自己定义越来越大的char数组试验看结果。  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？

user: user-2
content: 引用 9 楼 u013163178 的回复:[quote=引用 8 楼 zhao4zhong1 的回复:] 纠正7楼： static long double num[100001];赵老师咋自己夸自己[/quote] 这是纠正拼写错误，不是自顶。

user: user-2
content: 纠正7楼： static long double num[100001];

user: user-2
content: staitc long double num[100001];

user: user-2
content: 在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。

user: user-3
content: 1‘调试 2、num[100001]静态数组空间太大，考虑用malloc动态分配

user: user-4
content: fp和fp2为什么会重复打开?

user: user-5
content: #include<stdio.h> #include<stdlib.h> #include<conio.h> int main(void) { 	long double num; 	FILE *fp,*fp2; 	fp=fopen("C:/datah.txt","r"); 	if (fp==NULL) 	{ 		printf("cannot open fp!\n"); 		exit(1); 	} 	fp2=fopen("C:/outputh.txt","w"); 	if (fp2==NULL) 	{ 		printf("cannot open fp2!\n"); 		exit(1); 	} 	while( (fscanf(fp,"%.16lf",&num)) == 1 ) 	{ 		if(num<=0.2019607843137) 			fprintf(fp2,"0\n"); 		else  			fprintf(fp2,"1\n"); 	} 	 	fclose (fp); 	fclose (fp2); 	_getch(); 	return 0; } 刚发完才发现还可以做个优化，不能编辑自己的发贴，只好重发一次了。

user: user-5
content: #include<stdio.h> #include<stdlib.h> #include<conio.h> int main(void) { 	long double num[100001]; 	int i=0; 	FILE *fp,*fp2; 	fp=fopen("C:/datah.txt","r"); 	if (fp==NULL) 	{ 		printf("cannot open fp!\n"); 		exit(1); 	} 	fp2=fopen("C:/outputh.txt","w"); 	if (fp2==NULL) 	{ 		printf("cannot open fp2!\n"); 		exit(1); 	} 	for(i=0;i<100001;i++) 	{ 		fscanf(fp,"%.16lf",&num[i]);     } 	for(i=0;i<=99999;i++) 	{ 		if(num[i]<=0.2019607843137) 			fprintf(fp2,"0\n"); 		else  			fprintf(fp2,"1\n");     } 	 	fclose (fp); 	fclose (fp2); 	_getch(); 	return 0; }

user: user-6
content: fp=fopen("C:/datah.txt","r"); fp2=fopen("C:/outputh.txt","w"); fscanf(fp,"%.16lf",&num); 向#2楼一样检查你的fp是否正确指向了打开的文件，否则调用fscanf就会触发assert。

user: user-7
content: 引用 8 楼 zhao4zhong1 的回复:纠正7楼： static long double num[100001];赵老师咋自己夸自己
user-0 提问: 解决这个OJ上的题目我哪里有问题

回复:
user: user-0
content: #include <stdio.h>  #include <stdlib.h>  #include <string.h>  #include <math.h>  int main()  {  int i,j,n;scanf("%d",&n);      char t[80];char(*a)[80]=malloc(n*sizeof(80)),(*b)[80]=malloc(n*sizeof(80));      int len[n+1],sum[n+1];      memset(sum,0,sizeof(sum));      for(i=1;i<=n;i++)      { gets(a[i]);      len[i]=strlen(a[i]);          strcpy(b[i],a[i]);      }      for(i=1;i<=n;i++)      for(j=0;j<=79;j++)      {a[i][j]=-a[i][j]+91;      sum[i]+=a[i][j]*pow(26,len[i]-j-1);      }            for(i=1;i<=n-1;i++)  for(j=1;j<=n-i;j++)  if(sum[j]>sum[j+1])              {strcpy(t,b[j+1]);strcpy(b[j+1],b[j]);strcpy(b[j],t);}  for(i=1;i<=n;i++)  puts(b[i]);  free(a);free(b);  system("pause");  return 0;  }

user: user-0
content: 题目是这个：  小乐同学学会了用程序做进制转换，异常高兴。小鹏为了不让他骄傲自满，决定出道难点的题目考考他。字母集A到Z，依次表示26到1，26个数字。也就是A=26，B=25...Z=1。他用这些字符来构建了一个26进制的计数方式。比如（ZZ）26进制=（27）10进制。   输入   第一行数字N，表示接下来会有N行输入数据。（N<1000）  接下来的N行，每行一个长度不超过100的字符串。   输出   输出排序(从小到大)之后的字符串，一行一个。   样例输入 2 CA BA  样例输出 CA BA    PS:不知道哪里又问题,应该怎么改..麻烦各位找出一下错误,谢谢了
user-0 提问: 读取单色bmp的问题

回复:
user: user-0
content: 引用 6 楼 zhao4zhong1 的回复:关键是楼主不知道bmp文件的每行数据所占字节数必须是4的倍数。我猜。 赵4老师： 那个bmp宽度按4B对齐的问题，按4B对齐不是模4吗？怎么不同的位数，模的数也不一样？我只能模糊的知道原因，老师能不能稍微说一下？下面是改过的 if (bmpInfoHead.biBitCount < 24) 			width = (width % (32 / bmpInfoHead.biBitCount) == 0) ? width : (width / (32 / bmpInfoHead.biBitCount) + 1) * (32 / bmpInfoHead.biBitCount);//宽度调整为4B 32的倍数 		else 			width = (width % 4 == 0) ? width : (width / 4 + 1) * 4;

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

user: user-0
content: 引用 6 楼 zhao4zhong1 的回复:关键是楼主不知道bmp文件的每行数据所占字节数必须是4的倍数。我猜。 对了，是4字节，我一直是按4取，long类型的宽度代表像素的位数，我一直是/4了，应该/32的

user: user-1
content: 引用 8 楼 fztfztfzt 的回复:[quote=引用 6 楼 zhao4zhong1 的回复:] 关键是楼主不知道bmp文件的每行数据所占字节数必须是4的倍数。我猜。 另外读取4位，8位，24位的bmp都没问题，只有1位会出问题[/quote] “像素宽度”和“每行像素数据所占字节数”不是一回事！

user: user-0
content: 引用 6 楼 zhao4zhong1 的回复:关键是楼主不知道bmp文件的每行数据所占字节数必须是4的倍数。我猜。 另外读取4位，8位，24位的bmp都没问题，只有1位会出问题

user: user-0
content: 引用 6 楼 zhao4zhong1 的回复:关键是楼主不知道bmp文件的每行数据所占字节数必须是4的倍数。我猜。 我在4L已经说了。。。

user: user-1
content: 关键是楼主不知道bmp文件的每行数据所占字节数必须是4的倍数。我猜。

user: user-0
content: 我开始也认为是宽度问题，可现在发现，宽度为288的都可以正确读取，但宽度为272的却无法成功读取

user: user-0
content: 引用 1 楼 user-3 的回复:1. SetPixel那一行要不要考虑换行的情况？我不懂bmp格式，它会不会在同一个字节里保存不同行的像素？ 比如，如果是一个7*7的bmp，那么第一个字节的8位里面有7位是第一行的，剩下1位是不是下一行的？ 2. 我没看懂为什么要i--，可能和其余的代码相关吧。 3. 这一行没必要  else c = 0; c的取值只有0x80和0两个可能。不过这个不会造成错误，就是浪费一点时间而已。 bmp的宽度在读取后要把调整为4的倍数，7*7读取后会按7*8处理。i--是因为setPixel里i++了8次，而我外面还有个for循环，里面有个i++，多加了一次

user: user-0
content: 引用 2 楼 turingo 的回复:应该是坐标的计算问题，SetPixel(hdc, x + i++, y + height - j, c); 中都没有出现过k，这很不合理。 k其实在i++里了。

user: user-2
content: 应该是坐标的计算问题，SetPixel(hdc, x + i++, y + height - j, c); 中都没有出现过k，这很不合理。

user: user-1
content: //先根据每个像素多少位，算出一行像素需要多少个字节， int bitWidth=width*bmpInfoHead.biBitCount; int bytesPerLine=(bitWidth-1)/8+1;  //再将这个字节数向上补为4的倍数。 int bytesPerLine4=((bytesPerLine-1)/4+1)*4;

user: user-3
content: 1. SetPixel那一行要不要考虑换行的情况？我不懂bmp格式，它会不会在同一个字节里保存不同行的像素？ 比如，如果是一个7*7的bmp，那么第一个字节的8位里面有7位是第一行的，剩下1位是不是下一行的？ 2. 我没看懂为什么要i--，可能和其余的代码相关吧。 3. 这一行没必要  else c = 0; c的取值只有0x80和0两个可能。不过这个不会造成错误，就是浪费一点时间而已。
user-0 提问: 关于等长字符串比较的问题

回复:
user: user-1
content: 引用 4 楼 starytx 的回复:关键在于“相似度”的定义问题。这样理解相似度对不对：长度相等的情况下，字符相同的的位置个数/字符总个数 ？ 就是就是，怎么定义是个很重要的问题 ABCDEFGHIJKLMN NABCDEFGHIJKLM 这算相似吗？

user: user-2
content: 关键在于“相似度”的定义问题。这样理解相似度对不对：长度相等的情况下，字符相同的的位置个数/字符总个数 ？

user: user-3
content: 相似度比较 是最长子串，还是 包含单个字符就可以，这些都是问题！

user: user-4
content: 逐字符比较，并统计相同字符占比。

user: user-5
content: 没看懂，难道是我智商有问题？
user-0 提问: 初学者气泡法遇问题，求大神指导一下！

回复:
user: user-1
content: 这个不是冒泡排序吧 引用 4 楼 zhao4zhong1 的回复:#include <stdio.h> #include <locale.h> int main() {     int t,i,j,a[15];      setlocale(LC_ALL,"chs");     while (1) {         printf("\n请输入十五个整数，用空格间隔:");         fflush(stdout);         rewind(stdin);         for (i=0;i<15;i++) {             if (1!=scanf("%d",&a[i])) break;         }         if (i>=15) break;     }     for (i=0;i<14;i++) {         for (j=i+1;j<15;j++) {             if (a[i]>a[j]) {t=a[i];a[i]=a[j];a[j]=t;}         }     }     printf("从小到大的顺序为:");     for (i=0;i<15;i++) {         if (i<14) printf("%d," ,a[i]);         else      printf("%d\n",a[i]);     }     return 0; }

user: user-2
content: #include <stdio.h> #include <locale.h> int main() {     int t,i,j,a[15];      setlocale(LC_ALL,"chs");     while (1) {         printf("\n请输入十五个整数，用空格间隔:");         fflush(stdout);         rewind(stdin);         for (i=0;i<15;i++) {             if (1!=scanf("%d",&a[i])) break;         }         if (i>=15) break;     }     for (i=0;i<14;i++) {         for (j=i+1;j<15;j++) {             if (a[i]>a[j]) {t=a[i];a[i]=a[j];a[j]=t;}         }     }     printf("从小到大的顺序为:");     for (i=0;i<15;i++) {         if (i<14) printf("%d," ,a[i]);         else      printf("%d\n",a[i]);     }     return 0; }

user: user-3
content: i=i+1多余

user: user-4
content: 给你改了一下，你冒泡冒错了。 你的内层循环（j作为循环变量的循环）是把大的数据冒泡到数组的尾部，那么数组的尾部一次被放上最大的、次大的等数据，那么i就应该从尾部向头部变化。 下面代码是对的，当然还有很多等价的做法。 #include<stdio.h> int main() { int t,i,j,a[15]; printf("请输入十五个整数:\n"); scanf("%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d",&a[0],&a[1],&a[2],&a[3],&a[4],&a[5],&a[6],&a[7],&a[8],&a[9],&a[10],&a[11],&a[12],&a[13],&a[14]);    //这部就是输入15个数（我只会这么写。。。） for(i=14;i>=0;i--) { for(j=0;j<i;j++)    //就是让a[0]和a[1]比，然后a[1]和a[2]比，谁大谁就换后面去 { if(a[j]>a[j + 1]) { t=a[j]; a[j]=a[j+1]; a[j+1]=t;   //这步是交换啦！~~~ } } } printf("从小到大的顺序为:%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\n",a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],a[10],a[11],a[12],a[13],a[14]);   //这部其实就是输出结果，我不会高端的>写法。。~~ return 0; }

user: user-5
content: for里面已经有i++了……既然是练习，你一口气输入15个不累啊？？？

user: user-6
content: i = i+ 1  这步多余了。
user-0 提问: c#贪婪法找零钱

回复:
user: user-0
content: 如何写zhaoling的函数？

user: user-1
content: zhaoling这个函数是你写的么?你这个函数就没实现

user: user-2
content: 请问楼主你的这个函数在哪里

user: user-3
content: 写一个zhaoling的函数
user-0 提问: %d到底在输出些什么

回复:
user: user-0
content: 引用 2 楼 duke56 的回复:1819044162  --->6C 6C 69 42  6C-->l ... 42-->B  倒过来  谢谢你

user: user-1
content: %d  表示要从你给的地址 取 4 个字节出来 当做整型输出 %c 。。。。 只取一字节

user: user-2
content: 引用 3 楼 duke56 的回复:char一般编译器是1字节,而int是4字节 你强制把char开头的数据拿过来,因为要补齐4字节,就会往后取了!!  还有一点关于数据在内存的排序!!!!  连接供参考一下 http://blog.csdn.net/duke56/article/details/5812726  ARM框架的处理器则这x86的相反...就是(正序)

user: user-2
content: char一般编译器是1字节,而int是4字节 你强制把char开头的数据拿过来,因为要补齐4字节,就会往后取了!!  还有一点关于数据在内存的排序!!!!

user: user-2
content: 1819044162  --->6C 6C 69 42  6C-->l ... 42-->B  倒过来

user: user-3
content: 要输出首字母，当然应该使用  %c,表示单个字符。。。。%d跟你输出的类型  **pptr  不匹配
user-0 提问: 关于数组和指针的几个小问题，请教下

回复:
user: user-1
content: 变长数组是语法糖。 语法糖越甜，编译调试查错越苦！ 把有限的生命浪费在品尝/品鉴无穷多种的语法糖中，我认为不值当。  老老实实使用malloc,realloc,free不够吗？

user: user-2
content: 我看了下你两个问题，简单回答一下： 1、第一个我觉得两个都不行，数组在编译的时候就要确定长度，但是这个好像确实和编译器有关；不建议像你这样定义数组，如果你想随时改变数组长度，建议#define sizeint 5这种写法，在编译的时候就确定数组的长度。不过好像有的编译器可以支持变长数组。建议还是不要这么用。 2、定义指针的时候，不能直接赋值。举个简单的例子。int *p=5;这种赋值是不行的。不能直接将数赋值给指针。同理，你那种声明指针的时候就赋值，当然是不行的。

user: user-3
content: 1.数组长度在程序编译时，必须确定！这明显跟编译器有关； 2.指针数组：int *intpp_2[ ]={{0},{0}};

user: user-4
content: 第一种情况：const unsigned int sizeint_2 = length_2 ; 错误             因为const类型的变量，不允许改变。 第二种情况：引用int ** intpp_2 =             {                         {0},                         {0}             } ;                        指针需要申请空间才能够初始化或赋值

user: user-5
content: 运用变量来构造数组得看编译器的,看支持C99的程度有多少了   问题1的代码OK,要不参考一下这里: http://blog.csdn.net/duke56/article/details/5825065

user: user-6
content: gcc 两种都没通过。 g++ 第一种能通过，第二种不能

user: user-0
content: 引用 1 楼 u010030181 的回复:第一个情况下，你确定你的第一个能通过?反正我的是两个都编译不过，不过这个跟编译器有关系！ 第二个问题，你使用指针没有开辟空间，怎么能对呢？  1、我用的是mac，编译器是 LLVM5.0 ；  2、那么，int ** p ，我要分配一个[3][5]大小的内存空间，用malloc该怎么写呢？请教下，谢谢

user: user-7
content: 第一个情况下，你确定你的第一个能通过?反正我的是两个都编译不过，不过这个跟编译器有关系！ 第二个问题，你使用指针没有开辟空间，怎么能对呢？
user-0 提问: 大家调试的时候都怎么打log的?

回复:
user: user-1
content: #include <stdio.h> #include <stdlib.h> #include <string.h> #ifdef WIN32     #include <windows.h>     #include <io.h> #else     #include <unistd.h>     #include <sys/time.h>     #include <pthread.h>     #define  CRITICAL_SECTION   pthread_mutex_t     #define  _vsnprintf         vsnprintf #endif //Log{ #define MAXLOGSIZE 20000000 #define MAXLINSIZE 16000 #include <time.h> #include <sys/timeb.h> #include <stdarg.h> char logfilename1[]="MyLog1.log"; char logfilename2[]="MyLog2.log"; static char logstr[MAXLINSIZE+1]; char datestr[16]; char timestr[16]; char mss[4]; CRITICAL_SECTION cs_log; FILE *flog; #ifdef WIN32 void Lock(CRITICAL_SECTION *l) {     EnterCriticalSection(l); } void Unlock(CRITICAL_SECTION *l) {     LeaveCriticalSection(l); } #else void Lock(CRITICAL_SECTION *l) {     pthread_mutex_lock(l); } void Unlock(CRITICAL_SECTION *l) {     pthread_mutex_unlock(l); } #endif void LogV(const char *pszFmt,va_list argp) {     struct tm *now;     struct timeb tb;      if (NULL==pszFmt||0==pszFmt[0]) return;     _vsnprintf(logstr,MAXLINSIZE,pszFmt,argp);     ftime(&tb);     now=localtime(&tb.time);     sprintf(datestr,"%04d-%02d-%02d",now->tm_year+1900,now->tm_mon+1,now->tm_mday);     sprintf(timestr,"%02d:%02d:%02d",now->tm_hour     ,now->tm_min  ,now->tm_sec );     sprintf(mss,"%03d",tb.millitm);     printf("%s %s.%s %s",datestr,timestr,mss,logstr);     flog=fopen(logfilename1,"a");     if (NULL!=flog) {         fprintf(flog,"%s %s.%s %s",datestr,timestr,mss,logstr);         if (ftell(flog)>MAXLOGSIZE) {             fclose(flog);             if (rename(logfilename1,logfilename2)) {                 remove(logfilename2);                 rename(logfilename1,logfilename2);             }         } else {             fclose(flog);         }     } } void Log(const char *pszFmt,...) {     va_list argp;      Lock(&cs_log);     va_start(argp,pszFmt);     LogV(pszFmt,argp);     va_end(argp);     Unlock(&cs_log); } //Log} int main(int argc,char * argv[]) {     int i; #ifdef WIN32     InitializeCriticalSection(&cs_log); #else     pthread_mutex_init(&cs_log,NULL); #endif     for (i=0;i<10000;i++) {         Log("This is a Log %04d from FILE:%s LINE:%d\n",i, __FILE__, __LINE__);     } #ifdef WIN32     DeleteCriticalSection(&cs_log); #else     pthread_mutex_destroy(&cs_log); #endif     return 0; } //1-78行添加到你带main的.c或.cpp的那个文件的最前面 //81-85行添加到你的main函数开头 //89-93行添加到你的main函数结束前 //在要写LOG的地方仿照第87行的写法写LOG到文件MyLog1.log中

user: user-0
content: 引用 3 楼 shenchenman 的回复:1 第一种很明显没问题,但是之所以编译不过是因为续行符 \ 之后不能存在任何字符,空格也不行 2 第二种,你自己写的那个肯定也没问题,可能你没包含头文件会提示错误吧  Thank You 的确是包含头问题,我把宏函数写到#include之前了,所以提示错误.

user: user-2
content: 1 第一种很明显没问题,但是之所以编译不过是因为续行符 \ 之后不能存在任何字符,空格也不行 2 第二种,你自己写的那个肯定也没问题,可能你没包含头文件会提示错误吧

user: user-3
content: #define LOGI(fmt, arg...)   do{printf("[%s:%d[INFO]]: ",__FILE__,__LINE__);printf(fmt,##arg);}while(0) #define LOGE(fmt, arg...)   do{printf("[%s:%d[ERRO]]: ",__FILE__,__LINE__);printf(fmt,##arg);}while(0) #define LOGD(fmt, arg...)   do{printf("[%s:%d[DBUG]]: ",__FILE__,__LINE__);printf(fmt,##arg);}while(0)

user: user-4
content: 看你调试什么，一般，直接打印到显示器就好，没有必要记录下来。
user-0 提问: DOS下使用win-tc读取PCI端口，其中32位的端口如何处理？

回复:
user: user-0
content: 用TC的原因是编写DOS界面的时候比较好用，因为这些程序都是以一个小工具形式呈现出来的，所以除了小部分核心程序以外，多数代码都是在编译一个可以让用户可操作的界面。                我在写这个PCI读取工具的时候，放弃了使用IO端口 0cf8 0cfc，改用了BIOS中断。其中终端号为0x1a,ax入口参数为0xb109。              不过我还是会参考借鉴大家的资源继续研究使用16位，32位汇编去尝试编译32位，64位程式。     最后感谢各位大神的指点，谢谢你们的资源，感谢大家的热心帮助。

user: user-1
content: 引用 3 楼 zhao4zhong1 的回复:这个问题比较高大上。我也不会。楼主参考下面？ 《The Intel 64 and IA-32 Architectures Software Developer's Manual》 记得WATCOM C可以在纯DOS环境下使用32位程序。

user: user-2
content: 单独写一个小汇编文件实现这个功能

user: user-2
content: 引用 楼主 u013519169 的回复:现在使用Win-TC编写一段程式，实现在DOS下面遍历该电脑的PCI。PCI的控制端口和数据端口为0cf8、0cfc，都是32位字节的端口，而Win-TC（TC2.0）下面不支持对32位端口的直接操作，请问有什么办法可以实现16位编译环境完成32位端口的读写吗？  //这是一段32位环境下C中嵌入汇编语言，实现0cf8H 0cfcH端口读取的程序。 #define pci  (unsigned long) 0x80000000             address1=(pci+(bus<<16)+(dev<<11)+(fun<<8)+reg);         __asm{               mov eax,address1               mov dx,0cf8h               out dx,eax                 mov dx,0cfch               in  eax,dx                  mov result,ax                }   typedef unsigned char DWORD; //16位编译环境实现读32位端口 DWORD inpd(int portid) {                  DWORD  dwRet;                  asm mov dx,portid;                  asm lea bx,dwRet;                           /*接下来这一段是使用插入机器码，在16位环境下实现对32位的操作。（问题就在这，我的编译环境中emit不识别,请问我该如何插入这段机器码？？）*/                  __emit__(                              0x66,0x55,            //push  EAX                              0x66,0xED,           //in EAX,DX                              0x66,0x89,0x07    //mov [BX],EAX                              0x66,0x58             //pop EAX                     return  dwRet; }   //16位编译环境实现写32位端口 void outpd(int portid,DWORD dwVal) {               ......... }  你的思路已经很清晰了，既然你的C编译器不支持emit，那只有单独写一个小文件实现这个功能。你用TC，我有与之配套的TASM汇编器，建议你用我资源中的Turbo C 3.0http://download.csdn.net/detail/binaryhead/2987356，我特意把Tasm.exe、Tlink.exe、Make.exe集成进去了

user: user-3
content: 试试： 1、在Windows下安装VirtualBox； 2、在VirtualBox下安装DOS6.22； 3、在DOS6.22安装Turbo C 2.0； 然后就在TC中编译程序，把整个当成是DOS环境下。

user: user-1
content: 这个问题比较高大上。我也不会。楼主参考下面？ 《The Intel 64 and IA-32 Architectures Software Developer's Manual》

user: user-4
content: 32位的机器中的16位程序只能做16位的操作 为什么还用TC呢

user: user-0
content: 挤一挤
user-0 提问: C语言 十进制矩阵转换二进制 

回复:
user: user-0
content: 这个问题已经解决了  谢谢大家  后续要解决的是关于迷宫的问题 需要根据矩阵先画出图，不太明白怎么在矩阵格子里画墙，因为格子里是数值（数值和四周围墙是有关系的） 可不可以重新定义一个矩阵，在每个格子里画上下左右的墙？ 具体怎么做呢？

user: user-1
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-0
content: 引用 2 楼 etmkndmpl 的回复:我已经做出了如何转换成二进制形式  但是怎么把他们按照十进制的矩阵格式大小显示出来？  谢谢  而且因为我后面要用到这些二进制形式的数 做判断 所以是不是要申请一个数组把他们存下来 malloc?

user: user-0
content: 我已经做出了如何转换成二进制形式  但是怎么把他们按照十进制的矩阵格式大小显示出来？  谢谢

user: user-2
content: void show( int iNum ) {     for( int i=0; i<4; i++ )    {        printf( "%d", iNum&(0x08>>i) );    } }

user: user-3
content: （1）如果已经转换成十进制存储了，那么不用转换二进制了，直接采用二进制操作即可，计算机存储的就是二进制 （2）如果还没有转换，即从文件中读取了数字字符，那么用它减去字符'0'就是十进制值，比如 ’2‘ - ‘0’ = 2。然后转换成上面（1）

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

user: user-4
content: 文件的存储方式本来就是二进制方式，只是打印出来是十进制而已，所以你要进行二进制运算根本不需要转换啊，十进制树也是可以做位运算的
user-0 提问: 程序调试时遇到access violation的问题

回复:
user: user-1
content: 单步调试跟踪，看看指针哪里异常了。

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

回复:
user: user-1
content: 引用 10 楼 filia2014 的回复:   这是错误提示，如果加上static就没有。。。。 这就是跟你的编译环境有关系！呵呵

user: user-2
content: main只调用一次，在其中变量使用static的和不使用的唯一区别就是数据放在不同的段里喽！

user: user-3
content: 引用 10 楼 filia2014 的回复:   这是错误提示，如果加上static就没有。。。。我可以说你这个也太老了吧？现在不是很多的编程软件……如果只喜欢敲命令行的话，可以用装个linux系统……

user: user-0
content: 这是错误提示，如果加上static就没有。。。。

user: user-0
content: 我是 turo C2 真的会出错。。。所有的指针数组地址都显示错误。。。。。。。试了好几次了。。。。我还以为是不是指针数组的地址不定义静态变量就全部是会变化的。。。。。。

user: user-0
content: 引用 1 楼 u010030181 的回复:这里使不使用都没有关系…… 不使用会出错！

user: user-4
content: 你看的书太老了

user: user-5
content: 在main函数中就是让static定义成静态全局变量存储在全局数据区，如果没有static的话，其实也是在这里，但是有的话就是说在定义的文件有效，不是整个工程文件内都有效。在main函数中确实比较特殊，可以不要的。

user: user-6
content: 从语法角度来看, 你这程序, 用不用static都没有错.

user: user-7
content: 我试过，没出错。 你用的什么编译器？不会是臭名昭著的VC6吧

user: user-8
content: 引用 2 楼 filia2014 的回复:引用 1 楼 u010030181 的回复:这里使不使用都没有关系…… 不使用会出错！ 会出错？ 出什么错啊？ 从程序看不会出错的。

user: user-9
content: 鉴定 不出错。

user: user-3
content: 这里使不使用都没有关系……
user-0 提问: C语言 KMP 这个代码没看懂，大神帮忙看一下！

回复:
user: user-0
content: 引用 1 楼 zhouxiaofeng1021 的回复:字符串匹配问题，看一下算法说明 有公式的 请参考 http://blog.csdn.net/yaochunnian/article/details/7059486 做个沙发嘻嘻！  我知道求next数组有公式，但这个程序里为什么没有用求next数组，就直接用了？

user: user-1
content: 字符串匹配问题，看一下算法说明 有公式的 请参考 http://blog.csdn.net/yaochunnian/article/details/7059486 做个沙发嘻嘻！

user: user-2
content: 引用 2 楼 baiyz27 的回复:[quote=引用 1 楼 zhouxiaofeng1021 的回复:] 字符串匹配问题，看一下算法说明 有公式的 请参考 http://blog.csdn.net/yaochunnian/article/details/7059486 做个沙发嘻嘻！  我知道求next数组有公式，但这个程序里为什么没有用求next数组，就直接用了？[/quote] 没有初始化就用next那就是写这个程序的人的问题，C编译器不会强制阻止编程人员访问未初始化数组的元素，所以这个程序能编译通过。但这个程序能实际工作吗？试试就知道了。
user-0 提问: 指定字符串逆序

回复:
user: user-1
content: void reverseN( std::string &str, int n ) {     int nSize = str.length();     for (int i = 0; i < n; i++)     {         char c = str[i];         str[i] = str[nSize - n + i];         str[nSize - n + i] = c;     } }

user: user-2
content: 仅供参考，如果n大于字符串长度的一半，lz自行修改处理 void reverse(char *str,int n) { 	char *pLeft = str; 	char *pRight = str+strlen(str)-n; 	while (*pRight) 	{ 		char c = *pLeft; 		*pLeft = *pRight; 		*pRight = c; 		pLeft++; 		pRight++; 	} }

user: user-0
content: #include <iostream> #include<string> using namespace std; string reverse(string str,int n) { 	int len=str.length(); 	if(n>len/2) 	{ 		return str; 	}    for(int i=0;i<n;i++) 	{ 		char tmp; 		tmp=str[i]; 		str[i]=str[len-n+i]; 		str[len-n+i]=tmp; 	} 	return str; } void main() { 	string str="abcdef"; 	cout<<reverse(str,2)<<endl; }

user: user-3
content: 仅供参考 /*************************************************************************     > File Name: reverse.cpp     > Author: 傻李     > Mail: hellojukay@gmail.com      > Created Time: 2014年11月18日 星期二 14时41分32秒  ************************************************************************/  #include<iostream> #include<string> using namespace std; string & reverse(string &str, int n) { 	int i; 	int len = str.size(); 	for( i = 0; i < n ;++i) 		swap(str[i],str[len -n + i]); 	return str; }  void swap(char &a, char &b) { 	char tmp; 	tmp = a; 	a = b; 	b =tmp; }  int main() { 	int n; 	string s; 	cin >> s >> n; 	s = reverse(s, n); 	cout << s << endl; 	return 0; }
user-0 提问: 关于for循环的循环变量值的问题

回复:
user: user-1
content: 引用 4 楼 love0918 的回复:[quote=引用 3 楼 zhouqinghe24 的回复:] i 先加再 判断 for循环  三段代码的执行顺序  第一段 只开始执行一次，然后每次第三段 先执行，然后判断第二段。  第二段是true ，进入循环。 当i<10 为false 时，i已经赋值为10了  朋友这样解释应该不对吧。如果先执行第三段的 那么i就应该从1开始啦，不应该从0开始。 我在《C程序设计语言》找到关于for循环的解释如下： for循环语句：  for(表达式1;表达式2;表达式3）      语句  等价于下列while语句：  表达式1 while(表达式2）{        语句         表达式3; }  就这个看来，for循环语句执行过程应该是： step1.先执行表达式1,并且之执行一次 step2.然后判断表达式2,                  如果判断为真，则执行setp3;                  如果判断为假，则跳出循环; step3.执行语句 step4.执行表达式3，执行setp2.  朋友，我这样解释不知道你认不认同？[/quote]  嗯 是我搞错了。 脑子没转。。。

user: user-2
content: 引用 4 楼 love0918 的回复:朋友，我这样解释不知道你认不认同？ 有一点错误： 就这个看来，for循环语句执行过程应该是： step1.先执行表达式1,并且之执行一次 step2.然后判断表达式2, //把这句删掉才对                 如果判断为真，则执行setp3;                  如果判断为假，则跳出循环; step3.执行语句 step4.执行表达式3，执行setp2.

user: user-0
content: 引用 3 楼 zhouqinghe24 的回复:i 先加再 判断 for循环  三段代码的执行顺序  第一段 只开始执行一次，然后每次第三段 先执行，然后判断第二段。  第二段是true ，进入循环。 当i<10 为false 时，i已经赋值为10了  朋友这样解释应该不对吧。如果先执行第三段的 那么i就应该从1开始啦，不应该从0开始。 我在《C程序设计语言》找到关于for循环的解释如下： for循环语句：  for(表达式1;表达式2;表达式3）      语句  等价于下列while语句：  表达式1 while(表达式2）{        语句         表达式3; }  就这个看来，for循环语句执行过程应该是： step1.先执行表达式1,并且之执行一次 step2.然后判断表达式2,                  如果判断为真，则执行setp3;                  如果判断为假，则跳出循环; step3.执行语句 step4.执行表达式3，执行setp2.  朋友，我这样解释不知道你认不认同？

user: user-1
content: i 先加再 判断 for循环  三段代码的执行顺序  第一段 只开始执行一次，然后每次第三段 先执行，然后判断第二段。  第二段是true ，进入循环。 当i<10 为false 时，i已经赋值为10了

user: user-2
content: 更简单的情况：     for (i=0; i<10; i++){         printf("%d\n", i);     } 循环结束之后，i是10而不是9

user: user-2
content: for (1; 2; 3) {   4; } for循环的执行次序：1--2--4--3--2--4--3--2……跳出循环是2的条件不满足跳出来的。 就这个例子来说，打印"u 9"的时候i是9，然后要执行i++，然后才是getchar收到空行并结束循环，所以跳出循环后i已经是10了
user-0 提问: A mysterious error reported by gcc

回复:
user: user-0
content: 引用 1 楼 brookmill 的回复:gcc  4.8.2 编译通过。 楼主把MAX_INPUT改个名字再试试吧，我的/usr/include/limits.h里面有个宏定义也叫MAX_INPUT 楼主还可以试试用gcc -E test.c来看看预处理器到底把它弄成什么样了。 谢谢brookmill！我也怀疑就是这个MAX_INPUT宏名在捣鬼，难怪换到VC6编译就不会有事了。而且奇怪的是，我将源文件放到VC6的工程里编译之后再用CodeBlocks编译，竟然通过了！呵呵，编译器的内幕很深啊！

user: user-1
content: gcc  4.8.2 编译通过。 楼主把MAX_INPUT改个名字再试试吧，我的/usr/include/limits.h里面有个宏定义也叫MAX_INPUT 楼主还可以试试用gcc -E test.c来看看预处理器到底把它弄成什么样了。

user: user-2
content: 内幕再深，gcc是开源的。
user-0 提问: 一个C语言数据类型内部机制的问题

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

user: user-2
content: 所谓的数据类型就是人为规定的对一串二进制的解释标准

user: user-3
content: #include <stdio.h> int main() { union { double f; int        a[20]; }u; scanf("%lf",&u.a); printf("%lf",u.f);//看看是不是输出 一个接近 4.94 的数据了  return 0; } int  和 “%lf” 要求的类型不一致， 很多编译器实际上，不检查 格式串 "%lf"， 和 后面的参数类型是否一致。  所以，编译是没有问题的，输入输出结果，就未必正确了 某些时候，还会产生运行时错误

user: user-1
content: http://bbs.csdn.net/topics/390676437

user: user-4
content: 你能看懂我现在说的这句话，是因为你以中文的角度来看中文，如果让一个不懂中文的老外看这句话，那就是乱码。

user: user-5
content: C语言浮点数在内存中的存储方式和整数是截然不同的，具体资料自行搜索。

user: user-6
content: int d ； scanf("%lf",&d)  因为  将你输入的值以阶码的形式存进了 d变量的内存中， 阶码直接以int 类型  即补码解析，得到的结果就是你运行出来的结果

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

user: user-7
content: 引用 1 楼 user-8 的回复:数据对于计算机来说都是一系列的01串，但对于人来说这显然无法阅读和理解，所以就形成了各种各样的所谓的数据“类型”这些类型可能有不同的长度，我们只有遵循对应的操作规则才能让计算机对此进行正确的计算，并将结果呈献给我们+1

user: user-8
content: 数据对于计算机来说都是一系列的01串，但对于人来说这显然无法阅读和理解，所以就形成了各种各样的所谓的数据“类型”这些类型可能有不同的长度，我们只有遵循对应的操作规则才能让计算机对此进行正确的计算，并将结果呈献给我们
user-0 提问: 关于指针指向函数在vs2013上的错误，求各位大大帮忙

回复:
user: user-1
content: 楼主上代码啊

user: user-2
content: 对错误的检查更严了。应该是你原来的代码就有问题，但没触发异常，所以2010下可以运行；2013在debug模式增加了内存检测，检测到有错误，就主动触发异常了。
user-0 提问: 求助一个关于结构体指针做函数参数的疑惑

回复:
user: user-1
content: 楼主说的那个 s->base 是指向char型的指针。 楼主说的栈结构是这样 typedef struct {     int stackSize;//栈容量     char *base;//栈底指针     char *top;//栈顶指针 } SqStack;  而楼主的链表结构也许类似于是这样 typedef struct node { 	int data; 	struct node *next;//结构体指针 }TT;//  TT就表示一个结构体，用TT就相当于定义整数的int一样定义一个结构体或结构体指

user: user-2
content: 修改的是s指向的内容，所以s->base, s->top都被修改了。s是一个指针，s->base也是一个指针，别搞混了。 你传入s，那么s本身的值不变，而s指向的区域都可以修改，跟s->base是不是指针没有关系。

user: user-3
content: 在s已经分配内存的情况下，就不需要用二级指针。

user: user-0
content: 引用 3 楼 truelance 的回复:修改的是s指向的内容，所以s->base, s->top都被修改了。s是一个指针，s->base也是一个指针，别搞混了。 你传入s，那么s本身的值不变，而s指向的区域都可以修改，跟s->base是不是指针没有关系。 谢谢

user: user-0
content: 引用 7 楼 turingo 的回复:是的  [quote=引用 5 楼 sharp_Allen 的回复:] [quote=引用 2 楼 turingo 的回复:] 在s已经分配内存的情况下，就不需要用二级指针。 是不是，在主调函数里，是 SqStack s；此时 s 是被自动分配内存了（栈区），然后把&s 做参数传入初始化函数里，这就是在 s 已经分配内存的情况下……[/quote][/quote] 谢谢

user: user-3
content: 是的  引用 5 楼 sharp_Allen 的回复:[quote=引用 2 楼 turingo 的回复:] 在s已经分配内存的情况下，就不需要用二级指针。 是不是，在主调函数里，是 SqStack s；此时 s 是被自动分配内存了（栈区），然后把&s 做参数传入初始化函数里，这就是在 s 已经分配内存的情况下……[/quote]

user: user-0
content: 引用 3 楼 truelance 的回复:修改的是s指向的内容，所以s->base, s->top都被修改了。s是一个指针，s->base也是一个指针，别搞混了。 你传入s，那么s本身的值不变，而s指向的区域都可以修改，跟s->base是不是指针没有关系。 对，s 是没有变，是s 指向的内容被修改了，但是 在函数里，是把堆分配的内存，让 s->base 指向了，那么 base 这个指针没有改变，改变的是base它指向的内容，函数里不是让 s = malloc……。我还是拧在这里

user: user-0
content: 引用 2 楼 turingo 的回复:在s已经分配内存的情况下，就不需要用二级指针。 是不是，在主调函数里，是 SqStack s；此时 s 是被自动分配内存了（栈区），然后把&s 做参数传入初始化函数里，这就是在 s 已经分配内存的情况下……

user: user-0
content: 自己顶顶，没人啊？
user-0 提问: 要整一段数据的header，需要用到几个字节，用uint8 还是uint8_t ?

回复:
user: user-1
content: uint8_t 是stdint.h中的标准类型。

user: user-2
content: VS IDE中，在不明白的符号上点鼠标右键，选转到定义。  不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊！ http://bbs.csdn.net/topics/380167545
user-0 提问: win8.1系统VS2013下如何配置directshow开发环境

回复:
user: user-1
content: 引用 1 楼 zhao4zhong1 的回复:盲目升级是码农之殇！  啥意思呢

user: user-2
content: win8 下需要安装ms sdk7.1+，DirectShow 已经打包在ms sdk的\Samples\multimedia下了

user: user-3
content: 盲目升级是码农之殇！