Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 结构体中同一成员变量两种定义的用法

回复:
user: user-1
content: 引用 2 楼 jianwen0529 的回复: void op(struct funarg_s *fa) { #ifdef _XX_YY_     long   lrtn;     //... #else     char lrtn;     //... #endif // _XX_YY_      fa->rtn = lrtn;                                             //有时会返回异常     //memcpy(&fa->rtn, &lrtn, sizeof(fa->rtn)); } 错了，char那里应该是个数组  void op(struct funarg_s *fa) { #ifdef _XX_YY_     long   lrtn;     //...     fa->rtn = lrtn;                                             //有时会返回异常  #else     char crtn[4];     //...     memcpy(&fa->rtn, &crtn, sizeof(char)*4); #endif // _XX_YY_ }

user: user-1
content: void op(struct funarg_s *fa) { #ifdef _XX_YY_     long   lrtn;     //... #else     char lrtn;     //... #endif // _XX_YY_      fa->rtn = lrtn;                                             //有时会返回异常     //memcpy(&fa->rtn, &lrtn, sizeof(fa->rtn)); }

user: user-2
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("AD sizeof %d\n", sizeof(AD));     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("A1 sizeof %d\n", sizeof(A1));     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("A2 sizeof %d\n", sizeof(A2));     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("A4 sizeof %d\n", sizeof(A4));     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("A8 sizeof %d\n", sizeof(A8));     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("A16 sizeof %d\n", sizeof(A16));     printf("\n");     return 0; } //AD.a 0 //AD.b 4 //AD.c 24 //AD sizeof 32 // //A1.a 0 //A1.b 4 //A1.c 17 //A1 sizeof 25 // //A2.a 0 //A2.b 4 //A2.c 18 //A2 sizeof 26 // //A4.a 0 //A4.b 4 //A4.c 20 //A4 sizeof 28 // //A8.a 0 //A8.b 4 //A8.c 24 //A8 sizeof 32 // //A16.a 0 //A16.b 4 //A16.c 24 //A16 sizeof 32 // //
user-0 提问: vs中的c程序该语句    typedef short bool; 报错，怎么破？bool必须换名字吗？

回复:
user: user-1
content: #ifndef __cplusplus typedef unsigned char bool; #endif

user: user-2
content: 你建立的是cpp当然用的是c++运行库

user: user-3
content: 既然是c程序,把源文件后缀改成.c就行了

user: user-2
content: 引用 7 楼 jianwen0529 的回复:[quote=引用 5 楼 peterlee1983 的回复:] [quote=引用 2 楼 jianwen0529 的回复:] 你建立的是cpp当然用的是c++运行库 拜托，咱建立的就是.c[/quote]  纯粹C是没有任何问题的，估计是其他原因。 你可以参考3楼 也可以直接使用C99直接导入stdbool.h，这里有定义bool类型，你这句别名就不再需要。  // VS2013 // main.c  #include <stdio.h>  typedef short bool; #define false 0; #define true  1;  int main() {     bool b = true;     printf("%d\n", b);     if (b)     {         printf("The bool value is true\n");     }     return 0; }[/quote] 代码有点小问题，#define 后面不应该有；分号

user: user-2
content: 引用 5 楼 peterlee1983 的回复:[quote=引用 2 楼 jianwen0529 的回复:] 你建立的是cpp当然用的是c++运行库 拜托，咱建立的就是.c[/quote]  纯粹C是没有任何问题的，估计是其他原因。 你可以参考3楼 也可以直接使用C99直接导入stdbool.h，这里有定义bool类型，你这句别名就不再需要。  // VS2013 // main.c  #include <stdio.h>  typedef short bool; #define false 0; #define true  1;  int main() {     bool b = true;     printf("%d\n", b);     if (b)     {         printf("The bool value is true\n");     }     return 0; }

user: user-4
content: C++里有bool关键字  从语义上讲也不建议把short用bool代替

user: user-0
content: 引用 2 楼 jianwen0529 的回复:你建立的是cpp当然用的是c++运行库 拜托，咱建立的就是.c

user: user-5
content: 建议不要将short的别名为bool，因为bool本身就是类型（C99），建议将short定义成其他名字，比如s16等等
user-0 提问: 菜鸟求教编译链接问题

回复:
user: user-1
content: 没用过这个编译工具，不懂。 楼主为啥要使用这个编译工具？？？

user: user-2
content: 你的代码分布在3个c程序里，编译的时候只编译一个.c，这样是不行的，需要把所有的.c编译成.obj或者是.o，然后链接到一起才可以。 没用过这个ide，应该是在类似工程的地方设置吧
user-0 提问: C求教,脑筋急转弯？

回复:
user: user-1
content: /* 假设有5台设备，其中1台(编号X)控制另外4台(编号为A,B,C,D)。 程序开始时发送指令{1,1,1,1}控制对应的4台设备进行初始化，设备正常运转则返回{1,1,1,1}。 然后开始运行程序，若C设备故障，则返回{1,1,0,1}     继续对剩余的三台ABD循环测试发送{1,1,0,1}. 若B故障，则发送{1,0,0,1} ------ 哪路故障放弃哪路   */  #include <stdio.h>  typedef struct device { 	int device[4]; 	int status[4]; }DEVICE;  DEVICE device_test;  void device_init(int id) { 	int status=0; 	//这里填充发送1指令之类的设备初始化函数，成功status=1，否则status=0 	if(status) 		device_test.status[id]=1; 	else 		device_test.status[id]=0; 		 }  void re_init() { 	int count; 	while(1) 	{ 		for(count=0;count<4;count++) 		{ 			if(device_test.status[count]) 					;//正常设备忽略 			else				 				device_init(count);//不正常的再次初始化 		} 		//当设备初始化全部失败退出 		//if(全失败) 		//break；		 	} }  int main(void) { 	int count;	 	//赋值设备ID，第一次初始化，得到返回状态 	for(count=0;count<4;count++) 	{ 		device_test.device[count]=count; 		device_init(device_test.device[count]); 	} 	//重新初始化 	re_init();  	return 0;  } 不知道是不是类似这个的，细节自己补充吧。
user-0 提问: 请教大神 现在学习Windows驱动开发 看什么书入门好?

回复:
user: user-1
content: 学习C语言，除了学习基本的C库函数使用，主要的还有系统开发。建议可以了解和熟悉一下系统函数。驱动学习还是要求有一定的C语言功底的

user: user-2
content: Windows驱动开发 http://www.osronline.com/

user: user-3
content: Windows驱动开发技术详解

user: user-2
content: 引用 6 楼 qq_18599547 的回复:[quote=引用 2 楼 zhao4zhong1 的回复:] Windows驱动开发 http://www.osronline.com/ 赵老师   那个网站 课程收费的  3000+美刀 我是穷B - - [/quote] 这个网站里面除了收费课程以外就没有其它免费可获得的有用信息了？

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:Windows驱动开发 http://www.osronline.com/ 赵老师   那个网站 课程收费的  3000+美刀 我是穷B - -

user: user-0
content: 引用 3 楼 cfjtaishan 的回复:学习C语言，除了学习基本的C库函数使用，主要的还有系统开发。建议可以了解和熟悉一下系统函数。驱动学习还是要求有一定的C语言功底的  开发系统,这个还不行- -  系统函数 常用的基本都了解.

user: user-0
content: 引用 1 楼 user-3 的回复:Windows驱动开发技术详解 这本书是不是有点老了啊 - -
user-0 提问: LoadImage返回值为零，求助

回复:
user: user-1
content: https://msdn.microsoft.com/en-us/library/windows/desktop/ms648045(v=vs.85).aspx  If the function succeeds, the return value is the handle of the newly loaded image.  If the function fails, the return value is NULL. To get extended error information, call GetLastError.  调用GetLastError判断失败原因

user: user-0
content: 引用 2 楼 cfjtaishan 的回复:查看一下是否是路径问题，建议将错误号对应的错误信息打印出来 怎么打印错误信息，新手表示不懂

user: user-2
content: 查看一下是否是路径问题，建议将错误号对应的错误信息打印出来

user: user-0
content: 引用 楼主 suifengjz 的回复:同一个dll，静态调试的时候可以找到图片句柄 lhBm=(HBITMAP)LoadImage(NULL,/*"c:\\1.bmp"*/lpszName,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_LOADFROMFILE); 动态调试的时候，同样的代码却找不到图片句柄，不知道该怎么修改#include <direct.h> #include <tchar.h> #include <stdio.h> #include <windows.h> #include "atlstr.h" typedef int(*lpFindBmpFun)(int, int,int,int,LPCTSTR,int&,int&); //宏定义函数指针类型 typedef int(*lpFindBmpFunok)(int, int,int,int,LPCTSTR,int,int,int,int&,int&); //宏定义函数指针类型 extern "C" __declspec(dllimport)int FindBmp(int x1,int y1,int x2,int y2, LPCTSTR lpszName,int &fx,int &fy);  extern "C" __declspec(dllimport) int FindBmpEx(int x1,int y1,int x2,int y2,LPCTSTR lpszName,int backcolor,int errorcolor,int errorcount,int &fx,int &fy); int main(int argc, char *argv[]) { 	HINSTANCE hDll; //DLL句柄  	lpFindBmpFun FindBmpFun; //函数指针 	lpFindBmpFunok FindBmpExFun; //函数指针 	hDll = LoadLibrary(L"..\\Debug\\FindProc.dll"); 	if (hDll != NULL) 	{ 		FindBmpFun = (lpFindBmpFun)GetProcAddress(hDll, "FindBmp"); 		FindBmpExFun = (lpFindBmpFunok)GetProcAddress(hDll, "FindBmpEx"); 		if (FindBmpFun != NULL||FindBmpExFun != NULL) 		{ 			TCHAR buffer[MAX_PATH] = {0}; 			_tgetcwd(buffer, MAX_PATH); 			TCHAR s[20]=_T("\\PIC \\1.bmp"); 			_tcscat_s(buffer,s); 			//  LPCTSTR lpszName =(const TCHAR*) (buffer); 			LPCTSTR lpszName =LPCTSTR (&buffer[0]) ;//用这句不行hBm会为0， 			//LPCTSTR lpszName =L"d:\\1.bmp";//直接用这句时就可以，求解决方法 			int fx,fy; 			int result =FindBmpFun(0,0,1920,1080,  lpszName ,  fx, fy);  			BITMAP bm;   //自定义图片  			HDC hdc,hdcmem; 			HBITMAP hBm; 			BITMAPINFO   b; 			//加载图片 			hBm=(HBITMAP)LoadImage(NULL,/*"c:\\1.bmp"*/lpszName,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_LOADFROMFILE); 			if(hBm==NULL) 			{ 				// MessageBox("LoadImage Error !"); 				MessageBox(NULL, L"LoadImage Error !", TEXT("Error"), MB_OK); 				// return FALSE; 			}  			printf("%d""\n", result); 			printf("X的坐标是：%d\n", fx); 			printf("Y的坐标是：%d\n",fy);  			system("pause");  		} 		FreeLibrary(hDll); 	} 	return 0; }
user-0 提问: 输入56，怎么转换成0x56

回复:
user: user-1
content: 作为一个C程序员，对  scanf,sscanf,fscanf  printf,sprintf,fprintf 这类函数的用法，还是要做到“拳不离手，曲不离口”的。

user: user-2
content: int decNum = 56; int hexNum = (decNum/10)*16+(decNum%10);

user: user-3
content: #include <stdio.h> #include <stdlib.h> int main(void) { 	int n = 0; 	scanf("%x", &n); 	printf("n = 0x%X\n", n); 	 	const char *str = "56"; 	long m = strtol(str, NULL, 16); 	printf("m = 0x%X\n", m); 	 	return 0; }
user-0 提问: 帮帮忙，求各位路过的大神帮忙检查一下，给点意见

回复:
user: user-1
content: #include<stdio.h>  void print_rank(int score);  int main(void) {     int score;    //case 1:     while (1) {         printf("Please input a student's score: ");         scanf("%d", &score);         if (score < 0 || score > 100)             break;         print_rank(score);     }     //case 2:     int i;     for (i = 0; ;i++) {         printf("Please input a student's score: ");         scanf("%d", &score);         if (score < 0 || score > 100)             break;         print_rank(score);     }      //case 3:     do {         printf("Please input a student's score: ");         scanf("%d", &score);         print_rank(score);     } while (score >= 0 && score <= 100);      return 0; }   void print_rank(int score) {     int rank = score / 10;      switch(rank) {         case 10:         case 9:             printf("A+\n");             break;          case 8:             printf("B+\n");             break;          case 7:             printf("C+\n");             break;          case 6:             printf("D+\n");             break;          case 5:         case 4:         case 3:         case 2:         case 1:         case 0:             printf("E\n");             break;          default:             printf("Not support!\n");             break;     } }

user: user-2
content: 你试一下这个  #include<stdio.h> int main() {     int s,y;     printf("Input Score:");     scanf("%d",&s);     do     {         if(s>=0&&s<=100)         {              y=s/10;             switch(y)             {                 case 9:case 10:printf("%d的等级为a\n",s);break;                 case 8:printf("%d的等级为b\n",s);break;                 case 7:printf("%d的等级为c\n",s);break;                 case 6:printf("%d的等级为d\n",s);break;                 default:printf("%d的等级为e,不及格\n",s);break;             }         }         else         {             break;         }     }while(scanf("%d",&s)); }
user-0 提问: C语言指针问题

回复:
user: user-1
content: *q=A[i]; 改成 q=&A[i];

user: user-2
content: #include <stdio.h> #include <stdlib.h>  int main() {     int A[10];     int *q = NULL;     int i;     for(i = 0; i < 10; i++)         A[i]=i;     q = (int *)malloc(sizeof(int));     for(i = 0; i < 10; i++){         *q = A[i];         printf("%d\n",*q);     }     return 0; }

user: user-3
content: #include <stdio.h>  int main() { 	int a[10];  	int *q ; 	int i; 	q  = &a[0]; 	 	for(i =0;i < 10; i++) 	{ 		a[i]=i; 	}  	for(i=0;i < 10;i++) 	{ 		 		*q = a[i]; 		printf("%d\n",*(q+i)); 	} }

user: user-4
content: 指针：保存一个对象的地址值 对指针使用 * ，表示解引用操作，也就是获得指针指向的地址的对象 你的指针指向NULL，你给空地址上的位置赋值，所以报错

user: user-5
content: 给指针赋的是地址，不是值，而且在使用指针的时候一定要给指针分配空间。（1楼2楼都对）                而且你的输出也有问题， for(i = 0;1<10;1++) {      printf("%d ",*(q+i)); } 其实数组也相当于指针 *(q+i)  == q[i]       a[i] == *(a + i) 你直接输出*q只会得到首地址的值即q[0]也就是a[0]的值

user: user-6
content: *q=A[i]; 改成 q=&A[i];

user: user-7
content: 我就想问问到底谁说对了？

user: user-8
content: int *q=NULL;你这是个空指针，怎么能解引用 *p？ 你要指向一个地方啊，比如用malloc分配一个空间 int *q = malloc(sizeof(int));

user: user-9
content: 问题在没有对q赋一个合法的地址，就使用*q=A[i];这是q指向何处？ 正确的做法 q=a; for(i=0;i<10;i++){ printf("%d\n",*q++); }

user: user-0
content: 感谢大神们的解读，小白知道问题了
user-0 提问: 结构体二维数组如何写文件和读文件

回复:
user: user-1
content: 用容器Qtl

user: user-0
content: C语言该如何写？

user: user-0
content: 中间的file.flush();改为file.seek(0);

user: user-0
content: 引用 3 楼 adeng1919 的回复:当然不是，你好好看看  QFile file("./table1");      bool ret = file.open(QIODevice::ReadWrite|QIODevice::Truncate);     QDataStream out(&file);     if (!ret)     {         qDebug() << "open table1 failed";     }     for (int i = 0; i < rows; i++)     {         for (int j = 0; j < columns; j++)         {             out << p1_list[i][j].flag << p1_list[i][j].punched;         }     }     file.flush();     for (int i = 0; i < rows; i++)     {         for (int j = 0; j < columns; j++)         {             out >> p_list[i][j].flag >> p_list[i][j].punched;         }     }      file.close();  这么写岂不是很麻烦么？

user: user-2
content: 当然不是，你好好看看

user: user-0
content: 引用 1 楼 adeng1919 的回复:都用Qt了，直接用QDataStream来读写二进制数据不是更简单，不用操心内存管理 我用的结构体，QDataStream只能写Qt指定的类型格式啊

user: user-2
content: 都用Qt了，直接用QDataStream来读写二进制数据不是更简单，不用操心内存管理
user-0 提问: fstream  的getline 会在读取后在buf的尾部加一个字符串结尾终结符‘0’吗？

回复:
user: user-1
content: 不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！

user: user-2
content: std::istream::getline  istream& getline (char* s, streamsize n ); istream& getline (char* s, streamsize n, char delim );  参数就是char *,所以会加,(所以还要求指定最大长度) 改用std::getline(tmp, cfgFile);

user: user-1
content: 水→谁

user: user-1
content: 引用 3 楼 SXJIAKE 的回复:[quote=引用 2 楼 zhao4zhong1 的回复:] 不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！老师不就是你吗，回帖不就是你这段文字吗。[/quote] 我不入地狱，水入地狱？

user: user-3
content: 引用 2 楼 zhao4zhong1 的回复:不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！老师不就是你吗，回帖不就是你这段文字吗。
user-0 提问: 将一个数组中的值按照逆序重新存放

回复:
user: user-1
content: 《关于利用scanf()函数做为do-while循环条件的分析》 https://blog.csdn.net/eudemon_cn/article/details/6583620

user: user-1
content: 是不是scanf()不能做关系符的左半边，记得c=getchar()可以，因为是c，而scanf()感觉既不是变量又不是常量。

user: user-2
content: Linux：Ctrl+D Windows：Enter、Ctrl+Z、Enter

user: user-3
content: #include<stdio.h>  int main() {     int a[100];     int m;     int i = 0, n = 0, temp;     while(scanf("%d",&m) != EOF && n < 100){         a[i++] = m;         n++;     }         i=0;     while(i < n/2){         temp = a[n-1-i];         a[n-1-i]=a[i];         a[i] = temp;         i++;     }     for(i=0;i<n;i++)         printf("%d ", a[i]);     putchar(10);     return 0; } Linux下输入EOF的快捷键是：ctrl+d,windows下是Ctrl+z 注意加上n < 100

user: user-4
content: windows中的EOF是这样输入的： 回车 ctrl+Z 回车
user-0 提问: 下面这个程序的结果是什么？

回复:
user: user-1
content: 未定义行为  关于C,C++表达式求值顺序  http://bbs.csdn.net/topics/370153775

user: user-2
content: 这个题没意义。因为  answer = Func() - Func() * Func();  中，哪一个函数调用先执行？ 这就是C语言标准中说的“未定义行为”， 即使是同一种编译器，不同的版本，结果都可能不一样。 典型的谭氏风格题目。
user-0 提问: 找不到错误了！！！愚昧一下午

回复:
user: user-1
content: 单从CheakCapacity看不出什么问题，建议将相关的代码也贴出来，比如数据结构定义等等

user: user-2
content: error C2143: 语法错误 : 缺少“;”(在“类型”的前面) 原因与解决方案： 纯c要求局部变量定义必须在函数或局部空间的开头，然后才能有其他语句。  纯c确实对变量声明的位置有要求，c++却可以随用随定义的。 说明vs是严格执行了纯C的标准。  变量任意定义是c99的标准。

user: user-0
content: tmp = (DataType*)realloc (Seq->p, (Seq->_capacity+ADD_SIZE)*sizeof(DataType));  >main.c  1>c:\users\han\documents\visual studio 2008\projects\动态顺序表的实现（c语言版）\动态顺序表的实现（c语言版）\main.c(18) : error C2143: 语法错误 : 缺少“)”(在“;”的前面)  1>c:\users\han\documents\visual studio 2008\projects\动态顺序表的实现（c语言版）\动态顺序表的实现（c语言版）\main.c(18) : error C2059: 语法错误 : “)”

