Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 移位运算问题

回复:
user: user-1
content: int i= 16982； int k = i >> 9; int j = i & ((1<<9)-1);

user: user-2
content: 直接低9位与1相与，其他位与0相与，就像@turingo写的 : int j = i * 0x1ff

user: user-3
content: int i = 16982; /* 这样j=001010110 */ int j = i & 0x1ff; /* 这样k=100001 */ int k = i >> 9;  引用 楼主 sanshao1314 的回复:各位好，对于移位运算弱弱的问个问题。    比如一个整形    int i= 16982；    它的二进制：100001001010110    int k = i >> 9;    这个时候得到的就是：100001 = 32；    我要问的就是我如何得到被移位掉的数呢，这里就是001010110被移位掉了，我想得到这个数不知道怎么操作，望各位指点一二。

user: user-4
content: 新手也来学习啊

user: user-5
content: 100001 = 33!! 这和小学学过的求余数道理是一样的，被除数=除数*商+余数。此处为： 16982=33*（2^9）+ X。 这个问题，还可以将16982左移（16-9）位后，再右移回来就得到了你要的数了，高位的 100001 在运算中被截掉了。

user: user-0
content: 十分感谢各位的帮助，谢谢。
user-0 提问: 四柱汉诺塔问题

回复:
user: user-0
content: 3Q!后来老师讲了，思想懂了，程序还是编不出来！

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

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

user: user-3

user: user-4
content: 汉诺塔问题,是理解递归的最佳案例  // Hanoi.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <iostream> #include <windows.h> #include <fstream> using namespace std; ofstream file; #define OUTPUTRESULT cout //把n个盘子,从A,借助B,C,移动到Dest //把盘子从上到下,从1至N进行编号 void hanoi(int n,char A,char B,char C,char Dest ){ 	if(n==1) 	{OUTPUTRESULT<<"[ "<<n<<" ]"<<A<<"->"<<Dest<<endl;return;} 	//先把n-1个盘子,从A,借助B,Dest,移动到C 	hanoi(n-1,A,B,Dest,C); 	//再把第n个盘子,从A直接移动到Dest 	OUTPUTRESULT<<"[ "<<n<<" ]"<<A<<"->"<<Dest<<endl; 	//然后再把上面放在C上面的盘子,借助于A,B,移动到Dest. 	hanoi(n-1,C,A,B,Dest); } int _tmain(int argc, _TCHAR* argv[]) { 	file.open("c:/han.txt"); 	hanoi(4,'A','B','C','D'); 	system("pause"); 	return 0; }   用递归来表达,整个的函数的主义是十分的流畅
user-0 提问: C语言菜鸟问题

回复:
user: user-1
content: 用那个库函数创建 文件？google!

user: user-2
content: 加一次判断 文件不存在，就open失败，进入判断然后提示用户是否创建，是的话，重新open一次，加上 O_CREAT

user: user-3
content: 输入确认，if判断？

user: user-4
content: 楼主你是使用 CreateFile 自己创建吗？还是你是在 MFC 中写的程序？  如果是 CreateFile的话，你自己加判断语句就可以判断的呀。
user-0 提问: 数组与随机数问题

回复:
user: user-1
content: 自行输入百位大数？你想每次调试都敲几百次键盘吗？

user: user-2
content: 一个种子可以得到一个序列 一个序列可以源源不断产生随机数

user: user-3
content: LZ随机函数会调用不？ 给你一个数组依次置数组的每个元素会不？

user: user-4
content: 楼上说的很清楚了。补充下为什么要用数组： 因为你用unsigned int型做数据的话，那么他只能表示（-2^31 -- 2^31-1）这么大的数据long long 也是有局限的，达不到你想要的（大数）精度，多以借助“数组”来模拟大数，例如int a[] = {1,2,3} 可以表示123.这样就不会有精度的限制了。

user: user-5
content: 这就是产生随机数的原理 你看看还有什么不明白的地方

user: user-5
content: #include <stdio.h> #include <time.h>  int main() { 	int a[100], i; 	// 设置随机函数的种子  	srand(time(NULL)); 	for(i = 0; i < 100; i++) 	{ 		// 最高位不能为零  		// rand()%max ： 表示产生的随机数在0~max 之间  		if(i == 0){  			a[i] = rand()%10; 			while(a[i]==0) 				a[i] = rand()%10; 		}else { 	  			a[i] = rand()%10; 		}  	} 	for(i = 0; i < 100; i++) 		printf("%d", a[i]); 	return 0; }

user: user-6
content: google 大数运算
user-0 提问: 关于malloc的出现非内存空间不足的问题

回复:
user: user-0
content: 引用 2 楼 user-1 的回复:filelist[filecount][len + 1] = '\0'; 越界了，应该是 filelist[filecount][len] = '\0'; 额，谢了！

user: user-1
content: filelist[filecount][len + 1] = '\0'; 越界了，应该是 filelist[filecount][len] = '\0';

user: user-0
content: #include "header.h" #include <sys/stat.h> #include <sys/types.h> #include <dirent.h> #include <string.h>  char* filelist[]; int filecount = 0;  int listfile(char *pathname){  	if (pathname == NULL) 		return -1; 	struct stat statbuf; 	struct dirent *dirp; 	DIR *dp; 	char dir[256];  	if ((dp = opendir(pathname)) == NULL){ 		fprintf(stderr, "can not open directory: %s\n",pathname); 		return -1; 	} 	while ((dirp = readdir(dp)) != NULL){ 		snprintf(dir,256, "%s/%s", pathname, dirp->d_name); 		lstat(dir, &statbuf); 		if (S_ISDIR(statbuf.st_mode)){ 			if (strcmp(".", dirp->d_name) == 0 || strcmp("..", dirp->d_name) == 0) 				continue; 			listfile(dir); 		} 		else { 			if (S_ISREG(statbuf.st_mode)){ 				char *p; 				int len; 				if ((p = strrchr(dirp->d_name, '.')) != NULL) 					if (strcmp(p, ".h") == 0 || strcmp(p, ".c") == 0) { 						len = strlen(dir); 						if ((filelist[filecount] = (char *)malloc(len + 1)) == NULL){ 							printf("dynamic memory overflow\n"); 							return -1; 						} 						p = filelist[filecount]; 						strncpy(p, dir, len); 						filelist[filecount][len + 1] = '\0'; 						filecount++; 						printf("%d\n",filecount); 					} 			} 		} 	} 	closedir(dp); 	return 0; }  int main(void){ 	listfile("/home/shuxiang/nginx/src"); 	int i; 	printf("%d\n",filecount); 	for (i = 0; i < filecount; i++){ 		printf("%s\n",filelist[i]); 		free(filelist[i]); 	} 	return 0; }
user-0 提问: LINUX抓狂问题

回复:
user: user-0
content: 感谢各位  按大家说的已经解决

user: user-1
content: fflush(stdout)

user: user-2
content: 引用 4 楼 SKATE11 的回复:引用 1 楼 adlay 的回复:标准输出有缓冲的, 后面加一句 fflush(stdout); 来冲刷一下吧不行啊  要是我去掉select的那段操作fprintf(stdout, "server:")才能在正常时间输出。 不然会在整段程序执行完才显示出来 #include <sys/select.h> #include <stdio.h> #include <stdlib.h> #include <sys/time.h> #include <unistd.h>  int main(){ 	char sendbuf[1024]; 	struct timeval tv; 	fd_set readfds; 	tv.tv_sec=10; 	tv.tv_usec=500000; 	FD_ZERO(&readfds); 	FD_SET(0, &readfds);  	fprintf(stdout, "server:"); //	fflush(stdout);  	select(0+1, &readfds, NULL, NULL, &tv); 	if(FD_ISSET(0, &readfds)){ 		gets(sendbuf); 	} 	else 	{ 		printf("Time out .\n"); 	}  	return 0; }   gcc试了下 加上fflush(stdout);  应该是没问题的 # ./a.out  server:Time out .  不加的话就会后输出，符合上面说的 # ./a.out  test server:[root@dc-work workspace]#   不知到楼主是什么编译器

user: user-0
content: 引用 1 楼 adlay 的回复:标准输出有缓冲的, 后面加一句 fflush(stdout); 来冲刷一下吧不行啊  要是我去掉select的那段操作fprintf(stdout, "server:")才能在正常时间输出。 不然会在整段程序执行完才显示出来

user: user-2
content: 上面两位说的对，是有缓冲滴，默认是行缓冲，碰到‘\n’或者缓冲区满了才输出 要么如第一位说的用fflush(stdout)， 强制输出缓冲区的 或者每次输出后面加'\n',也是可以的

user: user-3
content: fprintf(stdout, "server:")加个回车看看，标准IO是带缓冲的。

user: user-4
content: 标准输出有缓冲的, 后面加一句 fflush(stdout); 来冲刷一下吧
user-0 提问: Microsoft Visual C++ 2010 问题

回复:
user: user-1
content: #include "ex1-2-2.c" 跟 #include <ex1-2-2.c>  分別很大!  後者是在系統目錄中找檔案 前者是在目前目錄中找檔案,有需要能直接加上確實地扯

user: user-2
content: 文件扩展名应该是CPP

user: user-3
content: #include "ex1-2-2.c"把对应文件的所有内容拷贝到了ex1-2.c里面了，ex1-2-2.c里的内容在工程里面有两份了，链接的时候当然会报错了，因为在ex1-2.c和ex1-2-2.c都找到了相同的名字。最好不要包含源文件，如果你要调ex1-2-2.c的函数，可以把函数原型和变量声明放在ex1-2-2.h里，然后包含.h文件就可以了。

user: user-4
content: 引用 5 楼 yinan9 的回复:[quote=引用 2 楼 derekrose 的回复:] #include "ex1-2-2.c" 试试  谢谢！改成“”就没有这个问题了 但是出现了fatal error LNK1169: 找到一个或多个多重定义的符号 这个错误，但是却没有提示什么重复符号。 [/quote]  那是其他问题 重复定义的问题