user: user-3
content: 双击错误提示，定位到出错的语句，自己找找看！  还有更为详细的信息提示，这里看不出什么问题
user-0 提问: 创建一个顺序表存放在一个数组中

回复:
user: user-1
content: 如果是.c文件，变量必须在作用域的开始定义

user: user-2
content: #include<stdio.h> #include <stdlib.h>  #define MAXSIZE 100  typedef int elemtype;  typedef struct {     elemtype data[MAXSIZE];     int last; }seqlist;  seqlist *init() {     seqlist *L;     L = (seqlist *)malloc(sizeof(seqlist));     if (!L) {         fprintf(stderr, "malloc error!\n");         exit(-1);     }     L->last = -1;      return L; } int insert(seqlist *L,elemtype x,int i) {     int j;     for(j = L->last; j >= i-1; j--)         L->data[j+1] = L->data[j];     L->data[i-1] = x;     L->last = L->last+1;      return 1; } void show(seqlist *L) {     int i;      for(i = 0; i < 10; i++)         printf("%d ", L->data[i]);     putchar(10); }  int main() {     int a[10]={0,-1,-2,1,2,3,7,-3,0,10};     int i;     seqlist *L;      L = init();     for(i=0;i<10;i++)         insert(L,a[i],i+1);     show(L);     return 0; }  show函数直接定义成void类型，不需要返回值就不用定义成有返回值的。 程序没问题，估计是跟编译器有关，旧的编译器对变量的声明和定义要求是声明都要放在前面，新的要求就相对宽些，可以什么时候使用，什么时候定义。

user: user-3
content: 编译器太老了，换新一点的。 或者，把 main 中的 int a[10]={0,-1,-2,1,2,3,7,-3,0,10}; int i; 两行往前提
user-0 提问: 这边人多问个问题

回复:
user: user-1
content: 引用 6 楼 zhao4zhong1 的回复:[quote=引用 5 楼 DelphiGuy 的回复:] 只读只是对用户操作，文件系统层面还是有写的。 比如更新文件的上次访问时间……[/quote]  还有log之类的，除了FAT、FAT32这种过于简单的文件系统，稍微复杂点的都支持log，linux上一般叫journal。

user: user-1
content: 你用diff比较一下两个md5不同的文件就知道哪里不同了。

user: user-0
content: 引用 5 楼 DelphiGuy 的回复:只读只是对用户操作，文件系统层面还是有写的。  环境我没描述清楚，我dd的mtd分区只是一个uboot分区，系统起来后不该去读写里面的数据，而且该mtd分区也没有挂载，只是奇怪dd 同一个分区的数据 到 ramdisk上面 结果 md5sum 值可能不同，或许真的是在ramdisk上生成的时间不同 导致md5sum值有差异

user: user-2
content: 引用 5 楼 DelphiGuy 的回复:只读只是对用户操作，文件系统层面还是有写的。 比如更新文件的上次访问时间……

user: user-1
content: 只读只是对用户操作，文件系统层面还是有写的。

user: user-0
content: 引用 1 楼 DelphiGuy 的回复:很正常啊，分区还包括文件访问时间之类的数据，当然可能发生变化。  不会 dd 的读取对象是flash的一个分区，flash是用的mtd的形式，那个分区是ro的，所以不会有改变，只是奇怪为什么读出来放到ramdisk上面  多读几次 然后就会出现MD5sum的结果不同

user: user-1
content: 如果你用软件监控NTFS分区的访问就会发现，$MFT、$BITMAP、$LOG之列的系统文件读写是非常频繁的，一天写成千上万次很正常。Linux的文件系统也应该差不多。

user: user-2
content: dd可能不适用于ramdisk

user: user-1
content: 很正常啊，分区还包括文件访问时间之类的数据，当然可能发生变化。
user-0 提问: 求解答pclint检查文件没关闭的问题

回复:
user: user-1
content: 印象中PCLINT是静态检测C语言语法问题 没有关闭打开的文件属于动态问题，所以检测不出来

user: user-0
content: pclint能检查出内存没释放，能检查出死锁。按理说应该能检查出文件没关闭。
user-0 提问: DOS窗口颜色问题，找不出代码的问题，但编译不出预想的结果

回复:
user: user-1
content: 引用 7 楼 zhao4zhong1 的回复:[quote=引用 6 楼 u010165006 的回复:] [quote=引用 4 楼 zhao4zhong1 的回复:] char cmdstr[40]; ... sprintf("color %c%c",b,w); system(cmdstr);  老赵sprintf目标漏了[/quote] 谢谢斧正！ sprintf(cmdstr,"color %c%c",b,w);[/quote]  什么叫斧正

user: user-2
content: 引用 6 楼 u010165006 的回复:[quote=引用 4 楼 zhao4zhong1 的回复:] char cmdstr[40]; ... sprintf("color %c%c",b,w); system(cmdstr);  老赵sprintf目标漏了[/quote] 谢谢斧正！ sprintf(cmdstr,"color %c%c",b,w);

user: user-2
content: http://www.baike.com/wiki/%E6%96%A7%E6%AD%A3

user: user-0
content: 谢谢大神，我通过你的代码，我已经找到了问题，应该是scanf("%c"),而不是%s，但是会出现识别回车的问题，直接跳到下一个while判断，还有就是system（“”），括号里面只能放color 1A这样的字符串，不能用变量吗？

user: user-2
content: char b, w; /*背景色文字色*/ while (1) {     printf("请输入背景颜色：\n");     rewind(stdin);     scanf("%c", &b);     if (b!='0' && b!='1' && b!='2' && b!='3' && b!='4' && b!='5' && b!='6' && b!='7' ){         printf("背景颜色输入不匹配，请重新输入：\n");     } else break; } while (1) {     printf("请输入文字颜色：\n");     rewind(stdin);     scanf("%c", &w);     if (w!='8' && w!='9' && w!='A' && w!='B' && w!='C' && w!='D' && w!='E' && w!='F'){         printf("文字颜色输入不匹配，请重新输入：\n");     } else break; }