user: user-0
content: 引用 2 楼 derekrose 的回复:#include "ex1-2-2.c" 试试  谢谢！改成“”就没有这个问题了 但是出现了fatal error LNK1169: 找到一个或多个多重定义的符号 这个错误，但是却没有提示什么重复符号。

user: user-5
content: 你要吓死人啊   引用源文件。。。

user: user-6
content: C文件也需要include吗，没必要吧。

user: user-4
content: #include "ex1-2-2.c" 试试

user: user-0
content: 请大家帮忙看下
user-0 提问: c语言指针问题

回复:
user: user-1
content: int i = 100; 内存中有一个变量i，它的值是100 void* pvoid = &i; 内存中有一个指针pvoid，它指向变量i即它的值是i的地址，不关心它指向变量的类型 char* array = malloc(5*sizeof(void*)); 在内存中申请一段空间，大小为5*sizeof(void*)这么大，将地址保存到指针array，并声称指针array指向的数据为char类型  ((void **)array)[0] = pvoid; 首先，将array强制转换为void **类型的临时指针，也就是认为这个指针指向void*类型的数据，然后执行[0]操作，也就是获取这个指针指向的第0个数据，这个数据是void*类型，可以和pvoid相互赋值 ((void *)array)[0]; 首先，将array强制转换为void *类型的临时指针，也就是认为这个指针指向void类型的数据——void代表只记录地址不关心类型，因此这个指针不能执行*和[]操作，因为该操作获得的数据没有类型不能存在。因此该表达式非法。
user-0 提问: 关于for循环的问题，求指导

回复:
user: user-1
content: for( int i = 0; ; ); 这种在for循环中定义变量的行为，c语言直到c99标准才允许。但微软的VC把主要精力放在C++编译器上，C编译器一直停留在“只支持部分c99语法”的程度。 在其他跟随标准更新的C语言编译器中，以及任何C++编译器中，这种写法都是允许的。就不知道楼主记得的是哪个编译器了。

user: user-0
content: 奥，明白了，谢谢。我可能是和C#里的搞混掉了

user: user-2
content: C语言中变量的声明和定义必须放在操作语句之前
user-0 提问: define函数-如何处理多参数?

回复:
user: user-1
content: C++的 var开头的一个啥可以支持不定的参数，楼上的那种如果是2参数转3参数咋个办，编译不过的

user: user-2
content: #define fun1 fun2 不就行了么

user: user-1
content: 你还可以做成自己解析字符串的形式，参照sprintf,  "%d%f"后面可以自己跟一个自定义结束

user: user-1
content: 这个要看你的3个参数是如何来的，如果是写死的，可以用宏定义，如果是动态的，要麻烦些，比如根据啥接口计算的，网络协议传的.==  #ifdef _a #define _XX_(A,B)  fun1(A) #else #define _XX_(A,B)   fun1(A,B) #endif

user: user-0
content: 引用 1 楼 ggglivw 的回复:#ifdef _a #define fun1(x) fun2(X,x) #else #define fun1(x,y) fun2(X,x,y) #endif  调用处也加上条件编译  每个地方都加条件么? 这样就不符合预定义的初衷了?

user: user-1
content: #ifdef _a #define fun1(x) fun2(X,x) #else #define fun1(x,y) fun2(X,x,y) #endif  调用处也加上条件编译
user-0 提问: 程序调用堆栈查找出现如下问题，求大侠指导，不胜感激啊

回复:
user: user-1
content: Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。

user: user-2
content: ASSERT宏使用是否正确？！ m_hObject如果不为空，就终止程序 否则就继续执行？？？
user-0 提问: 这段代码编译连接都成功，可是运行时没反应啊

回复:
user: user-0
content: 引用 5 楼 caozhy 的回复:[quote=引用 4 楼 qq921965140 的回复:] [quote=引用 3 楼 caozhy 的回复:] [quote=引用 2 楼 qq921965140 的回复:] [quote=引用 1 楼 caozhy 的回复:] 运行没有反应分两种：一种程序运行完了没有输出，说明没有走到有输出的代码分支。还有就是程序没完没了，那就是有死循环。  调试下就知道了。能帮我看看那出错吗？看了快一个小时啦也没看出哪里错了[/quote] 调试会么，一行一行单步运行。[/quote]我还是菜鸟，不会啊！[/quote] 学会调试比学会写成程序更重要。[/quote]说的很对，明天我就去学调试。

user: user-0
content: 引用 6 楼 max_min_ 的回复: void CreateList(LinkList & L, int n)  {          int i;     L=(LinkList)malloc(sizeof(LNode));     L->next=NULL;       for(i=n;i>0;--i)  {      LinkList p;     p=(LinkList)malloc(sizeof(LNode));     printf("input a char: ");//加一句这个吧！看是不是需要在等待用户输入了呢！     scanf("%c",&(p->data));        p->next=L->next;     L->next=p;       getchar(); //吃掉输入的回车符 } } 真的成功了！好鸡冻！太谢谢啦！送分！不过这里为什么要吃掉回车符啊？

user: user-1
content: void CreateList(LinkList & L, int n)  {          int i;     L=(LinkList)malloc(sizeof(LNode));     L->next=NULL;       for(i=n;i>0;--i)  {      LinkList p;     p=(LinkList)malloc(sizeof(LNode));     printf("input a char: ");//加一句这个吧！看是不是需要在等待用户输入了呢！     scanf("%c",&(p->data));        p->next=L->next;     L->next=p;       getchar(); //吃掉输入的回车符 } }

user: user-2
content: 引用 4 楼 qq921965140 的回复:[quote=引用 3 楼 caozhy 的回复:] [quote=引用 2 楼 qq921965140 的回复:] [quote=引用 1 楼 caozhy 的回复:] 运行没有反应分两种：一种程序运行完了没有输出，说明没有走到有输出的代码分支。还有就是程序没完没了，那就是有死循环。  调试下就知道了。能帮我看看那出错吗？看了快一个小时啦也没看出哪里错了[/quote] 调试会么，一行一行单步运行。[/quote]我还是菜鸟，不会啊！[/quote] 学会调试比学会写成程序更重要。

user: user-0
content: 引用 3 楼 caozhy 的回复:[quote=引用 2 楼 qq921965140 的回复:] [quote=引用 1 楼 caozhy 的回复:] 运行没有反应分两种：一种程序运行完了没有输出，说明没有走到有输出的代码分支。还有就是程序没完没了，那就是有死循环。  调试下就知道了。能帮我看看那出错吗？看了快一个小时啦也没看出哪里错了[/quote] 调试会么，一行一行单步运行。[/quote]我还是菜鸟，不会啊！

user: user-2
content: 引用 2 楼 qq921965140 的回复:[quote=引用 1 楼 caozhy 的回复:] 运行没有反应分两种：一种程序运行完了没有输出，说明没有走到有输出的代码分支。还有就是程序没完没了，那就是有死循环。  调试下就知道了。能帮我看看那出错吗？看了快一个小时啦也没看出哪里错了[/quote] 调试会么，一行一行单步运行。

user: user-0
content: 引用 1 楼 caozhy 的回复:运行没有反应分两种：一种程序运行完了没有输出，说明没有走到有输出的代码分支。还有就是程序没完没了，那就是有死循环。  调试下就知道了。能帮我看看那出错吗？看了快一个小时啦也没看出哪里错了

user: user-2
content: 运行没有反应分两种：一种程序运行完了没有输出，说明没有走到有输出的代码分支。还有就是程序没完没了，那就是有死循环。  调试下就知道了。
user-0 提问: 负数补码最高位是否可以为0

回复:
user: user-1
content: 1）用加法计算减法；那么只需要加法器的硬件实现，就可以同时计算加减法。 2）正数和负数，可以使用同一个方式，计算加减法；那么就不需要分别实现两套加法器了。

user: user-1
content: 补码数表示的好处。 是可以统一整数的加减法。 包括 1）可以用加法计算减法。 2）正数和负数，可以使用同一个方式，计算加减法。

user: user-1
content: 补码，有两种含义 一：补码编码 原码的编码方式是，不变。 反码的编码方式是，原码按位取反。 补码的编码方式，是反码加一。  二：   补码数，用来表示有符号整数。   0和正数的编码是原码。   负数的编码，是该数的绝对值的补码。   这样的表示方式，就是补码数表示。  C，C++有符号整数，就是整数的补码数表示。 C，C++无符号整数，就是整数的原码表示。  绝对值最大的负数，有点特殊，它的补码表示，就是他的绝对值（的无符号表示） 它取反+1 的结果，还是它本身。

user: user-2
content: 最高位是1才是用来表示负数的呀 就拿8位二进制来说吧.总共可表示256个数. 正数的范围是:0至127 共128个数 负数的范围是:-128至-1 共128个数  你看正负数的范围是对称的,数学之美.

user: user-3
content: 不可以

user: user-4
content: 你说的D8H是负数，那它必定是8位了。然后你取反又拿他当16位的弄，显然问题很大。 不喜欢补码这种概念，其实就是数字循环翻转的问题，弄出一个补码反码，反而把本来可以很简单描述的问题搞复杂了。

user: user-1
content: 8Bits: +0 =0 //-0 ,不存在,用来表示-128了

user: user-1
content: 8Bits -128 是一个负数,除此之外的负数,都比较好处理.

user: user-5
content: 说错了，你的问题是另一个问题，你举得例子是8位数的情况下的事。 那么我先以16位来举例，也就是D8H=0000 0000 1101 1000，那么取反后是1111 1111 0010 0111，然后+1 变成了1111 1111 0010 1000，这个没什么问题吧。 然后再说说8位的情况下，8位以unsigned来说，值是从0000 0000到1111 1111，也就是0-255，共256个数，但如果是有符号数那么整数就不可能那么多了，因为最高位是符号位，所以正整数是0000 0000 - 0111 1111也就是0 - 127，而负整数则是1000 0000 - 1111 1111 也就是-128 — -1，这样总共是256个数。而你举得D8，本身就是216超过了8位正整数最大值127了，所以已经是个负数了，你所说的是不成立的。

user: user-5
content: 你想多了，取反的时候符号位是不变的，剩余位数取反+1

user: user-6
content: d8h  =00000000 11011000 -d8h =11111111 00100111+1 = 11111111 00101000  如果只是一字节的话,存不了小于-127的负数,d8h是216
user-0 提问: 程序无法完全运行，求指教

回复:
user: user-1
content: a = getchar();  改为：  clearerr( stdin ); while( ( a = getchar() ) == '\n' );

user: user-0
content: 引用 1 楼 user-2 的回复:跟踪下，看看为何退出怎么追踪  每个指令结尾都是return 但运行完之后不会return只会退出

user: user-2
content: 跟踪下，看看为何退出
user-0 提问: 圆环上数字移位

回复:
user: user-1
content: 引用 2 楼 qq921965140 的回复:[quote=引用 1 楼 shangyu0801 的回复:] 仿照代码如下: (m - 65 +26-3)%26 + 65 带入测试：(65 - 65 + 23 )%26 +65 =88正确大神，你是怎么想出来的？膜拜膜拜！分全送你！[/quote] 额，呵呵，不敢当啊，跟数学题一样，多做些就熟悉了。

user: user-0
content: 引用 1 楼 shangyu0801 的回复:仿照代码如下: (m - 65 +26-3)%26 + 65 带入测试：(65 - 65 + 23 )%26 +65 =88正确  [quote=引用 1 楼 shangyu0801 的回复:] 仿照代码如下: (m - 65 +26-3)%26 + 65 带入测试：(65 - 65 + 23 )%26 +65 =88正确[/1uote]能告诉我你是怎么想出来的吗？

user: user-0
content: 引用 1 楼 shangyu0801 的回复:仿照代码如下: (m - 65 +26-3)%26 + 65 带入测试：(65 - 65 + 23 )%26 +65 =88正确大神，你是怎么想出来的？膜拜膜拜！分全送你！

user: user-1
content: 仿照代码如下: (m - 65 +26-3)%26 + 65 带入测试：(65 - 65 + 23 )%26 +65 =88正确
user-0 提问: 逆位序建立单链表

回复:
user: user-0
content: 引用 7 楼 shangyu0801 的回复:malloc分配的空间，在不用的时候必须要free掉。 代码参考： LinkList p = L->next ; while(p!= NULL){     L->next=p->next;     free(p);     p = L->next; }能顺带帮我看看这道题吗？发了半天没人回答。http://bbs.csdn.net/topics/390651239

user: user-1
content: malloc分配的空间，在不用的时候必须要free掉。 代码参考： LinkList p = L->next ; while(p!= NULL){     L->next=p->next;     free(p);     p = L->next; }

user: user-0
content: 引用 4 楼 qq921965140 的回复:[quote=引用 3 楼 user-2 的回复:] LinkList难不成是个指针？是的typedef struct  LNode {       char      data;  // 数据域       struct LNode   *next;  // 指针域    } LNode, *LinkList; [/quote]能顺带帮我看看这道题吗？发了半天没人回答。http://bbs.csdn.net/topics/390651239

user: user-0
content: 引用 3 楼 user-2 的回复:LinkList难不成是个指针？http://http://bbs.csdn.net/topics/390651239 能顺带帮我看看这道题吗？发了半天没人回答。

user: user-0
content: 引用 3 楼 user-2 的回复:LinkList难不成是个指针？是的typedef struct  LNode {       char      data;  // 数据域       struct LNode   *next;  // 指针域    } LNode, *LinkList;

user: user-2
content: LinkList难不成是个指针？

user: user-0
content: 引用 1 楼 user-2 的回复:LinkList p;      p = (LinkList) malloc (sizeof (LNode));   这个写法不对吧？ 引用 1 楼 user-2 的回复:LinkList p;      p = (LinkList) malloc (sizeof (LNode));   这个写法不对吧？哪里不对啦，很对啊

user: user-2
content: LinkList p;      p = (LinkList) malloc (sizeof (LNode));   这个写法不对吧？
user-0 提问: 堆损坏，求解释

回复:
user: user-1
content: 引用 6 楼 u010749411 的回复:[quote=引用 5 楼 zhao4zhong1 的回复:] 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。  [/code] 调试的时候一点问题都没有怎么办？[/quote] Win XP： drwtsn32 -i 运行你的程序 drwtsn32  Win7： http://www.nirsoft.net/utils/app_crash_view.html

user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。  [/code] 调试的时候一点问题都没有怎么办？

user: user-1
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。  判断是否越界访问，可以在数组的最后一个元素之后对应的地址处设置数据读写断点。如果该地址对应其它变量干扰判断，可将数组多声明一个元素，并设置数据读写断点在该多出元素对应的地址上。 #include <time.h> #include <stdlib.h> #include <windows.h> int main() {     int a,b[11];//本来是b[10]，为判断哪句越界，故意声明为b[11]      srand((unsigned int)time(NULL));//按两次F11，等黄色右箭头指向本行时，调试、新建断点、新建数据断点，地址：&b[10]，字节计数：4，确定。     while (1) {//按F5，会停在下面某句，此时a的值为10，b[10]已经被修改为对应0..4之一。         b[(a=rand()%11)]=0;         Sleep(100);         b[(a=rand()%11)]=1;         Sleep(100);         b[(a=rand()%11)]=2;         Sleep(100);         b[(a=rand()%11)]=3;         Sleep(100);         b[(a=rand()%11)]=4;         Sleep(100);     }     return 0; }

user: user-0
content: 引用 3 楼 Adol1111 的回复:原因很多，比如你的指针访问了越界（可能使用时没什么问题），让系统误认为该空间属于malloc的空间，然后当你free这个指针的时候，实际上释放了一块未分配的空间，就导致堆破坏了。 如下代码：int main() { 	int ** p1=(int**)malloc(sizeof(int)*10); 	int *p2=(int *)malloc(sizeof(int)); 	p1[10]=p2;//访问越界 	free(p1);//误以为p1[10]也是malloc地址，一起释放，导致free了无效空间造成堆破坏 	return 0; }  for( i = 2; i < list[0].data; i++,x++) // list[0].data 的值 = 数据总数+1 //越界访问应该是没有的，要是越界访问，调试的时候应该会出错。。不过你说的第二点， //我感觉比较像出错原因。。。考虑到p1[10]=p2;//访问越界  不会发生。。 //就不太清楚了，我再看一下。。。多谢提示

user: user-2
content: 原因很多，比如你的指针访问了越界（可能使用时没什么问题），让系统误认为该空间属于malloc的空间，然后当你free这个指针的时候，实际上释放了一块未分配的空间，就导致堆破坏了。 如下代码：int main() { 	int ** p1=(int**)malloc(sizeof(int)*10); 	int *p2=(int *)malloc(sizeof(int)); 	p1[10]=p2;//访问越界 	free(p1);//误以为p1[10]也是malloc地址，一起释放，导致free了无效空间造成堆破坏 	return 0; }

user: user-0
content: 刚才检查过了。。。queue的值没有变，依旧还是那个地址。。。。

user: user-3
content: 释放前看看 queue 的值与 生成时是否一样
user-0 提问: 一段程序运行3秒后停止，进人下一段程序

回复:
user: user-1
content: 引用 7 楼 u012690843 的回复:举个例子：贪吃蛇中到了一定分数进入奖励函数，30秒后跳出此函数，怎么办呢？ 先将贪吃蛇那个线程挂起， 将奖励函数放在另一个线程中执行后sleep 30秒后，再启动先前挂起的线程。

user: user-2
content: sleep(3)

user: user-3
content: sleep(3);

user: user-4
content: 我上面的那段代码是linux的,windows也有signal函数,就是调用方法稍微有些不同而已 主线程先注册个信号事件, 然后新建一个子线程,子线程wait30秒,之后调用 raise函数,触发主线程信号处理函数,子线程自己退出  如果觉得麻烦,也可以试试用setTimer,不过需要有窗体 http://msdn.microsoft.com/en-us/library/windows/desktop/ms644906(v=vs.85).aspx

user: user-0
content: 举个例子：贪吃蛇中到了一定分数进入奖励函数，30秒后跳出此函数，怎么办呢？

user: user-5
content: 启一个监控（守护）进程（线程），全局控制其他的不就行了？

user: user-6
content: 《Windows核心编程》

user: user-7
content: 如果是Windows，可以使用Sleep函数： Sleep(3000); // 3000毫秒，就是3秒。

user: user-8
content: 程序要运行多久是代码决定的！ ps：题意有点不明确！那个3秒是要等等待3秒还是运行起来的程序只能3秒就运气另外一个程序呢？

user: user-4
content: 用信号,不需要忙等的很不错   #include<stdio.h> #include<signal.h> void sigalrm_fn(int sig) { 	puts("alarm fired"); 	getchar(); } int main() { 	signal(SIGALRM, sigalrm_fn); 	alarm(5); 	while(1)puts("tick"); } Cygwin下的代码,windows上没有测试过

user: user-9
content: 用系统内置函数调用 system("外部程序绝对路径");  例： system("/usr/bin/sh  urm.sh"); urm.sh 为参数  其实就是把一条在命令行输入的字符串放进""里面去，
user-0 提问: 指针啊啊！！指针间接访问跟用变量的区别？？

回复:
user: user-1
content: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）  想要从本质上理解C指针，必须学习汇编以及C和汇编的对应关系。 从汇编的角度理解和学习C语言的指针，原本看似复杂的东西就会变得非常简单！ 指针即地址。“地址又是啥？”“只能从汇编语言和计算机组成原理的角度去解释了。” 但我又不得不承认：  有那么些人喜欢或者适合用“先具体再抽象”的方法学习和理解复杂事物；  而另一些人喜欢或者适合用“先抽象再具体”的方法学习和理解复杂事物。 而我本人属前者。  不要企图依赖输出指针相关表达式的值【比如printf("%p\n",...)】来理解指针的本质， 而要依赖调试时的反汇编窗口中的C/C++代码【比如void *p=...】及其对应汇编指令以及内存窗口中的内存地址和内存值来理解指针的本质。  这辈子不看内存地址和内存值；只画链表、指针示意图，画堆栈示意图，画各种示意图，甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗？本人深表怀疑！ 这辈子不种麦不收麦不将麦粒拿去磨面；只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头，压面条，烤面包，……能从本质上理解面粉、理解面食吗？本人深表怀疑！！  提醒： “学习用汇编语言写程序” 和 “VC调试(TC或BC用TD调试)时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 （Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。） 想要从本质上理解C指针，必须学习C和汇编的对应关系。” 不是一回事！  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！  电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  十字链表交换任意两个节点C源代码（C指针应用终极挑战）http://download.csdn.net/detail/zhao4zhong1/5532495

user: user-2
content: 这个效率……应该可以忽略 硬要说的话，我猜下面那个高吧，毕竟通过指针要多访问一次内存

user: user-0
content: lz今天自己灵光一现解决了，原来是右结合少加了括号，那lz再问问上面两种写法哪个效率高？？

user: user-0
content: 弱菜在痛哭
user-0 提问: 排序算法

回复:
user: user-0
content: 引用 7 楼 Adol1111 的回复:[quote=引用 5 楼 lyw812152691 的回复:] 非常感谢你指定的错误地方，这些地方不注意就错了   a[j]=key;//这句写错了，不是swap，是赋值　 这个位置换掉swap　应该是不对的 看错了，我其实思路是用#4写的，主要是你这里用了swap有点不一样，我也没细改，把几个关键的地方改了下。 4#的是先把首项取出，然后直接覆盖，最后写回去。[/quote] 不管怎么说还是谢谢你

user: user-1
content: 引用 5 楼 lyw812152691 的回复:非常感谢你指定的错误地方，这些地方不注意就错了   a[j]=key;//这句写错了，不是swap，是赋值　 这个位置换掉swap　应该是不对的 看错了，我其实思路是用#4写的，主要是你这里用了swap有点不一样，我也没细改，把几个关键的地方改了下。 4#的是先把首项取出，然后直接覆盖，最后写回去。

user: user-0
content: 引用 4 楼 q745401990 的回复:void QuickSort(Type a[], int left, int right)   {       if(left < right)       {           int i = left, j = right, key = a[left];           do{               while(i < j && a[j] >= key)                   j--;               if(i < j) a[i++] = a[j];               while(i < j && a[i] < key)                   i++;               if(i < j) a[j--] = a[i];           }while(i != j);           a[i] = key;           QuickSort(a, left, i-1);           QuickSort(a, i+1, right);       }      }    left 是数组下标第一个存在的值，right是数组下标最后一个存在的值  稍微改了下 直接一个函数解决了   确实这个方法非常棒，代码量也少

user: user-0
content: 非常感谢你指定的错误地方，这些地方不注意就错了   a[j]=key;//这句写错了，不是swap，是赋值　 这个位置换掉swap　应该是不对的

user: user-2
content: void QuickSort(Type a[], int left, int right)   {       if(left < right)       {           int i = left, j = right, key = a[left];           do{               while(i < j && a[j] >= key)                   j--;               if(i < j) a[i++] = a[j];               while(i < j && a[i] < key)                   i++;               if(i < j) a[j--] = a[i];           }while(i != j);           a[i] = key;           QuickSort(a, left, i-1);           QuickSort(a, i+1, right);       }      }    left 是数组下标第一个存在的值，right是数组下标最后一个存在的值  稍微改了下 直接一个函数解决了

user: user-1
content: 引用 2 楼 lyw812152691 的回复:[quote=引用 1 楼 Adol1111 的回复:] 因为你的快排写得有问题，栈溢出了，然后吧size的值给覆盖了，那个15应该是你数据里的15，排序后正好在那个位置上。 能不能看是哪出的问题？？[/quote]void quick_sort(int a[],int left,int right) { 	int i=left,j=right;//不需要+1 	int key=a[left];  	if(left >=right) return ;  	while(1) 	{ 		while(a[j] > key && i<j) j--;//这里最好补上i<j 		while(a[i] < key && i<j) i++; 		if(i >= j) break; 		swap(&a[i],&a[j]); 		if(a[i] == key) 			j--; 		else 			i++; 	} 	a[j]=key;//这句写错了，不是swap，是赋值 	if(left <i-1) 		quick_sort(a,left,i-1); 	if(j+1<right) 		quick_sort(a,j+1,right); }  int main() { 	int a[]={0,-1,11,-14,5,15,-4,14}; 	int size=sizeof(a)/sizeof(a[0]); 	printf("size:%d\n",size); 	quick_sort(a,0,size-1);//参数传递错误，下标是0 - size-1 	printf("size:%d\n",size); 	for (int i=0;i<size;i++) 		printf("%d\t",a[i]); 	printf("\n"); 	return 0; }

user: user-0
content: 引用 1 楼 Adol1111 的回复:因为你的快排写得有问题，栈溢出了，然后吧size的值给覆盖了，那个15应该是你数据里的15，排序后正好在那个位置上。  能不能看是哪出的问题？？

user: user-1
content: 因为你的快排写得有问题，栈溢出了，然后吧size的值给覆盖了，那个15应该是你数据里的15，排序后正好在那个位置上。
user-0 提问: C语言内联汇编问题，非常简单的问题，但就是不知道错哪

回复:
user: user-1
content: 你看人家下面的代码多好，你的呢？

user: user-2
content: #include "stdafx.h" #include <stdio.h> int main() { 	long  a; 	_asm{ 			push eax 			push ecx 			mov eax,0x40001000 			mov ecx,dword ptr [eax+222h] 			mov a, ecx 			pop ecx 			pop eax  	} 	return 1; }
user-0 提问: 我这么实现栈有什么问题  为啥报错?

回复:
user: user-1
content: 懂了就该结果了..

user: user-2
content: (*s)都没有申请空间就想给(*s)->base申请空间？

user: user-3
content: 要初始化栈对象, 申请空间先...  status InitStack3(cstack **s)//初始化栈   {     *s = （cstack *)malloc(sizeof(cstack));     ...

user: user-0
content: 谢谢 指点!!!

user: user-0
content: 看来还是学艺不精啊 没有彻底的理解
user-0 提问: 【分享】C语言有关书籍

回复:
user: user-1
content: 我想说，被骗了，广告

user: user-2
content: 不用看这么多吧？一两本书，吃透了就好，然后开始试着编程就好。多了反而是负担

user: user-3
content: 我和我的小伙伴都惊呆了~~~~~~

user: user-4
content: 这么多书看到何时？

user: user-5

user: user-6
content: 我还真是想看看这门语言  虽然也是刚开始学
user-0 提问: C语言之路，一路有你们，我很感谢。

回复:
user: user-1
content: 为什么要用typedef？-- 就是因为要用下面的Ex这个“别名”来代替复杂的“struct Ex”(这里是一个整体)

user: user-2
content: 引用 2 楼 u012804737 的回复:typedef struct Ex{   }Ex; 这不是有两个Ex 吗？ 这个是可以的，第一个是struct Ex，第二个Ex是struct Ex的简称。

user: user-0
content: 引用 8 楼 Adol1111 的回复:这是两码事 而且typedef只是取别名而已，我把别名取成一样的难道就不行吗？谁规定别名就不能和原名相同了？ 更何况，C语言本身struct EX才是一个类型整体，我只是把整个类型struct EX取个EX的别名而已。   谢谢了，我明白了。

user: user-3
content: c里面 struct Ex和Ex是一样的，Ex和Ex是不一样的，c++里面都是一样的。

user: user-4
content: 听大神们讲讲啊

user: user-5
content: 这是两码事 而且typedef只是取别名而已，我把别名取成一样的难道就不行吗？谁规定别名就不能和原名相同了？ 更何况，C语言本身struct EX才是一个类型整体，我只是把整个类型struct EX取个EX的别名而已。

user: user-6
content: 不一样的！ 上面个人一般会习惯加上 _tag_Ex

user: user-7
content: 引用 2 楼 u012804737 的回复:typedef struct Ex{   }Ex; 这不是有两个Ex 吗？  这是合法的，tag与id是两个不同的名称空间。

user: user-8
content: 能成功编译吗？我没见过这种写法，不敢肯定，编译能过就没问题，书上也是有错误的。

user: user-0
content: 那你的意思是这个例子是错的了？我是在C和指针这本书上照抄下来的。

user: user-8
content: 上边那个Ex是不可以的，你一试就知道了。

user: user-0
content: typedef struct Ex{   }Ex; 这不是有两个Ex 吗？

user: user-9
content: 哪有两个Ex
user-0 提问: 听了大神的意见，去看计组和单片机，然后对于寄存器有点问题，求指导~

回复:
user: user-1
content: （ROM或者RAM）

user: user-1
content: 寄存器可以很复杂-----可以执行包括移位，各种位运算等等功能在内的计算， 也可以很简单----仅仅是一块存储器（ROM或者ROM）的一些单元  CPU的各种寄存器，一般都能够执行某些运算，一些芯片的寄存器，可能只是用来存储一些信息。 51的SFR，实际是一批不同功能的寄存器，地址在CPU内部的ram 位置的区域中。 A 累加器，B 辅助寄存器 R0~R8 *4 51 的通用寄存器组 另外还有一些专用寄存器，比如DPTR,PC，SP等等   寄存器，是芯片上，执行某些功能的一些单元，它至少有存储功能。  51 的寄存器，地址是在CPU内部的ram 位置的区域中。  X86 寄存器的地址，是不暴露给软件使用的； 软件里只能使用相应的指令，寻址寄存器，而不是通过寄存器的地址，使用寄存器。

user: user-2
content: 这是要走纯硬件开发的路线啊

user: user-3
content: 恩，勤奋学习，先学习好一款芯片

user: user-4
content: 引用 11 楼 jerry_dqh 的回复:[quote=引用 10 楼 u010412073 的回复:]   [quote=引用 9 楼 worldy 的回复:] 51的AB寄存器确实是SFR，我记错了，不好意思，呵呵  现在微机的通用寄存器有 EAX EBX ECX EDX ESI EDI EBP ESP CS SS DS FS GS EIP EFLAGS 段描述符寄存器组、GDTR IDTR CR0 CR1....，太复杂了，你还是自己找一下资料，呵呵 嗯嗯，已经差不多清楚了，看了好多资料。[/quote] 好像淘宝上有开发用的芯片，开发版，还有资料送。试试看[/quote] 买块版可以送一堆....

user: user-5
content: 引用 10 楼 u010412073 的回复:[quote=引用 9 楼 worldy 的回复:] 51的AB寄存器确实是SFR，我记错了，不好意思，呵呵  现在微机的通用寄存器有 EAX EBX ECX EDX ESI EDI EBP ESP CS SS DS FS GS EIP EFLAGS 段描述符寄存器组、GDTR IDTR CR0 CR1....，太复杂了，你还是自己找一下资料，呵呵 嗯嗯，已经差不多清楚了，看了好多资料。[/quote] 好像淘宝上有开发用的芯片，开发版，还有资料送。试试看

user: user-0
content: 引用 9 楼 worldy 的回复:51的AB寄存器确实是SFR，我记错了，不好意思，呵呵  现在微机的通用寄存器有 EAX EBX ECX EDX ESI EDI EBP ESP CS SS DS FS GS EIP EFLAGS 段描述符寄存器组、GDTR IDTR CR0 CR1....，太复杂了，你还是自己找一下资料，呵呵 嗯嗯，已经差不多清楚了，看了好多资料。

user: user-6
content: 51的AB寄存器确实是SFR，我记错了，不好意思，呵呵  现在微机的通用寄存器有 EAX EBX ECX EDX ESI EDI EBP ESP CS SS DS FS GS EIP EFLAGS 段描述符寄存器组、GDTR IDTR CR0 CR1....，太复杂了，你还是自己找一下资料，呵呵

user: user-0
content: 引用 6 楼 AnYidan 的回复:SFR: Special Function Register  CPU 中的 registers 一般指 work register, PC register 等与 获取，解码，执行 instruction 相关的register 能说明下，在51中寄存器的分布和微机中寄存器的分布么？

user: user-0
content: 引用 4 楼 worldy 的回复:51单片机的硬件结构和86(intel的体系架构)系列有比较大的差别，其内部ram集成在芯片内部，并将其中32字节用作寄存器(4个寄存器组)，只有AB寄存器是独立的  从结构角度，z80的架构和intel芯片比较接近（不恰当的比较，后者的性能和功能比前者高出不知道多少倍) AB属于SFR，也位于RAM中啊。。。。。

user: user-7
content: SFR: Special Function Register  CPU 中的 registers 一般指 work register, PC register 等与 获取，解码，执行 instruction 相关的register

user: user-0
content: 引用 3 楼 supermegaboy 的回复:你受人蛊惑，搞计算机组成原理是理解不了C的，两者不是相同层次上的东西。学好计算机组成原理有助于理解C的实现，但不是C本身，C语言根本不知道有CPU、内存、外部存储器等等这些东西。 其实也想学习硬件方面的知识。。

user: user-6
content: 51单片机的硬件结构和86(intel的体系架构)系列有比较大的差别，其内部ram集成在芯片内部，并将其中32字节用作寄存器(4个寄存器组)，只有AB寄存器是独立的  从结构角度，z80的架构和intel芯片比较接近（不恰当的比较，后者的性能和功能比前者高出不知道多少倍)

user: user-8
content: 你受人蛊惑，搞计算机组成原理是理解不了C的，两者不是相同层次上的东西。学好计算机组成原理有助于理解C的实现，但不是C本身，C语言根本不知道有CPU、内存、外部存储器等等这些东西。

user: user-9
content: 寄存器这个名词的范围比较宽泛，并没有绝对的一种定义，寄存器必须在哪里。  比较典型的：  1，一般处理器中的通用寄存器，在cpu内部的寄存器文件中，比如x86中的AX； 2，处理器内部一些专用寄存器，比如PC； 3，协处理器中的寄存器； 4，io空间或者存储空间映射的，处理器自定义的寄存器； 5，片内外设控制等寄存器； 6，外部总线连接的外部设备中的寄存器；  不同寄存器访问方式各不相同，功能千差万别，无法准确定义。  建议不要再钻牛角尖了。

user: user-0
content: 我又来问问题了，表示没有太多的学习资料真的很受伤，然后，百度什么的没有找到这个，求各位大神帮忙解释下。
user-0 提问: 广义表NIL

回复:
user: user-1
content: 引用 2 楼 qq921965140 的回复:[quote=引用 1 楼 N_sev7 的回复:] nil表示无值，任何变量在没有被赋值之前的值都为nil，对于真假判断，只有nil与false表示假，其余均为真。 Objective-C, Ruby, Lua中的关键字，与C++里的NULL不同，NULL是一个宏定义，值为0，nil表示无值 任何变量在没有被赋值之前的值都为nil，对于真假判断，只有nil与false表示假，其余均为真 ---------------百度百科拜托，我也会百度好不好，唉，感觉CSDN里的人都是为了加分不好好回答问题，没有学习的氛围。[/quote] 你觉得百度谷歌是干什么用的？ 我和你意见正好不一样 我最看不起那些有问题百度谷歌都不用下就直接问别人的人 谷歌百度跟翻书有很大区别吗？ 所有问题可以自己想想办法解决，不管是翻书还是上网搜 等你真正工作的时候就明白谷歌百度的重要性了

user: user-0
content: 引用 3 楼 user-2 的回复:[quote=引用 2 楼 qq921965140 的回复:] [quote=引用 1 楼 N_sev7 的回复:] nil表示无值，任何变量在没有被赋值之前的值都为nil，对于真假判断，只有nil与false表示假，其余均为真。 Objective-C, Ruby, Lua中的关键字，与C++里的NULL不同，NULL是一个宏定义，值为0，nil表示无值 任何变量在没有被赋值之前的值都为nil，对于真假判断，只有nil与false表示假，其余均为真 ---------------百度百科拜托，我也会百度好不好，唉，感觉CSDN里的人都是为了加分不好好回答问题，没有学习的氛围。[/quote] ...你可以看看小版块中置顶贴提问的智慧，里面有一段是这样的：  运用某些策略，比如用谷歌（Google）搜索你遇到的各种错误提示（既搜索 谷歌论坛，也搜索网页）， 这样很可能直接就找到了解决问题的文档或邮件列表线索。 即使没有结果，在邮件列表或新闻组寻求帮助时提一句“我在谷歌中搜过下列句子但没有找到什么有用的东西” 也是件好事，至少它表明了搜索引擎不能提供哪些帮助。将搜索关键词与你的问题及可能的解决方案联系起来，还有助于引导其他有类似问题的人。  你根本没有明确的说出你不要百度或google的结果，那别人特地为你找了答案，你又说别人不好好回答。那你想怎样？想要更好的结果之前，你应该想想是否为他人想过，是否有明确的提出自己的意见，而不是因为找不到需要的答案就说别人的问题。 ———————————————— 不说这个话题了，NIL就是空表的意思，这点和NULL还是有差异的。NULL只是一个约定，表明这是一个空表的意思，而并非是一个真正的空表。就比如指针int *p=NULL,指向的是NULL这个位置，但不代表它没有值。 不过在C/C++里是没有这个类型的，所以你只能用NULL约定是一个空表，但在objective-C之类的语言中可以用NIL表示明确的无值。广义表的描述就是非计算机语言，所以NIL表示空表没什么问题。[/quote]好吧，看你码字那么多！

user: user-2
content: 引用 2 楼 qq921965140 的回复:[quote=引用 1 楼 N_sev7 的回复:] nil表示无值，任何变量在没有被赋值之前的值都为nil，对于真假判断，只有nil与false表示假，其余均为真。 Objective-C, Ruby, Lua中的关键字，与C++里的NULL不同，NULL是一个宏定义，值为0，nil表示无值 任何变量在没有被赋值之前的值都为nil，对于真假判断，只有nil与false表示假，其余均为真 ---------------百度百科拜托，我也会百度好不好，唉，感觉CSDN里的人都是为了加分不好好回答问题，没有学习的氛围。[/quote] ...你可以看看小版块中置顶贴提问的智慧，里面有一段是这样的：  运用某些策略，比如用谷歌（Google）搜索你遇到的各种错误提示（既搜索 谷歌论坛，也搜索网页）， 这样很可能直接就找到了解决问题的文档或邮件列表线索。 即使没有结果，在邮件列表或新闻组寻求帮助时提一句“我在谷歌中搜过下列句子但没有找到什么有用的东西” 也是件好事，至少它表明了搜索引擎不能提供哪些帮助。将搜索关键词与你的问题及可能的解决方案联系起来，还有助于引导其他有类似问题的人。  你根本没有明确的说出你不要百度或google的结果，那别人特地为你找了答案，你又说别人不好好回答。那你想怎样？想要更好的结果之前，你应该想想是否为他人想过，是否有明确的提出自己的意见，而不是因为找不到需要的答案就说别人的问题。 ———————————————— 不说这个话题了，NIL就是空表的意思，这点和NULL还是有差异的。NULL只是一个约定，表明这是一个空表的意思，而并非是一个真正的空表。就比如指针int *p=NULL,指向的是NULL这个位置，但不代表它没有值。 不过在C/C++里是没有这个类型的，所以你只能用NULL约定是一个空表，但在objective-C之类的语言中可以用NIL表示明确的无值。广义表的描述就是非计算机语言，所以NIL表示空表没什么问题。

user: user-0
content: 引用 1 楼 N_sev7 的回复:nil表示无值，任何变量在没有被赋值之前的值都为nil，对于真假判断，只有nil与false表示假，其余均为真。 Objective-C, Ruby, Lua中的关键字，与C++里的NULL不同，NULL是一个宏定义，值为0，nil表示无值 任何变量在没有被赋值之前的值都为nil，对于真假判断，只有nil与false表示假，其余均为真 ---------------百度百科拜托，我也会百度好不好，唉，感觉CSDN里的人都是为了加分不好好回答问题，没有学习的氛围。

user: user-1
content: nil表示无值，任何变量在没有被赋值之前的值都为nil，对于真假判断，只有nil与false表示假，其余均为真。 Objective-C, Ruby, Lua中的关键字，与C++里的NULL不同，NULL是一个宏定义，值为0，nil表示无值 任何变量在没有被赋值之前的值都为nil，对于真假判断，只有nil与false表示假，其余均为真 ---------------百度百科
user-0 提问: 关于c语言的结构体

回复:
user: user-1
content: typedef除了少打几个字，没啥好处，当然，对一些复杂类型，用typedef定义个别名也有些好处，变得更清晰

user: user-2
content: 二楼正解啊··

user: user-3
content: 引用 4 楼 max_min_ 的回复:两种都可以的！个人编码风格不同而已！ 我用下面一种居多！ re

user: user-4
content: 两种都可以，没有区别，习惯而已

user: user-5
content: 为什么有的代码里会同时存在这两种定义呢?  同时存在的话，不加命名空间，肯定会报：变量已经定义的错误。

user: user-6
content: 个人写法不同吧，我的理解是主要在typedef上  typedef  [已有类型名] [新类型名]  第一种就是先定义类型，然后根据新的类型名再定义新的类型名 第二种可以把中间的结构体定义看作一个整体，也就像当于一个类型名喽，其实都是一样一样滴

user: user-7
content: c语言的话 第二种编译可以通过吗

user: user-8
content: 两种都可以的！个人编码风格不同而已！ 我用下面一种居多！

user: user-9
content: 可能是不同人写得吧

user: user-10
content: 两个结构体相互指向的时候，用typdef  结构体里面包含指向自身类型的指针时，用typdef  还有就不知道了

user: user-11
content: typedef struct{     type data; }name_t，*name_p;  name_t st; 定义一个名为 st 结构变量。 name_p sp; 定义一个名为 sp 指针变量  标准用法。其他用法，自行理解。
user-0 提问: C文件操作，结构体

回复:
user: user-1
content: 不错的云代码

user: user-2
content: 貌似简单循环fscanf即可...

user: user-0
content: 引用 引用 5 楼 liuchunruiYJDWANN 的回复:简单实现如下： #include <stdio.h> #define N 1024 void main() { 	FILE *fp; 	char str[N]; 	int a; 	char temp[50]; 	int k=0; 	fp=fopen("D:\\1.txt","r"); 		if(fp!=NULL) 		{  			fgets(str,N,fp);//先放入str数组中 		} 		for(int i=0;str[i]!='\0';i++)//对数组进行处理 		{ 			if(str[i]!=' '&&str[i]!=',') 				{ 					if(str[i]>'0'&&str[i]<'9') 					{ 						a+=str[i]-'0'; 				 					} 					else  					temp[k++]=str[i]; 					printf("%c",str[i]); 				} 			else 			if(str[i]==' ') 				{ 					temp[k]='\0'; 					//可以把用copy函数给结构体中的city赋值 					//把a赋值给结构体中的number 					a=0; 				} 			 			 		} } 用我们数据结构老师的话说，你这个算法确实行得通，不过也太笨了。读过来还要这么那么。用fscanf(fp,"type_t",type_tname);还可以读到我的结构体struct citynode{   char city[20];int citynum;};里面。这个不是省好多事哦 不过，谢谢啦哈。麻烦麻烦了。cout<<"Thanks a lot\n";

user: user-0
content: 引用 引用 7 楼 angel_su 的回复:貌似简单循环fscanf即可...说得太撇托了，不过我还真的是用的这个函数，自己搞出来了。

user: user-3
content: 引用 4 楼 u012540439 的回复:引用  [quote=引用 3 楼 jerry_dqh 的回复:] 读取文件 std::vector<char> v; if (FILE *fp = fopen("filename", "r")) { 	char buf[1024]; 	while (size_t len = fread(buf, 1, sizeof(buf), fp)) 		v.insert(v.end(), buf, buf + len); 	fclose(fp); }[/quote] 嚄……我学的是.h头文件格式，std::这个还真有点不明白;不过我问的是，拿第一个城市的文件说，欲读取”北京“到我定义的结构体的为字符型变量city里面，0到结构体的int number里面；然后每个逗号后面的内容都如此放在结构体struct node【i】中.怎么弄好？[/quote]  逐条读入记录（逗号分割） 每条记录中以 空格分割不同的 item 重复直至读入所有记录

user: user-4
content: 简单实现如下： #include <stdio.h> #define N 1024 void main() { 	FILE *fp; 	char str[N]; 	int a; 	char temp[50]; 	int k=0; 	fp=fopen("D:\\1.txt","r"); 		if(fp!=NULL) 		{  			fgets(str,N,fp);//先放入str数组中 		} 		for(int i=0;str[i]!='\0';i++)//对数组进行处理 		{ 			if(str[i]!=' '&&str[i]!=',') 				{ 					if(str[i]>'0'&&str[i]<'9') 					{ 						a+=str[i]-'0'; 				 					} 					else  					temp[k++]=str[i]; 					printf("%c",str[i]); 				} 			else 			if(str[i]==' ') 				{ 					temp[k]='\0'; 					//可以把用copy函数给结构体中的city赋值 					//把a赋值给结构体中的number 					a=0; 				} 			 			 		} }

user: user-0
content: 引用 引用 3 楼 jerry_dqh 的回复: 读取文件 std::vector<char> v; if (FILE *fp = fopen("filename", "r")) { 	char buf[1024]; 	while (size_t len = fread(buf, 1, sizeof(buf), fp)) 		v.insert(v.end(), buf, buf + len); 	fclose(fp); }[/quote] 嚄……我学的是.h头文件格式，std::这个还真有点不明白;不过我问的是，拿第一个城市的文件说，欲读取”北京“到我定义的结构体的为字符型变量city里面，0到结构体的int number里面；然后每个逗号后面的内容都如此放在结构体struct node【i】中.怎么弄好？

user: user-5
content: 引用 2 楼 u012540439 的回复:引用用C语言中的文件读取学得不好，敲两个代码示范一下？ 读取文件 std::vector<char> v; if (FILE *fp = fopen("filename", "r")) { 	char buf[1024]; 	while (size_t len = fread(buf, 1, sizeof(buf), fp)) 		v.insert(v.end(), buf, buf + len); 	fclose(fp); }

user: user-0
content: 引用用C语言中的文件读取学得不好，敲两个代码示范一下？

user: user-4
content: 用C语言中的文件读取
user-0 提问: PE文件导入表的问题

回复:
user: user-1
content: 可以看看这里 http://bbs.bccn.net/thread-226658-1-1.html printf("%x\n",MessageBoxA);就是实际地址

user: user-2
content: 虚拟地址-载入内存后的地址  Pe文件有一个Import address table  当调用api的时候,push所有的参数后,就跳到这个表call [4019f8]  这个表上面写着4019f8 JMP DWORD PTR DS:[405188]  405188是一个指针,里面存着Messagebox在user32里面的地址  而JMP DWORD PTR DS:[405188]这条命令的意思就是,获取405188指针的内容(messagebox在user32里的地址),然后跳到那里.

user: user-0
content: 引用 3 楼 user-2 的回复:用od看一下被,  PROC pr = (PROC)MessageBoxA得到的地址 4019f8 这个是程序运行后MessageBoxA在IAT表里的位置 4019f8 JMP DWORD PTR DS:[405188]  405188里面存着指向user32.dll的指针 你好，这里我确实有点不清楚 405188是相对于dll模块的地址还是相对于进程地址空间的地址？

user: user-2
content: 用od看一下被,  PROC pr = (PROC)MessageBoxA得到的地址 4019f8 这个是程序运行后MessageBoxA在IAT表里的位置 4019f8 JMP DWORD PTR DS:[405188]  405188里面存着指向user32.dll的指针

user: user-0
content: 引用 1 楼 toofunny 的回复:先说说你的导入表是怎么解析出来的？ 如果是自己动态解析的，那就是编程错误。 如果是用工具静态解析的，请复习PE知识。 	HMODULE hModule = GetModuleHandle(NULL); 	PROC pr = (PROC)MessageBox; 	 	printf("PROC pr = (PROC)MessageBoxA得到的地址     %x\n",pr); 	IMAGE_DOS_HEADER* pDosHeader = (IMAGE_DOS_HEADER*)hModule;    //定位dos文件头  	 	 	IMAGE_OPTIONAL_HEADER* pOptHeader = (IMAGE_OPTIONAL_HEADER*) 	((BYTE*)hModule+pDosHeader->e_lfanew+24); 	 	IMAGE_IMPORT_DESCRIPTOR* pImport=(IMAGE_IMPORT_DESCRIPTOR*) 	((BYTE*)hModule+ 	pOptHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);  	//定位导入表     while(pImport->FirstThunk){     	buffer = (char*)((BYTE*)hModule+pImport->Name);     	printf("加载的DLL名为 %s\n",buffer);     	IMAGE_THUNK_DATA* pThunk=(IMAGE_THUNK_DATA*) 		((BYTE*)hModule+pImport->OriginalFirstThunk); 		 		while(pThunk->u1.Function){ 			function_name = (char*)((BYTE*)hModule+(DWORD)pThunk->u1.AddressOfData+2); 			PDWORD pAddr = (DWORD*) 			((BYTE*)hModule+pImport->FirstThunk)+k; 			printf("函数名为    %s",function_name); 			printf("        函数地址    %x\n",pAddr); 			k++; 			pThunk++; 		}     	pImport++;     }

user: user-1
content: 先说说你的导入表是怎么解析出来的？ 如果是自己动态解析的，那就是编程错误。 如果是用工具静态解析的，请复习PE知识。
user-0 提问: 2维数组的疑惑

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

user: user-2
content: (int (*)[COLSIZE]) malloc .......

user: user-3
content: int (*pA)[COLSIZE] =(int( *)[COLSIZE]) malloc(sizeof(int) * ROWSIZE * COLSIZE);  加一个括弧就好了。 int (*)[]括弧是语法的一部分。
user-0 提问: 队尾指针丢失

回复:
user: user-0
content: 引用 7 楼 angel_su 的回复:没那句if的话，自然是发生你顶楼说的那个问题...为什么你们都那么含蓄，就是不肯说“指针悬挂”这四个字。算了，累觉不爱，结贴。

user: user-1
content: 没那句if的话，自然是发生你顶楼说的那个问题...

user: user-0
content: 引用 5 楼 angel_su 的回复:if (Q.rear = = p)  Q.rear = Q.front; 代码里判断处理了，没问题的没这句代码的话，rear是不是悬挂指针？唉，问个问题咋就那么难呢？

user: user-1
content: if (Q.rear = = p)  Q.rear = Q.front; 代码里判断处理了，没问题的

user: user-0
content: 引用 3 楼 user-2 的回复:[quote=引用 2 楼 qq921965140 的回复:] [quote=引用 1 楼 user-2 的回复:]  free (p);  p =NULL; //悬挂指针也就是野指针，有地址，但是不知道指向什么地方！  我想知道这里队尾指针是属于指针悬挂吗？[/quote]  1 你的队尾指针的指向你知道么？   2 == 中间不要空格了 [/quote] 是不是？求大神一个准确的回答，不要那么含蓄嘛。代码是我拷的，没检查。

user: user-2
content: 引用 2 楼 qq921965140 的回复:[quote=引用 1 楼 user-2 的回复:]  free (p);  p =NULL; //悬挂指针也就是野指针，有地址，但是不知道指向什么地方！  我想知道这里队尾指针是属于指针悬挂吗？[/quote]  1 你的队尾指针的指向你知道么？   2 == 中间不要空格了

user: user-0
content: 引用 1 楼 user-2 的回复: free (p);  p =NULL; //悬挂指针也就是野指针，有地址，但是不知道指向什么地方！  我想知道这里队尾指针是属于指针悬挂吗？

user: user-2
content: free (p);  p =NULL; //悬挂指针也就是野指针，有地址，但是不知道指向什么地方！
user-0 提问: 指针数组的赋值

回复:
user: user-0
content: 那是不是说有两种方法 1.先定义一个二维数组b【10】【7】，然后把a[i]=b[i]；这样？ 2.先分配内存，然后一个一个赋值，是*a[1]++这样把a里面的每个指针都这样一个一个的复过去？ 哪种效率高

user: user-1
content: 引用 3 楼 susuding77 的回复:这样，原来的程序是b指向数组c,现在想在外层加一层循环，使的外层循环的指针数组，指向内层的b，当然内层的数组c的内容是每次都变化的。这个要怎样实现呢，有代码吗 需要给a[10]分配内存空间的！然后一个一个的赋值吧！ 不能通过地址来直接操作的！

user: user-0
content: 是a每个都保存一个c的整个数组，c整个数组的值是每次循环都变化的。 就是一个二维数组c[10][7];想让a[i]=c[i].但是不想把c写成2为数组，只是想吧他作为一个一维数组的中间变量，每次都能把他的内容存下来

user: user-0
content: 这样，原来的程序是b指向数组c,现在想在外层加一层循环，使的外层循环的指针数组，指向内层的b，当然内层的数组c的内容是每次都变化的。这个要怎样实现呢，有代码吗

user: user-2
content: 没看懂你的意思。 你是想a[0]-a[9]每一个都是保存整个数组c的地址：a[0]=c,a[1]=c…… 还是想a[0]保存c[0]的地址，a[1]保存c[1]的地址。a[0]=&c[0],a[1]=&c[1]……

user: user-1
content: 不对！你是通过地址取值的！过程中可能是过程中的某一个组数值， 但是循环换了应该值剩下最后一组了！而且a[i]的指向都是相同的！指向同一块内存地址
user-0 提问: 指向数组的指针赋值

回复:
user: user-0
content: 楼上说的对，加错位置后果很严重

user: user-1
content: ...楼主看仔细啊，一个小错误有时候会需要几十倍的时间去排除错误。

user: user-0
content: 刚才把++放前面了前面赋值的地方，所以打出来不一样，发帖的时候改成了现在的样子，搞错了，版主见谅

user: user-2
content: #include <iostream> using namespace std;  int main(void) {     int a[10]={3,7,53,2,3,6,7,3};     int *b;      b=a;     for (int i=0;i<10;i++)     {            *b=i*2+7;          cout<<*b<< " ";         cout<<a[i]<<endl;          b++;     }        return 0; }  //结果： 7 7 9 9 11 11 13 13 15 15 17 17 19 19 21 21 23 23 25 25  //疑惑在那里？
user-0 提问: bresenham画线算法求助

回复:
user: user-1
content: 你这个代码哪里来的。 有问题吧  至少直线方向是靠近水平还是垂直 要分开处理吧。

user: user-2
content: 印象中需要分8个角度范围即每个象限分两部分 分别处理。

user: user-0
content: 引用 3 楼 relaxisland 的回复:你这个代码哪里来的。 有问题吧  至少直线方向是靠近水平还是垂直 要分开处理吧。/*compute the direction of the increment,an increment of O means either a vertial or horizontal line*/ if(delta_x>0) incx=1; else if(delta_x==0) incx=0; else incx=-1;  if(delta_y>0) incy=1; else if(delta_y==0) incy=0; else incy=-1;这一段不就是讨论垂直水平问题吗

user: user-3
content: xerr+=delta_x;     yerr+=delta_y;  每一次循环着两个值都是增加？是不是这里？ 还没祥看代码

user: user-0
content: 引用 1 楼 N_sev7 的回复:     xerr+=delta_x;     yerr+=delta_y;  每一次循环着两个值都是增加？是不是这里？ 还没祥看代码 可以说是吧，主要就是xerr和yerr的变化，最后两个if循环没弄明白。
user-0 提问: 请教用C编写的菜单中，一个变量为啥不能被输入值？

回复:
user: user-0
content: 引用 1 楼 user-1 的回复:char也可以，int也可以。不过char类型对应的是ascii，int类型对应的是数值，两者会有差异，最好统一下。  至于为什么没执行是因为你这句打错了：scanf("&d",&n);应该是：scanf("%d",&n);  你n没有输入，直接把你的第一个输入赋给后面的itemSelected。你单步调试下就知道了，他的确进入了相应的函数。但因为n没输入是一个垃圾值，所以如果系统给的n<0的话你这句：for (i=0;i<n-1;i++)就无法执行了，看上去就没有执行一样。  谢谢user-1，是我疏忽的一个小错误，哈

user: user-1
content: char也可以，int也可以。不过char类型对应的是ascii，int类型对应的是数值，两者会有差异，最好统一下。  至于为什么没执行是因为你这句打错了：scanf("&d",&n);应该是：scanf("%d",&n);  你n没有输入，直接把你的第一个输入赋给后面的itemSelected。你单步调试下就知道了，他的确进入了相应的函数。但因为n没输入是一个垃圾值，所以如果系统给的n<0的话你这句：for (i=0;i<n-1;i++)就无法执行了，看上去就没有执行一样。
user-0 提问: %p和%x有什么区别吗？

回复:
user: user-1
content: 引用 4 楼 max_min_ 的回复:%p打印地址的啊！ %x十六进制形式打印  完成不同！  %p void *; print as a pointer (implementation-dependent representation).

user: user-2
content: 引用 4 楼 max_min_ 的回复:%p打印地址的啊！ %x十六进制形式打印  完成不同！版主解释的到位！谢谢~

user: user-3
content: %p 标准没有格式的规定, 打印出来像 0x%x  0X%08X  %08X 啥格式的都有...

user: user-4
content: 引用 楼主 abc594986308 的回复:#include <stdlib.h> #include <stdio.h> int main() {     unsigned int *p;     p = (unsigned int *)malloc(100);     if(p)          printf("Memory Allocated at: %x",p);     else          printf("Not Enough Memory!\n");     getchar();     p = (unsigned int *)realloc(p,156);     if(p)          printf("Memory Realloc at: %x",p);     else          printf("Not Enough Memory!\n");     free(p);     getchar();     return 0;                      } 在linux下编程有警告。 realloc.c: In function ‘main’: realloc.c:8:10: warning: format ‘%x’ expects argument of type ‘unsigned int’, but argument 2 has type ‘unsigned int *’ [-Wformat=]           printf("Memory Allocated at: %x",p);           ^ realloc.c:14:10: warning: format ‘%x’ expects argument of type ‘unsigned int’, but argument 2 has type ‘unsigned int *’ [-Wformat=]           printf("Memory Realloc at: %x",p); 但是用%p后可以解决，我想问下%p和%x有什么区别么？ 没什么区别，结果上，唯一的区别的编译器警告的问题

user: user-5
content: %p打印地址的啊！ %x十六进制形式打印  完成不同！

user: user-6
content: 64位下结果会不一样，老实点用%p吧...

user: user-7
content: 区别就是 %p 相当于 0x%x

user: user-8
content: p打印指针,x打印整数.  printf("Memory Realloc at: %x",p); 改成下面应该也能消除 printf("Memory Realloc at: 0x%x",(unsigned int)p);
user-0 提问: 求助！！！求大神看看这个用数组求n！阶乘的函数错在哪里啊！1

回复:
user: user-1
content: 引用 2 楼 u012912202 的回复:如果阶乘很大就不能用这种方法啊 大数阶乘没办法的，肯定会溢出的。 要么看看这个，大数的阶乘算法。

user: user-0
content: 如果阶乘很大就不能用这种方法啊

user: user-2
content: #include<stdio.h>  #define P 600 int a[P]; int main() {     int n;     int i;      printf("input n:\n");     scanf("%d",&n);      a[0]=1;     printf("0 factorial value : %d", a[0]);     for (i=1;i<=n;i++)     {         a[i] = a[i-1]*i;         printf("%d factorial value : %d", i, a[i]);             }     return 0; }
user-0 提问: 有没有可能实现多行并行写入文件呢

回复:
user: user-1
content: 引用 9 楼 caozhy 的回复:[quote=引用 8 楼 lm_whales 的回复:] 1）PC 机，似乎不可以：    大部分 PC硬盘接口类型决定，只能串行写，即使用两个磁盘。    另外PC机，即使SCSI接口硬盘，也是串行写。  2）SCSI接口的硬盘阵列似乎可以（多用于服务器）    同一块，硬盘只能串行写，    即使并行可以适当加速，也意义不大（基本上等同于没有加速）。  就lz的问题而言，RAID也是不可以。  注意，RAID并非按照字节交错或者并行存储到几个磁盘上，而是按照区块来的。一般典型的是128KB或者更大。[/quote] ++ 这个应用数据确实太少了，并行实在没有必要！

user: user-2
content: 建议不要做这种无用功了。 操作系统往磁盘上写文件本来就是带内存缓冲写的。  在文件大小相同的前提下：  读刚读过的文件比头次读没读过的文件快  读转速快的硬盘上的文件比读转速慢的硬盘上的文件快  读没有磁盘碎片的文件比读有磁盘碎片的文件快  读文件不处理比边读边处理快  单线程从头到尾一次读文件比多线程分别读文件各部分快（非固态硬盘上）  读固态硬盘上的文件比读普通硬盘上的文件快 写文件也类似。

user: user-3
content: 引用 8 楼 lm_whales 的回复:1）PC 机，似乎不可以：    大部分 PC硬盘接口类型决定，只能串行写，即使用两个磁盘。    另外PC机，即使SCSI接口硬盘，也是串行写。  2）SCSI接口的硬盘阵列似乎可以（多用于服务器）    同一块，硬盘只能串行写，    即使并行可以适当加速，也意义不大（基本上等同于没有加速）。  就lz的问题而言，RAID也是不可以。  注意，RAID并非按照字节交错或者并行存储到几个磁盘上，而是按照区块来的。一般典型的是128KB或者更大。

user: user-1
content: 1）PC 机，似乎不可以：    大部分 PC硬盘接口类型决定，只能串行写，即使用两个磁盘。    另外PC机，即使SCSI接口硬盘，也是串行写。  2）SCSI接口的硬盘阵列似乎可以（多用于服务器）    同一块，硬盘只能串行写，    即使并行可以适当加速，也意义不大（基本上等同于没有加速）。

user: user-4
content: 这样做没意思，不如先放内存缓存一下，一次写入文件效率高来

user: user-5
content: 小心线程琐

user: user-6
content: 当然可以，只要控制好每个线程在写文件时各自的起始位置即可。 但正如楼上所说，实际上写入数据时到操作系统这一层每个线程是排队一个一个的写入，所以最终还是串行的，效率只减不增

user: user-3
content: 这样做只会更慢。因为硬盘只有一个磁头（对于每个盘片），所谓并行，最终还是串行的。

user: user-7
content: 可以是可以的！但是得看你的电脑硬件了！ 如果是多核的话，则支持多个线程同时并行工作！如果是单核的话，就是多个线程轮询了！ 至于你的写文件，这里还是一个线程吧！因为写同一个文件的话，防止覆盖还是得加读写锁的！

user: user-8
content: 引用 楼主 u011962366 的回复:比如一个二维数组a[10][100]；写入文件的时候总共是十行数据，有没有可能创建十个线程，每个线程负责一行数据的写入。做到十行数据同时写入同一个文件。  比copy mp3 的数据量小吧

user: user-9
content: 不要认为多线程一定会提高工作效率，对于单线程处理器，往往很多时候看着是并行，实际还是一个一个换着来，反而有线程切换开销
user-0 提问: C 语句转换问题

回复:
user: user-1
content: ？（GPIO_TypeDef *)是强制转换，对一个地址进行？以前都是对一个变量时行的。此处怎么理解？  (GPIO_TypeDef *) 这个强转是 指针类型的  你那个是地址 就是以你那个GPIOA_BASE为首地址 访问内存数据的方式就是以GPIO_TypeDef 结构体去看 GPIO_TypeDef *p;  p = GPIOA; 和这个写法类似吧 struct A { int a; int b; } struct A  * p; p = (struct A*)0x4000000;  不就是强转下吗 地址0x400000可能默认是按void *访问的  int a = 0x11223344; char answer; char *p = &answer; p = (char *)&a; 就是从a的地址开始看 以char类型读出来

user: user-2
content: 不懂，帮顶，帮顶

user: user-3
content: test.c#include <stdio.h>  #include <stdlib.h>  typedef struct{                   short a;                   char b;                 }typedefaddress;  #define address  0x6000 0000  #define addr  ((typedefaddress*)address)  int main(int argc, char *argv[])  {           addr->a=22;      printf("%d\n",(*addr).a)      system("PAUSE");       return 0;  } VC6编译通过。

user: user-0
content: #include <stdio.h> #include <stdlib.h> typedef struct{                  short a;                  char b;                }typedefaddress; #define address  0x6000 0000 #define addr  ((typedefaddress*)address) int main(int argc, char *argv[]) {         addr->a=22;     printf("%d\n",(*addr).a)     system("PAUSE");	     return 0; }  那我这样写怎么编译通不过，报错在addr->a=22;

user: user-3
content: GPIOA_BASE是个32位地址（0X40000000).注意这个地址不是内存地址而是端口地址。

user: user-4
content: #define GPIOA  ((GPIO_TypeDef *) GPIOA_BASE) 这句话是什么意思啊？ （GPIO_TypeDef *)是强制转换，对一个地址进行？以前都是对一个变量时行的。此处怎么理解？  其中GPIOA_BASE是个32位地址（0X40000000). GPIO_TypeDef是一个结构体的类形。 --------------- #define GPIOA  ((GPIO_TypeDef *) GPIOA_BASE) 这句话是什么意思啊？ 1) 这句话的意思是把0X40000000这个地址当做结构体GPIO_TypeDef的首地址,即0X40000000开始的地址存储的是GPIO_TypeDef类型的数据.以此类型进行访问. 这种方式在驱动开发中非常常见.  （GPIO_TypeDef *)是强制转换，对一个地址进行？以前都是对一个变量时行的。此处怎么理解？ 2)变量在c语言中是symbol,它只是地址的标示,便于程序员操作.实际的指针转化操作都是直接对地址的.
user-0 提问: 请教个操作本地文件地址的问题，谢谢

回复:
user: user-1
content: 参考http://blog.csdn.net/selina6874/article/details/6784697  引用 楼主 zhuoxuan216 的回复:如何对多个本地地址进行操作，操作原则是：根据地址最后一个\后的文件名进行，看文件名是否相同，相同记录一次，计数加一。然后输出文件名和计数。请问这个问题怎么实现呢

user: user-2
content: msdn, 查FindFirstFile， 或CFileFind类 有详细例子
user-0 提问: 急求Kruskal 算法的代码？？？

回复:
user: user-1
content: 结贴.....

user: user-2
content: http://blog.csdn.net/niushuai666/article/details/6689285  百度上很多啊

user: user-1
content: http://blog.csdn.net/china_zoujinyong/article/details/16833293  我的博客 如果有什么问题随时留言
user-0 提问: 这是连接哪2个链表啊？

回复:
user: user-0
content: 引用 1 楼 user-2 的回复:纠正一处错误：12行应该是 if(tmp == NULL) 嗯，确实写错了，谢谢斑竹

user: user-1
content: 代码有些拼写错误，改正后如下： #include "stdlib.h" #include "stdio.h" struct list {    int data;    struct list *next; }; typedef struct list node; typedef node *link; link delete_node(link pointer,link temp) {    if(temp=NULL)       return pointer->next;    else       {          if(temp->next->next==NULL)             temp->next=NULL;          else             temp->next=temp->next->next;          return pointer;       } } void selection_sort(link pointer,int num)   { 	  link tmp,btmp;    int i,min;    for(i=0;i<num;i++)    {       tmp=pointer;       min=tmp->data;       btmp=NULL;       while(tmp->next)       {            if(min>tmp->next->data)            {                min=tmp->next->data;                btmp=tmp;            }            tmp=tmp->next;       } 		printf("\40: %d\n",min); 		pointer=delete_node(pointer,btmp);   } } link create_list(int array[],int num) {    link tmp1,tmp2,tmp3;    int i;    link pointer;    pointer=(link)malloc(sizeof(node));    pointer->data=array[0];    tmp1=pointer;    for(i=1;i<num;i++)    {        tmp2=(link)malloc(sizeof(node));        tmp2->next=NULL;        tmp2->data=array[i];        tmp1->next=tmp2;        tmp1=tmp1->next;    } return pointer; } link concatenate(link pointer1,link pointer2) {    link tmp;    tmp=pointer1;    while(tmp->next)       tmp=tmp->next;    tmp->next=pointer2;    return pointer1; } void main() {    int arr1[]={3,12,8,9,11};    link ptr;    ptr=create_list(arr1,5);    selection_sort(ptr,5); }

user: user-1
content: delete_node(link pointer,link temp)函数中temp是当前最小结点的前驱 此函数的功能是删除当前链表中的最小结点。

user: user-1
content: concatenate函数是把以pointer2以头的链表，接到pointer1链表的后面

user: user-2
content: 纠正一处错误：12行应该是 if(tmp == NULL)