user: user-1
content: 引用 4 楼 zhao4zhong1 的回复:char cmdstr[40]; ... sprintf("color %c%c",b,w); system(cmdstr);  老赵sprintf目标漏了

user: user-2
content: printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。  在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 char c; scanf("%c",&c); //时，都改为 char s[2]; char c; scanf("%1s",s); c=s[0];

user: user-2
content: char cmdstr[40]; ... sprintf("color %c%c",b,w); system(cmdstr);

user: user-3
content: 引用 2 楼 kljj0301 的回复:谢谢大神，我通过你的代码，我已经找到了问题，应该是scanf("%c"),而不是%s，但是会出现识别回车的问题，直接跳到下一个while判断，还有就是system（“”），括号里面只能放color 1A这样的字符串，不能用变量吗？  1、那可以在scanf("%c") 后加上getchar()接收了缓冲区中的换行符  2、 括号里可以用变量
user-0 提问: 32位转换为16进制，怎么解决大数long long int (64位）

回复:
user: user-1
content: char buf[1024]; 	sprintf(buf, "%I64X", 300234062048960ULL);

user: user-0
content: 谢谢大家了！

user: user-2
content: Collapse AllExpand All      Code: All Code: Multiple Code: Visual Basic Code: C# Code: Visual C++ Code: J# Code: JScript   Visual Basic C# Visual C++ J# JScript Run-Time Library Reference  Format Specification Fields: printf and wprintf Functions  See Also  Send Feedback     This topic describes the syntax for format specifications fields, used in printf, wprintf and related functions. More secured versions of these functions are available, see printf_s, _printf_s_l, wprintf_s, _wprintf_s_l. For details on the individual functions, see the documentation for those specific functions. For a complete listing of these functions, see Stream I/O.  A format specification, which consists of optional and required fields, has the following form:  %[flags] [width] [.precision] [{h | l | ll | I | I32 | I64}]type  Each field of the format specification is a single character or a number signifying a particular format option. The simplest format specification contains only the percent sign and a type character (for example, %s). If a percent sign is followed by a character that has no meaning as a format field, the character is copied to stdout. For example, to print a percent-sign character, use %%.  The optional fields, which appear before the type character, control other aspects of the formatting, as follows:  type Required character that determines whether the associated argument is interpreted as a character, a string, or a number (see the "printf Type Field Characters" table in printf Type Field Characters).  flags Optional character or characters that control justification of output and printing of signs, blanks, decimal points, and octal and hexadecimal prefixes (see the "Flag Characters" table in Flag Directives). More than one flag can appear in a format specification.  width Optional number that specifies the minimum number of characters output (see printf Width Specification).   precision Optional number that specifies the maximum number of characters printed for all or part of the output field, or the minimum number of digits printed for integer values (see the "How Precision Values Affect Type" table in Precision Specification).  h| l| ll| I| I32| I64 Optional prefixes to type-that specify the size of argument (see the "Size Prefixes" table in Size and Distance Specification).  Security Note:  Ensure that format specification strings are not user-defined. For example, consider a program that prompts the user to enter his name and stores the input in a string variable called name. To print name, do not do this:     Copy Code  printf( name ); // Danger!  If name contains "%s", program will crash   Note:  Instead, do this:     Copy Code  printf( "%s", name );    See Also Concepts printf, _printf_l, wprintf, _wprintf_l printf_s, _printf_s_l, wprintf_s, _wprintf_s_l printf_p Positional Parameters Send feedback on this topic to Microsoft.
user-0 提问: 关于指向数组的指针动态创建问题

回复:
user: user-1
content: 引用 4 楼 paschen 的回复:因为你这里用到了C99中的变长数组VLA  VS很多C99标准都不支持的，所以VS下目前是没办法的   to 楼主，win下面也可以有GCC的。

user: user-2
content: 因为你这里用到了C99中的变长数组VLA  VS很多C99标准都不支持的，所以VS下目前是没办法的

user: user-3
content: extern "C" { ... }

user: user-0
content: 引用 1 楼 user-4 的回复:C++本来就没有VLA，MSVC也不完全支持C99，所以你这个可能只能改代码了。。 不过Windows下也有GCC吧 代码怎么改，请问

user: user-4
content: C++本来就没有VLA，MSVC也不完全支持C99，所以你这个可能只能改代码了。。 不过Windows下也有GCC吧

user: user-4
content: 引用 2 楼 a130098300 的回复:[quote=引用 1 楼 user-4 的回复:] C++本来就没有VLA，MSVC也不完全支持C99，所以你这个可能只能改代码了。。 不过Windows下也有GCC吧 代码怎么改，请问[/quote]  你可以把指针就当做一个float *，然后要访问比如arr[i][j]的时候用ptr[i * m + j]，其中m是第二维度的大小，相当于自己实现二维数组。。 /* 输出: arr[0][2] = 3.000000 arr[2][1] = 10.000000 */ #include <stdio.h> // float (*ptr)[][m] static float get_value(float *ptr, int m, int i, int j) { 	return ptr[i * m + j]; } static void foo(float *ptr, int n, int m) { 	printf("arr[0][2] = %f\n", get_value(ptr, m, 0, 2)); 	printf("arr[2][1] = %f\n", get_value(ptr, m, 2, 1)); } int main() { 	float arr[3][4] = 	{ 		{1, 2, 3, 4}, 		{5, 6, 7, 8}, 		{9, 10, 11, 12} 	}; 	foo((float *)&arr, 3, 4); }

user: user-3
content: 引用 4 楼 paschen 的回复:因为你这里用到了C99中的变长数组VLA  VS很多C99标准都不支持的，所以VS下目前是没办法的 改为new或malloc
user-0 提问: 二叉树有50个叶子结点，计算度为2的结点

回复:
user: user-1
content: 参考你🐎呢参考，来个文字思路

user: user-2
content: 参考 http://blog.csdn.net/u013227200/article/details/37992463

user: user-3
content: 引用 2 楼 zhujinqiang 的回复:参考 http://blog.csdn.net/u013227200/article/details/37992463

user: user-3
content: 百度搜相关关键字。
user-0 提问: C语言程序数据溢出的问题，求大神解决，急，在线等~

回复:
user: user-1
content: 就像数组是10     你给11个数  肯定溢出啊 数组一定要从0开始

user: user-2
content: 注意检查每个数组在使用过程中是否出现了越界？

user: user-3
content: jds和N什么关系？如果jds大于等于N则一定会越界。第二是不是笔误：为什么是从1开始而不是0，数组下标是0呀

user: user-4
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。
user-0 提问: 本人新手，程序运行出现下面错误该怎么改

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

user: user-2
content: 看起来没什么问题，如果缩进正确的话。 可以看看这个说明 http://stackoverflow.com/questions/25273954/unresolved-external-symbol-report-rangecheckfailure
user-0 提问: 问个数组和指针的问题

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

user: user-2
content: 这个其实就是因为语言就是这么设计的，所以编译器也是这么实现。至于为什么，你可以理解为是先有的指针，之所以要有指针，是因为C语言是面向底层的，有直接操作内存的需要，然后指针是支持p+i这种操作的。后来才有的数值，为什么要有数组，就是因为数组就是一个线性表，编程经常用到，但是如果为数组专门设计一套操作会很复杂，跟C语言的设计理念不符（后来C++把它实现了，就是vector），所以设计者就巧妙的利用了数组和指针的关系，将数组的引用即a[i]这种形式在编译器内部用*(a+i)这种指针的形式实现了，所以a[i] p[i] *(a+i) *(p+i)就可以混着用了，这也使得数组和指针的关系变得异常暧昧，很多人都搞不清楚二者的区别与联系。

user: user-3
content: 首先指针和数组的类型一致，其次，数组也可以理解为指针常量（即不能做左值）

user: user-1
content: A[B] *(A+B) *(B+A) B[A] //以上四行等价  "abc"[1] *("abc"+1) *(1+"abc") 1["abc"] //以上四行等价  A[0] *(A) 0[A] //以上三行等价

user: user-1
content: http://edu.csdn.net/course/detail/2516 C语言指针与汇编内存地址-三.数组和二维数组

user: user-4
content: 你的指针拿到了数组的首地址指针 数组里的元素每个地址都是连续的  所以指针只要拿到首元素的地址就好了 ，p=a 。

user: user-5
content: 数组名字就是一串数据的首地址的名字而已

user: user-6
content: 所有能写做 p[i]的代码 都可以用 *(p+i)代替

user: user-6
content: p[i] 完全等效于 *(p+i) 没有任何区别 不管 p是数组还是指针

user: user-7
content: 指针p拿到的是数组首元素的地址，数组名也会代表数组首元素地址，在一定程度上，通过指针后移便可像数组一样访问元素
user-0 提问: 函数

回复:
user: user-1
content: 参考 http://www.jb51.net/article/37410.htm 参考 http://blog.csdn.net/abcdef8c/article/details/6885624

user: user-2
content: 建议通过实际的小例子，小程序去了解和尝试自己去实现这些函数。 这些函数都是比较常用的函数，建议熟悉并灵活运用。

user: user-3
content: 查MSDN是Windows程序员必须掌握的技能之一。
user-0 提问: 也许是一个简单的问题

回复:
user: user-1
content: 5楼才是正解。

user: user-1
content: 和编译器的命令行参数有关： Windows: cl /? ... /J default char type is unsigned  Linux: gcc -v --help | grep 'signed' g++ -v --help | grep 'signed'

user: user-2
content: http://bbs.csdn.net/topics/380024889  int类型永远跟unsigned int是一样的，这个是C标准定死的。 但是char类型却跟unsigned char不一定是一样的，所以char实际上有三种类型: char, signed char和unsigned char。 char到底是signed char还是unsigned char取决于编译器，不同的编译器可能实现不同。

user: user-3
content: 你想说的是int吧？int和signed int确实是一样的。但是C标准没有规定char和signed char是一样的，取决于实现。

user: user-4
content: 此外，有些环境下，signed char 与 char 可能是不同的类型

user: user-4
content: signed确实是一个比较不常用关键字，但也确实存在，相对于unsigned  signed int 与 int 与 signed 都一个意思
user-0 提问: C语言错误 [Error] expected primary-expression before ')' token

回复:
user: user-1
content: #include <stdio.h> #include <string.h>  int HW(char str[]); int main() {     char str[5][80];     int i, s = 0;      printf("Please enter 5 string:\n");     for (i = 0; i < 5; i++) {         scanf("%s",str[i]);         if(HW(str[i]))             s = s + 1;     }     printf("回文字符串有%d个",s);  }  int HW(char str[]) {     int i;     int L = strlen(str);      for(i = 0; i < L / 2; i++)         if(str[i] != str[L-i-1])             return 0;     return 1; } 问题如下： 1.去掉未使用的变量string 2. 判断回文的函数没问题，但是参数传递错误； 3. 输入函数scanf的参数也有问题； 4. 函数声明不建议放在函数内，建议放在main函数之上。

user: user-0
content: 引用 4 楼 qq_36782456 的回复:你定义的char  string   根本就没用上，  还有  str.  本来就是一个数组名，当传参为str是，代表数组首元素地址( 正确)，  传(*str还可以理解)(*str表示的是首元素地址的值也就是str的值)编主这(str*) 那char string一般是什么时候需要用呢。。

user: user-0
content: 谢谢各位！！！！！

user: user-2
content: 你定义的char  string   根本就没用上，  还有  str.  本来就是一个数组名，当传参为str是，代表数组首元素地址( 正确)，  传(*str还可以理解)(*str表示的是首元素地址的值也就是str的值)编主这(str*)

user: user-3
content: 你这个问题有点多，函数的功能肯定也实现不了，看得出来是新手，还需要多看书啊。 HW(str*)中str*在c里面不是一个正确的表达式，这个应该也是编译器报错的原因，你想传所有的字符串就用str，想传其中一个字符串就用str[i].

user: user-0
content: 引用 1 楼 yeelokchau 的回复:把char string【80】删掉，str*改成str以后就好了，不知道为什么 求大神解答QAQ好迷茫 还在主函数那加了括号

user: user-0
content: 把char string【80】删掉，str*改成str以后就好了，不知道为什么 求大神解答QAQ好迷茫
user-0 提问: 求解

回复:
user: user-1
content: 你的i未初始化，就使用if(i%5==0)，一般是不会得到正确结果的，i是一个栈变量，其初始值是不确定的，因此必须先赋值，再使用

user: user-1
content: 如下编写，就不需要if判断了 #include<stdio.h> int main() { 	int a,b,i; 	for(a=1;a<=4;a++) 	{ 		for(b=1;b<=5;b++) 		{ 			i=a*b; 			printf("%d\t",i); 		} 		printf("\n"); 	} 	return 0; }

user: user-2
content: 引用 5 楼 小弟有礼了的回复:引用 3 楼 xueyings的回复:[quote=引用 2楼我是你的主体 的回复:]那就说明我的那个程序是错的，对吧，但为什么输出却是对的呢我觉得是你的编译器为了防止你使用未使用的变量，做了自动初始化i为ox00000000，之后就正确了，纯属巧合，用的VC？ 第一次if,i初始化为0，输出换行符。接下来的if中的i都是上次内层循环中的a*b,若想判断成功，则上次的b必须为5，输出换行符。刚好符合那个输出。  但是要注意，你的输出第一行是空的[/quote] 建议在if语句前面输出i的值，可以这样写printf("\ni:%d\n",i ) 并且在a*b后也这么写

user: user-2
content: 引用 3 楼 xueyings的回复:引用 2楼我是你的主体 的回复:那就说明我的那个程序是错的，对吧，但为什么输出却是对的呢我觉得是你的编译器为了防止你使用未使用的变量，做了自动初始化i为ox00000000，之后就正确了，纯属巧合，用的VC？ 第一次if,i初始化为0，输出换行符。接下来的if中的i都是上次内层循环中的a*b,若想判断成功，则上次的b必须为5，输出换行符。刚好符合那个输出。  但是要注意，你的输出第一行是空的

user: user-0
content: 这就尴尬了，懂了，用的DC

user: user-3
content: 引用 2楼我是你的主体 的回复:那就说明我的那个程序是错的，对吧，但为什么输出却是对的呢我觉得是你的编译器为了防止你使用未使用的变量，做了自动初始化i为ox00000000，之后就正确了，纯属巧合，用的VC？

user: user-0
content: 那就说明我的那个程序是错的，对吧，但为什么输出却是对的呢

user: user-4
content: 应该是这个意思吧，否则i没有初始化不能取余  #include<stdio.h> int main() { 	int a,b,i; 	for(a=1;a<=4;a++) 		for(b=1;b<=5;b++) 		{ 			i=a*b; 			printf("%d\t",i); 			if(i%5==0) 				printf("\n"); 		} 	return 0; }
user-0 提问: C语言中对离散的数据进行微分

回复:
user: user-1
content: 5000个数据，最小二乘法拟合曲线，平滑的曲线

user: user-1
content: 中值滤波，每n个值取n/2下标的那个值作为当前值，可滤掉最大和最小值

user: user-2
content: Vai=(Vi-1+Vi+Vi+1)/3

user: user-0
content: 引用 4 楼 user-4 的回复:增大采样频率。 频率没有办法再增大了

user: user-2
content: 低通滤波 最小二乘法拟合曲线 ……

user: user-3
content: 离散微分不就是差分? 后项减前项.

user: user-4
content: 增大采样频率。

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:V=dS/dt=(Si+1-Si)/0.1ms 有什么方法可以减小波动的吗

user: user-0
content: 我用这种方法算出来后数据波动比较大 有没有更好的办法来减小这些波动呢

user: user-2
content: V=dS/dt=(Si+1-Si)/0.1ms
user-0 提问: c初学者 简单小问题

回复:
user: user-0
content: 引用 7 楼 lzw2016的回复:内层循环每次b自加，结束后b=5，外层a自减，每次结束后b又从b-a开始内层循环 谢谢了，，，非要十个字

user: user-1
content: 内层循环每次b自加，结束后b=5，外层a自减，每次结束后b又从b-a开始内层循环

user: user-2
content: 引用 4 楼 sinat_37931609 的回复:这么看来b就类似一个函数呀  不影响外部值  我第一次用这个论坛    怎么分配分数呀  点那个东西呀  管理菜单    结帖    发帖    回复    关注

user: user-0
content: for  for   for   打错了

user: user-0
content: 这么看来b就类似一个函数呀  不影响外部值  我第一次用这个论坛    怎么分配分数呀  点那个东西呀

user: user-2
content: 每次 for(b=b-a;b<5;b++) 结束后 b 都等于 5 a = 2 时， b=b-a 是 3

user: user-0
content: 如果赋值了那第一层第二轮开始a=2，b是4，b=b-a后 b=2呀  那应该打印$$$  但第二层打印两个呀

user: user-2
content: 赋值了呀，a=1时，赋值为4，之后依次赋值3, 2, 1, 0, -1
user-0 提问: 关于void *转换为结构体指针的问题

回复:
user: user-0
content: 引用 1 楼 user-1 的回复:. 的优先级比 (type) 更高 所以 (struct names *)p1.first 相当于 (struct names *)(p1.first)  太感谢了，我一直以为强制转换和()是同一个优先级呢，基础还是不牢啊

user: user-1
content: . 的优先级比 (type) 更高 所以 (struct names *)p1.first 相当于 (struct names *)(p1.first)
user-0 提问: 函数怎么返回局部指针？

回复:
user: user-1
content: 错误和malloc应该没有关系 处理字符串一定要注意结束符“\0”

user: user-2
content: malloc后，最好memset一下才保险，否则字符串没有正确的结束符会引发各种问题

user: user-3
content: char *s = (char *)malloc(sizeof(char) * 1024 * numsSize); 没有问题

user: user-4
content: calloc与malloc类似,但是主要的区别是calloc分配的内存空间中存储的值默认为0,使用malloc时,已分配的内存中可以是任意的值. 如果用calloc对，用malloc就不对了，很可能是你没有给字符串一个合适的结束符号'\0'，导致后面的操作越界了

user: user-5
content: 猜测是字符串没有终止符导致某些字符串处理越界

user: user-0
content: char *s=(char *)malloc(sizeof(char)*1024*numsSize); 为什么我把这行改成 char *s=calloc(100,sizeof(char)) 就通过了.....?
user-0 提问: 单链表删除重复元素

回复:
user: user-1
content: 删除单链表的节点，要修改上个节点的next，如果它不为空。 这种东西最好画图，来明确你如何修改，看删除这个节点引发的副作用

user: user-2
content: 小心： 空 全部重复 ……

user: user-3
content: 引用 1 楼 u010808402 的回复:两个问题： 1. 遍历中修改了return pHead，该pHead最终肯定会指向NULL，所以返回值始终为NULL 2. 删除时，应该是前一个元素指向pNext->next，这样才能保持链表节点相互连接  Node *CompareList(Node *pHead)//删除重复元素 { 	if (pHead == NULL) 	{ 		printf("链表为空，无法操作\n"); 		exit(0); 	} 	else 	{ 		Node *pIndex = pHead; 		Node *pPrev; 		Node *pNext; 		while (pIndex != NULL) 		{ 			pPrev = pIndex; 			pNext = pIndex->next; 			while (pNext != NULL) 			{ 				if (pHead->Elem == pNext->Elem) 				{ 					pPrev->next = pNext->next; 					//free(pNext); 				} 				else 				{ 					pPrev = pNext; 				}				 				pNext = pNext->next; 			} 			pIndex = pIndex->next; 		} 	} 	return pHead; } //free是我这边测试时分配在栈上，所以临时mark掉，你要根据你实际情况进行确认

user: user-3
content: 两个问题： 1. 遍历中修改了return pHead，该pHead最终肯定会指向NULL，所以返回值始终为NULL 2. 删除时，应该是前一个元素指向pNext->next，这样才能保持链表节点相互连接  Node *CompareList(Node *pHead)//删除重复元素 { 	if (pHead == NULL) 	{ 		printf("链表为空，无法操作\n"); 		exit(0); 	} 	else 	{ 		Node *pIndex = pHead; 		Node *pPrev; 		Node *pNext; 		while (pIndex != NULL) 		{ 			pPrev = pIndex; 			pNext = pIndex->next; 			while (pNext != NULL) 			{ 				if (pHead->Elem == pNext->Elem) 				{ 					pPrev->next = pNext->next; 					//free(pNext); 				} 				else 				{ 					pPrev = pNext; 				}				 				pNext = pNext->next; 			} 			pIndex = pIndex->next; 		} 	} 	return pHead; }
user-0 提问: C语言如何使用OVERLAPPED进行重叠IO？

回复:
user: user-0
content: 引用 8 楼 Saleayas 的回复:尝试使用 CompletionKey 来判断。只能手动post的时候才能用CompletionKey，然而ReadFileEx函数是没有的

user: user-1
content: 6楼描述的非常清楚了 OVERLAPPED 作为自定义结构体的头是关键， 在IOCP中， 获取自定义数据的时候是使用CONTAINING_RECORD宏来完成 既然是自定义，那自然就可以携带相关信息

user: user-2
content: 尝试使用 CompletionKey 来判断。

user: user-0
content: 引用 6 楼 ananluowei 的回复:c++的做法是用一个类来继承OVERLAPPED，类中添加必要的成员变量。 c的做法是建立一个结构，结构中第一个成员必须是OVERLAPPED，后面添加其他成员。 使用的时候，在send，recv中把类或者结构的指针转变为OVERLAPPED指针。 在完成端口收到OVERLAPPED，把指针转变为类或者结构的指针，就可以判断。利用内存布局…………是个聪明的做法

user: user-3
content: c++的做法是用一个类来继承OVERLAPPED，类中添加必要的成员变量。 c的做法是建立一个结构，结构中第一个成员必须是OVERLAPPED，后面添加其他成员。 使用的时候，在send，recv中把类或者结构的指针转变为OVERLAPPED指针。 在完成端口收到OVERLAPPED，把指针转变为类或者结构的指针，就可以判断。

user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:我想知道汇编是怎么用的，汇编没有继承和派生，怎么办？   面向对象只是一种编程思想。 再抽象的编程语言，最后不都变成汇编代码了吗？我们完全可以说汇编语言是面向对象、脚本化、动态化、泛函化、并行化、分布化的语言。赵老师号被盗了？说的完全不知所谓嘛

user: user-4
content: 我想知道汇编是怎么用的，汇编没有继承和派生，怎么办？   面向对象只是一种编程思想。 再抽象的编程语言，最后不都变成汇编代码了吗？我们完全可以说汇编语言是面向对象、脚本化、动态化、泛函化、并行化、分布化的语言。

user: user-0
content: 自己顶，有什么好办法吗？

user: user-0
content: 引用 1 楼 user-5 的回复:《Windwos核心编程》有详细讲解与例子 《Windwos核心编程》讲的例子两个用法： 1. OVERLAPPED::hEvent保存一个对象的地址。核心编程并没有支持这种用法，只是提到有人这么用。但是，据MSDN所讲，hEvent要么为NULL，要么是合法的由CreateEvent函数创建的Event。私以为自以为聪明的做法并不可取，两千年左右的程序，有些可以顺利跑在Win10，有些不能在Win10上跑就是明证。所以，不宜在hEvent中保存其他指针。 2. 通过继承OVERLAPPED的方式添加其他自定义字段。 可是，我想知道C是怎么用的，C没有继承和派生，怎么办？

user: user-5
content: 《Windwos核心编程》有详细讲解与例子
user-0 提问: 按行读取txt文档并存储

回复:
user: user-0
content: 谢谢楼上几位大神！（不好意思这么晚才回复）

user: user-1
content: 建议使用字符串fgets, strtok_r（字符串分割）

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

回复:
user: user-1
content: #include <stdio.h> #include <stdlib.h>  #define MAXSIZE 10  typedef struct LNode {     float data;     struct LNode *link; }LNode,*LinkList;  void sample(LinkList *L) {     LinkList p;     int i,n;     float a[MAXSIZE];      n = 1;     for (i = 0; i < MAXSIZE; i++) {         scanf("%f", &a[i]);         //a[i] = (i + 1) * 1.1;     }      *L = (LinkList)malloc(sizeof(LNode));     (*L)->link = NULL;     printf("num = %d\n", n);     for(i = 0; i < MAXSIZE; i++)     {         p = (LinkList)malloc(sizeof(LNode));         p->data = a[i];         p->link = (*L)->link; //头插法，倒序         (*L)->link = p;     } }  void print_nodes(LinkList phead) {     LinkList p = phead->link;      while (p) {         printf("data = %0.1f\n", p->data);         p = p->link;     } }   int main(void) {     LinkList phead = NULL;     sample(&phead);     print_nodes(phead);      return 0; }

user: user-0
content: 引用引用 你运行起来不报错吗？

user: user-2
content: 函数定义里多了一个逗号吧，主函数写好了，你自己运行看一下就知道了  #include "stdio.h" #include "stdlib.h" #define MAXSIZE 10 typedef struct LNode { 	float data;//存放数据 	struct LNode *link;//存放下一节点信息指针 }LNode,*LinkList;//定义一个结构体和指向结构体的指针  void sample(LinkList &L) { 	LinkList p;  int i,n;  float a[MAXSIZE]; 	n=1; 	for (i=0;i<MAXSIZE;i++) 	{ 		scanf("%f",&a[i]);//输入10个数值 		if (a[i]<0){n=n+1;a[n]=a[i];} 	} 	L=(LinkList)malloc(sizeof(LNode)); 	L->link=NULL;//初始化链表 	for(i=0;i<=n;i++)//n=6，循环7次 	{ 		p=(LinkList)malloc(sizeof(LNode));//为节点p分配动态空间 		p->data=a[i];  		p->link=L->link; //头插法，倒序 		L->link=p; 	} 	p=L->link; 	while (p) 	{ 		printf("data=%f\n",p->data);  p=p->link;  	} }  int main() { 	LinkList L; 	sample(L); 	//sytem("pause"); 	return 0; }
user-0 提问: 请问这个问题有人会吗？

回复:
user: user-1
content: 仅供参考：//The _getch function reads a single character from the console without echoing. //Function can not be used to read CTRL+Break. //When reading a function key or an arrow key, //_getch must be called twice; the first call returns 0 or 0xE0, //and the second call returns the actual key code. #include <conio.h> #include <windows.h> void main() {     unsigned short k;      while (1) {         Sleep(100);         k=getch();         if (27==k) break;//按Esc键退出         if (0==k||0xe0==k) k|=getch()<<8;//非字符键         cprintf("%04x pressed.\r\n",k);     } }

user: user-0
content: 引用 4 楼 user-3 的回复:[quote=引用 3 楼 amocken 的回复:] [quote=引用 1 楼 user-3 的回复:] kbhit() 函数，虽然不是C标准库中的 #include<stdio.h> #include<conio.h> #include<stdlib.h> int main(void) { char ch; while(ch!=27) { printf("HelloWorld\n"); if(kbhit()) ch=getch(); } printf("End!\n"); system("pause"); return 0; }[/quote] 按提示，加下划线，改成 _kbhit() 和 _getch() 另外，给ch一个初始值，比如 char ch = '\0';[/quote]  可以啦，谢谢

user: user-2
content: 按这错误提示改就是啦，毕竟现在的ide比以前的正经了，严肃啦，对吧

user: user-3
content: 引用 3 楼 amocken 的回复:[quote=引用 1 楼 user-3 的回复:] kbhit() 函数，虽然不是C标准库中的 #include<stdio.h> #include<conio.h> #include<stdlib.h> int main(void) { char ch; while(ch!=27) { printf("HelloWorld\n"); if(kbhit()) ch=getch(); } printf("End!\n"); system("pause"); return 0; }[/quote] 按提示，加下划线，改成 _kbhit() 和 _getch() 另外，给ch一个初始值，比如 char ch = '\0';

user: user-0
content: 引用 1 楼 user-3 的回复:kbhit() 函数，虽然不是C标准库中的 #include<stdio.h> #include<conio.h> #include<stdlib.h> int main(void) { char ch; while(ch!=27) { printf("HelloWorld\n"); if(kbhit()) ch=getch(); } printf("End!\n"); system("pause"); return 0; }

user: user-0
content: 引用 1 楼 user-3 的回复:kbhit() 函数，虽然不是C标准库中的  我试了一下下面这个示例，用vs2017编译发现运行错误，咋回事？

user: user-3
content: kbhit() 函数，虽然不是C标准库中的
user-0 提问: 遇到Compilation Error问题，点开后是这样的？表示看不懂

回复:
user: user-1
content: 偶遇到类似问题都是用 “每次用/*...*/注释掉不同部分再重新编译，直到定位到具体语法出错的位置。” 的方法解决的。

user: user-2
content: http://stackoverflow.com/questions/7663565/error-stray-xxx-in-program-why  尽量重写下报错代码行

user: user-3
content: 知道论坛发帖，应该知道去baidu一下这个错误啊。

user: user-4
content: 检查是否有中文字符
user-0 提问: 关于文件和函数的使用

回复:
user: user-0
content: 真的哎 一直没注意这个问题 谢谢！

user: user-1
content: #include<stdio.h> #include<stdlib.h>  float chin[8],math[8],eng[8],phy[8];  char name[8][32];  void aver() {     float avg[8];     int i;     for(i = 0; i< 8; i++) {         avg[i] = (chin[i] + math[i] + eng[i] + phy[i])/4;         printf("%g\n",avg[i]);     } }  int main() {     int i;     FILE *fp;      fp = fopen("s7-3.txt","w");     if(!fp)     {         printf("can not be open \n");         exit(0);     }      fprintf(fp,"li_ming 89 78 67  67\n");     fprintf(fp,"wang_hui 87  98  86 87\n");     fprintf(fp,"li_li 67  78  69  90\n");     fprintf(fp,"mao_dong 78  86  89 91\n");     fprintf(fp,"zhao_hong 89  90  92 89\n");     fprintf(fp,"zhao_xin 58 82 67 79\n");     fprintf(fp,"jiang_hua 90  92  94  89\n");     fprintf(fp,"liu_wan 78  76  79  78\n");      fclose(fp);      FILE *fp1;     fp1 = fopen("s7-3.txt","r");      for(i = 0; i < 8; i++) {         fscanf(fp,"%s %g %g %g %g\n", name[i], &chin[i], &math[i], &eng[i], &phy[i]);     }      for (i = 0; i < 8; i++) {         fprintf(stdout,"%s %.2f %.2f %.2f %.2f\n", name[i], chin[i], math[i], eng[i], phy[i]);     }     fclose(fp1);      aver();      return 0; } 注意以下几点吧： 1. name需要是二维数组； 2. 数组的长度是8，为啥要用7呢；（从0开始） 3. 读取是注意，什么格式写入的，就什么格式读取。

user: user-2
content: 你用什么的编译器,我试了下用QT没有你说的这种情况。
user-0 提问: C语言之字符指针

回复:
user: user-1
content: 引用 3 楼 starytx 的回复:printf("%s",*p2);没有这个星号，带*号的话表示解引用，简单说就是表示一个字符，而一个字符格式化用的是%c,所以你想显示字符串的话，只需用%s格式化一个字符串的首地址就行了补充一下，你的p2现在已经指向b的结束字符了，所以使用b来显示 printf("%s",b);

user: user-1
content: printf("%s",*p2);没有这个星号，带*号的话表示解引用，简单说就是表示一个字符，而一个字符格式化用的是%c,所以你想显示字符串的话，只需用%s格式化一个字符串的首地址就行了

user: user-2
content: printf("%s",*p2); 改为 printf("%s",b);  此刻的*p2 == '\0' 并且 p2的指向就是字符串b中'\0'的位置 for(;*p1!='\0';p1++,p2++) { *p2=*p1; } *p2='\0';

user: user-3
content: 引用 楼主 qq_36938299 的回复:辣鸡又来提问了。 想实现讲字符串a 复制为字符串b,用a数组初始化，把a数组中的字符逐个复制到b数组中。 我写的代码是， #include<stdio.h> int main() { 	char a[]={"I am a student."},b[20]; 	char *p1,*p2; 	p1=a; 	p2=b; 	for(;*p1!='\0';p1++,p2++) 	{ 			*p2=*p1; 	} 	*p2='\0'; 	printf("%s",*p2); 	return 0; } 感觉没错啊，但是跑出来的时候 打印的是NULL，变成空了是为什么呢？ 循环结束后p2指向了字符串的结尾*p2='\0'; printf("%s",*p2); -> printf("%s",b);即可
user-0 提问: C不用函数原型把直接把函数定义放在main前？

回复:
user: user-1
content: 我也有点纠结这个问题，现在我还是，一前一后写，但原型放在前面实现放在后面的话，如果修改函数原型的时候，就比较麻烦，但看起来比较简洁，如果定义放在前面时候，修改简单，但看起来很累赘。如果，原型在前，实现在后，两者能同步就好了。

user: user-2
content: 主要是防止函数之间相互调用，没有声明就编不下去了，就算没有相互调用，还是要注意写的顺序，这样太累，还不如声明一下，到时侯找地方实现就行了。

user: user-3
content: 没缺点，这只是编程风格的问题  小程序的话我一般也是这样做的

user: user-4
content: 函数在主函数后面定义，如果你在主函数里调用该函数。需要在主函数前声明一下

user: user-5
content: 引用 楼主 qq_38204305 的回复:假设我直接把函数定义放在main之前。我不用函数原型，不把函数定义放在主函数后，这样做有什么缺点？ 缺点就是你必须自己确保你定义的函数在所有被调用的前面 当函数很多时，你自己要维护这个关于顺序的问题 如果涉及两个函数体内存在相互调用的情况，你必须使用函数原型才能解决这个问题，如下  void f1(void) {    f2(); //f2在后面定义，不使用函数原型，你怎么调用 }  void f2(void) {    f1(); //f1在前面定义，没有问题 }

user: user-6
content: 引用 3 楼 qq_38204305 的回复:[quote=引用 1 楼 super_admi的回复:]没有缺点。事实上，大家都是这么干的。  你说的先把函数声明放前面，再写main，最后把函数定义放main后面，其实是很累赘的做法，典型的学院派。  只有一种情况，需要将函数声明放前面，而且是放.h里面：需要导出该函数的时候。 但是编写一个大程序的时候是不是写函数原型好一点？这样从开头就可以看到主函数在写什么了，不是一般都应该从主函数开始读吗？[/quote] 行数较多的程序，前面的函数使用代码折叠就可以了，照样可以从主函数读起~ 话说还是用头文件最简洁~

user: user-0
content: 引用 1 楼 super_admi的回复:没有缺点。事实上，大家都是这么干的。  你说的先把函数声明放前面，再写main，最后把函数定义放main后面，其实是很累赘的做法，典型的学院派。  只有一种情况，需要将函数声明放前面，而且是放.h里面：需要导出该函数的时候。 但是编写一个大程序的时候是不是写函数原型好一点？这样从开头就可以看到主函数在写什么了，不是一般都应该从主函数开始读吗？

user: user-7
content: 不用函数原型？什么意思？ 一般是不论函数还是变量都要遵循一个先声明后使用的原则。 如果函数定义在main之后，那么需要在main前声明。 如果在main函数之前定义，那么不需声明。

user: user-8
content: 没有缺点。事实上，大家都是这么干的。  你说的先把函数声明放前面，再写main，最后把函数定义放main后面，其实是很累赘的做法，典型的学院派。  只有一种情况，需要将函数声明放前面，而且是放.h里面：需要导出该函数的时候。

user: user-9
content: 对阅读代码的人有影响，面向过程的编程一般都是自顶向下的，先main函数，main函数里调用各个模块，main函数下面各个模块的函数，这样思路比较清晰。当然也有自底向上的。

user: user-10
content: 缺点就是万一你忘记把函数定义放在函数调用之前，又没有注意编译器警告的话，可能会隐式声明函数吧。。
user-0 提问: 改错

回复:
user: user-1
content: #include <stdio.h>  void strc(char* s, char* t);  int main(void) {     char s[80], t[80];      gets(t);     gets(s);     strc(s, t);     puts(t);      return 0; }  void strc(char* s, char* t) {     while(*t != '\0')     {         t++;     }      while(*t++ = *s++)     {     } }

user: user-2
content: #include <stdio.h>  void strc(char *s, char *t);  int main(void) {     char s[80], t[80];      gets(s);     gets(t);     strc(s,t);     puts(t);      return 0;  } void strc(char *s, char *t) {     while(*t)         t++;      while(*t++ = *s++)         ; } 函数strc参数类型不对；另外，建议使用fgets替换gets，以提高数据的安全性。
user-0 提问: VS2010代码可以导入VC6.0么

回复:
user: user-1
content: 为什么不先尝试一下呢？如果有问题再解决问题。 对于是否可行直接应用，我持怀疑的态度。

user: user-2
content: 代码段基本上是通用的    只要你创建对应的c工程或者c+
user-0 提问: 关于找图函数的错误代码不知道该如何修改

回复:
user: user-0
content: ]自己以解决，但是出现新的问题就是找图不太准确，图片只在左上角准确，其他地方不行，

user: user-0
content: 经过分析可能是这个函数的代码有错误，但不知道该如何修改FindBmpBuf，循环太多，代码有点看不懂，
user-0 提问: 求大神看一下代码

回复:
user: user-1
content: if((s=fopen(argv[1],"rb"))=NULL) { fprintf(stderr,"Can't open %s",argv[1]); exit(EXIT_FAILURE); } if((c=fopen(argv[2],"wb"))=NULL) { fprintf(stderr,"Can't open %s",argv[2]); exit(EXIT_FAILURE); } 少写了一个=,你这里就是直接把NULL赋值给了s 添上去试试

user: user-2
content: #include<stdio.h> #include<stdlib.h>  #define STRLEN 21  int main(int argc,char *argv[]) {     FILE *s, *c;     int ch;      if(argc <= 2)     {         fprintf(stderr,"Usage: %s filename\n", argv[0]);         exit(EXIT_FAILURE);     }      if((s = fopen(argv[1],"rb")) == NULL)     {         fprintf(stderr,"Can't open %s", argv[1]);         exit(EXIT_FAILURE);     }     if((c = fopen(argv[2],"wb")) == NULL)     {         fprintf(stderr,"Can't open %s",argv[2]);         exit(EXIT_FAILURE);     }      while((ch=getc(s))!=EOF)         putc(ch,c);      /*     if(fclose(s)!=0||fclose(c)!=0)         fprintf(stderr,"Error in closing files\n");     */     fclose(s);     fclose(c);      return 0; } 注意打开文件时的判断，你用的是=（赋值），而不是判断 ==
user-0 提问: 关于多线程、进程间通讯的问题

回复:
user: user-1
content: 发错地方了。。

user: user-1
content: 1000个设备总是在线？

user: user-1
content: 资源有可能不释放呗

user: user-2
content: DOS现在不太用了吧

user: user-3
content: 引用 10 楼 cfjtaishan 的回复:[quote=引用 9 楼 zhao4zhong1 的回复:] [quote=引用 8 楼 cfjtaishan 的回复:] [quote=引用 7 楼 zhao4zhong1 的回复:] [quote=引用 6 楼 cfjtaishan 的回复:] 除了资源不能正常释放之外，数据也不能通信了，如果crash的线程正好是数据处理的一部分，那么可能导致整个程序不能正常有序的运行，起码数据是不会正常了。 这儿的系统应该是程序系统，程序系统一定会受影响的。 对于操作系统而言，不会因为一个用户线程或者进程导致操作系统crash的 你的潜台词是不是说DOS不是操作系统？[/quote] 没说不是，dos现在也是操作系统里一个小系统了。[/quote] 但DOS会因为一个用户进程导致操作系统crash的。[/quote] 还有这事，DOS还不够稳定呗[/quote] 应该说不够成熟。

user: user-4
content: 引用 9 楼 zhao4zhong1 的回复:[quote=引用 8 楼 cfjtaishan 的回复:] [quote=引用 7 楼 zhao4zhong1 的回复:] [quote=引用 6 楼 cfjtaishan 的回复:] 除了资源不能正常释放之外，数据也不能通信了，如果crash的线程正好是数据处理的一部分，那么可能导致整个程序不能正常有序的运行，起码数据是不会正常了。 这儿的系统应该是程序系统，程序系统一定会受影响的。 对于操作系统而言，不会因为一个用户线程或者进程导致操作系统crash的 你的潜台词是不是说DOS不是操作系统？[/quote] 没说不是，dos现在也是操作系统里一个小系统了。[/quote] 但DOS会因为一个用户进程导致操作系统crash的。[/quote] 还有这事，DOS还不够稳定呗

user: user-3
content: 引用 8 楼 cfjtaishan 的回复:[quote=引用 7 楼 zhao4zhong1 的回复:] [quote=引用 6 楼 cfjtaishan 的回复:] 除了资源不能正常释放之外，数据也不能通信了，如果crash的线程正好是数据处理的一部分，那么可能导致整个程序不能正常有序的运行，起码数据是不会正常了。 这儿的系统应该是程序系统，程序系统一定会受影响的。 对于操作系统而言，不会因为一个用户线程或者进程导致操作系统crash的 你的潜台词是不是说DOS不是操作系统？[/quote] 没说不是，dos现在也是操作系统里一个小系统了。[/quote] 但DOS会因为一个用户进程导致操作系统crash的。

user: user-4
content: 引用 7 楼 zhao4zhong1 的回复:[quote=引用 6 楼 cfjtaishan 的回复:] 除了资源不能正常释放之外，数据也不能通信了，如果crash的线程正好是数据处理的一部分，那么可能导致整个程序不能正常有序的运行，起码数据是不会正常了。 这儿的系统应该是程序系统，程序系统一定会受影响的。 对于操作系统而言，不会因为一个用户线程或者进程导致操作系统crash的 你的潜台词是不是说DOS不是操作系统？[/quote] 没说不是，dos现在也是操作系统里一个小系统了。

user: user-3
content: 引用 6 楼 cfjtaishan 的回复:除了资源不能正常释放之外，数据也不能通信了，如果crash的线程正好是数据处理的一部分，那么可能导致整个程序不能正常有序的运行，起码数据是不会正常了。 这儿的系统应该是程序系统，程序系统一定会受影响的。 对于操作系统而言，不会因为一个用户线程或者进程导致操作系统crash的 你的潜台词是不是说DOS不是操作系统？

user: user-4
content: 除了资源不能正常释放之外，数据也不能通信了，如果crash的线程正好是数据处理的一部分，那么可能导致整个程序不能正常有序的运行，起码数据是不会正常了。 这儿的系统应该是程序系统，程序系统一定会受影响的。 对于操作系统而言，不会因为一个用户线程或者进程导致操作系统crash的

user: user-3
content: 百度搜相关关键字。

user: user-5
content: 无论是线程还是进程crash了，如果异常没被处理，整个进程都会crash掉  对系统影响就可能资源不能得到正常释放