Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: struct不能作为rvalue传递给函数么？？

回复:
user: user-1
content: 等啥时候整个互联网内容能作为函数参数传递中…………

user: user-2
content: 可以改成如下形式： #include <stdio.h>  typedef struct node { 	int first; 	struct node* rest; } int_list;  int_list cons(int x, int_list* xs/*int_list xs*/) { 	int_list newlist = {x, /*&*/xs}; 	return newlist; }   int_list empty = {NULL,NULL};  void print_int_list(int_list xs) { 	printf("element is : %d\n", xs.first); 	printf("next element is : %d\n", (*(xs.rest)).first);  	//(commented since not related to the problem)  	//printf("rest points to : %p\n", xs.rest); 	//if (xs.rest != NULL) print_int_list(*xs.rest); }  int main() { 	int_list xs = cons(1, &empty); 	printf("element is : %d\n", xs.first); 	printf("next element is : %d\n", (*(xs.rest)).first);  	//printf("rest points to : %p\n", xs.rest); 	//print_int_list(empty);  	print_int_list(xs);  	return 0; }

user: user-2
content: 引用 楼主 u014207866 的回复:网上有很多把struct作为rvalue传给函数的教程（不用pointer），这样做可以么？ 我想再C上实现list，打印list。  ( set-up )  typedef struct node { 	int first; 	struct node* rest; } int_list;  int_list cons(int x, int_list xs) { 	int_list newlist = {x, &xs}; 	return newlist; }   (problematic code) int_list empty = {NULL,NULL};  void print_int_list(int_list xs) { 	printf("element is : %d\n", xs.first); 	printf("next element is : %d\n", (*(xs.rest)).first);  	(commented since not related to the problem)  				//printf("rest points to : %p\n", xs.rest); 			        //if (xs.rest != NULL) print_int_list(*xs.rest); }  int main() { 	int_list xs = cons(1,empty); 	printf("element is : %d\n", xs.first); 	printf("next element is : %d\n", (*(xs.rest)).first);  			//printf("rest points to : %p\n", xs.rest); 			//print_int_list(empty);  	print_int_list(xs); }  现在comment之后，main和print_int_list里面要打印的东西完全一样。 但是怎么main打印出来的是 element is : 1 next element is : 0 (which looks good since NULL = 0 in empty)  print_int_list打印出来的是 element is : 1 next element is : 189267603  为什么啊。。 函数： int_list cons(int x, int_list xs) {     // 这里&xs是取的堆栈变量xs的地址，而不是empty的地址，xs只是empty的一个副本，     // 而且函数退出时就不能再用了     int_list newlist = {x, &xs};       return newlist; }
user-0 提问: 关于数组首元素地址，数组名，数组名地址，求解惑

回复:
user: user-0
content: 引用 7 楼 u013163178 的回复:不要以为数组名是指针，它们是有区别的 数组名在单独出现的时候，编译器解析为数组的首地址，即是一个元素的地址，充当sizeof()的参数除外。数组名对应的地址是产量，这个地址数不能自加或者自减的，数组名也不存在与内存中，所以说对数组名取地址是没有意义的，在早期的时候，对数字组名取地址是非法的哦 int a[10]; int *p; &a;//   表示对数组取地址，而不是对数组名取地址，更不是对指针取地址 &p;//这表示对指针取地址   指针是存在于内存中的，它保存了一个地址，指针自己本省也有一个地址，这个地址和他自己的地址是不一样的。指针是可以自加和自减的，自加表示指针指向（保存）的地址变化一个步长，至于一个步长有多长，就要看你的指针指向的数据类型。   非常感谢你这么耐心的解释，也谢谢大家。。。

user: user-1
content: 电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  在C/C++层面的很多概念，在其对应的汇编指令实现层面已经不复存在了。比如数组名。

user: user-2
content: 地址是地址，指针是指针，地址没有类型，指针是有类型的。

user: user-3
content: 无数的新手在这个问题上前赴后继的迷失，找一本好点书看看，真的，“The c programing luanguage"。

user: user-4
content: lz可以看看这个——http://blog.csdn.net/u012421456/article/details/21803797 也可以搜一下，这个问题被讨论的不少了，

user: user-5
content: http://www.ilanever.com/article/sitedetail.html?id=231 希望这里能够帮到你？

user: user-6
content: 不要以为数组名是指针，它们是有区别的 数组名在单独出现的时候，编译器解析为数组的首地址，即是一个元素的地址，充当sizeof()的参数除外。数组名对应的地址是产量，这个地址数不能自加或者自减的，数组名也不存在与内存中，所以说对数组名取地址是没有意义的，在早期的时候，对数字组名取地址是非法的哦 int a[10]; int *p; &a;//   表示对数组取地址，而不是对数组名取地址，更不是对指针取地址 &p;//这表示对指针取地址   指针是存在于内存中的，它保存了一个地址，指针自己本省也有一个地址，这个地址和他自己的地址是不一样的。指针是可以自加和自减的，自加表示指针指向（保存）的地址变化一个步长，至于一个步长有多长，就要看你的指针指向的数据类型。

user: user-0
content: 我自己也琢磨了一下，我的理解是在初始化a[5]这个数组时时不会给a这个数组名称分配地址的，因此a只是一个符号不会有自己的地址。而c中每个变量都应该有个地址，这是c语言的语法的要求，a所指向的值（即a[0]）的地址和a的地址（即含有五个元素的数组的地址）是重合的。 本人刚学C++，上面的理解只是胡思乱想，求解惑。。。。

user: user-7
content: 这个问题网上讨论太多了，你搜一下就有了  http://stackoverflow.com/questions/2528318/how-come-an-arrays-address-is-equal-to-its-value-in-c http://stackoverflow.com/questions/20912353/difference-between-a-and-a-in-c-c-where-a-is-an-array?lq=1

user: user-8
content: 吴二狗当村委书记,  他爹对别人说: 这事情你要找吴二狗 这事情你要找村委书记 这事情你要找我儿子  请问:我儿子一定是村委书记吗 请问:我儿子一定不是村委书记吗  成天就爱研究这种没用的牛角,本质的东西反而一点抓不住

user: user-9
content: a和 &a相同是因为数组表示的地址，如果指针的话才是表示指针的内容的！
user-0 提问: 求教code::blocks调试，帮忙调试下下面代码，没有输出啊

回复:
user: user-0
content: F5设置断点 F7调到下一行 在Debug里面有Debuging windows

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

user: user-2
content: 跟vc6还不都是类似的。只是快捷键不一样，上面的菜单点开来看一下就知道了。 如果我没记错的话，应该是： F8: 开始调试 F7: step over Shift + F7: step into
user-0 提问: C语言缓冲区，与缓冲区的刷新：（什么意思）

回复:
user: user-1
content: scanf是从标准输入缓冲区中读输入的数据，第二个scanf会把第一个scanf的输入的回车赋给ch，可以在第一个scanf后加fflush(stdin)清空输入缓冲区。

user: user-2
content: 挺复杂的一个操作，多写点代码 多找点理论知识，体会下

user: user-3
content: 空格' ' 的 值刚好是32

user: user-4
content: 第一次是你输入两个数之后按下回车后，由回车触发缓冲区刷新。 第二次加入flush后，由flush触发缓冲区刷新。

user: user-3
content: //printf("%d  %d  \n",i,ch); printf("%d  %c  \n",i,ch);

user: user-5
content: 前一种情况下，读入到ch的是空格，因为是按字符读取。  后一种情况下，结果取决于实现，请参考： http://www.cplusplus.com/reference/cstdio/fflush/?kw=fflush

user: user-6
content: 这种问题，网上一搜一大把吧。 一、什么是缓冲区 　　缓冲区又称为缓存，它是内存空间的一部分。也就是说，在内存空间中预留了一定的存储空间，这些存储空间用来缓冲输入或输出的数据，这部分预留的空间就叫做缓冲区。 　　缓冲区根据其对应的是输入设备还是输出设备，分为输入缓冲区和输出缓冲区。 二、为什么要引入缓冲区 　　我们为什么要引入缓冲区呢？ 　　比如我们从磁盘里取信息，我们先把读出的数据放在缓冲区，计算机再直接从缓冲区中取数据，等缓冲区的数据取完后再去磁盘中读取，这样就可以减少磁盘的读写次数，再加上计算机对缓冲区的操作大大快于对磁盘的操作，故应用缓冲区可大大提高计算机的运行速度。 　　又比如，我们使用打印机打印文档，由于打印机的打印速度相对较慢，我们先把文档输出到打印机相应的缓冲区，打印机再自行逐步打印，这时我们的CPU可以处理别的事情。         现在您基本明白了吧，缓冲区就是一块内存区，它用在输入输出设备和CPU之间，用来缓存数据。它使得低速的输入输出设备和高速的CPU能够协调工作，避免低速的输入输出设备占用CPU，解放出CPU，使其能够高效率工作。 三、缓冲区的类型 　　缓冲区 分为三种类型：全缓冲、行缓冲和不带缓冲。 　　1、全缓冲 　　在这种情况下，当填满标准I/O缓存后才进行实际I/O操作。全缓冲的典型代表是对磁盘文件的读写。 　　2、行缓冲 　　在这种情况下，当在输入和输出中遇到换行符时，执行真正的I/O操作。这时，我们输入的字符先存放在缓冲区，等按下回车键换行时才进行实际的I/O操作。典型代表是键盘输入数据。  　　3、不带缓冲 　　也就是不进行缓冲，标准出错情况stderr是典型代表，这使得出错信息可以直接尽快地显示出来。 四、缓冲区的刷新 　　下列情况会引发缓冲区的刷新:    　缓冲区满时; 　　执行flush语句; 　　执行endl语句; 　　关闭文件。 　　可见，缓冲区满或关闭文件时都会刷新缓冲区，进行真正的I/O操作。另外，在C++中，我们可以使用flush函数来刷新缓冲区(执行I/O操作并清空缓冲区)，如： 　　cout< 　　相当于 　　cout<<”\n” <
user-0 提问: 大爷们，，帮帮老弟我把！！！！  新手急啊！！  在线等！！ 

回复:
user: user-1
content: 释放成功了，记得free后将其置为NULL，防止后续误操作

user: user-2
content: 引用 楼主 zhuzhusex1020 的回复: 我在方法fun中创建的内存，释放成功了吗？ 为啥print还能打印出负数啊！！  typedef int Item;  typedef struct node * PNode;   /*定义栈节点类型*/   typedef struct node   {       Item data;       PNode down;   }Node;   PNode fun() { 	PNode pnode = (PNode)malloc(sizeof(Node)); 	pnode->data = 1; 	return pnode; }  int _tmain(int argc, _TCHAR* argv[]) { 	PNode p = fun(); 	printf("%d \n",&p); 	printf("%d \n",p->data); 	free(p); 	printf("%d \n",p->data);     //这里输出的是负数， 我在方法fun中创建的内存，释放成功了吗？ 为啥print还能打印出负数啊！！  	scanf("%d",1); 	return 0; } 那段内存有没凭空消散，为什么不能打印？只是这么做是不对的，你没有从os那里获得这段内存的使用权，下一刻你永远不知道os把这段内存给哪个线程了。 类比下：都知道杀人是犯法的，不能干，但是这个不能干不代表你干不成，哪天你把这事干成了，警察（os）就可能（抓到或者抓不到你）来找你麻烦。（进监狱，段错误）

user: user-3
content: free(p)之后，别的程序段就有机会操作p所指向的这块内存了，再去用p其实非常危险，正确的做法是： free(p); p = NULL; 这样就不会造成误写和误读了。  引用 楼主 zhuzhusex1020 的回复: 我在方法fun中创建的内存，释放成功了吗？ 为啥print还能打印出负数啊！！  typedef int Item;  typedef struct node * PNode;   /*定义栈节点类型*/   typedef struct node   {       Item data;       PNode down;   }Node;   PNode fun() { 	PNode pnode = (PNode)malloc(sizeof(Node)); 	pnode->data = 1; 	return pnode; }  int _tmain(int argc, _TCHAR* argv[]) { 	PNode p = fun(); 	printf("%d \n",&p); 	printf("%d \n",p->data); 	free(p); 	printf("%d \n",p->data);     //这里输出的是负数， 我在方法fun中创建的内存，释放成功了吗？ 为啥print还能打印出负数啊！！  	scanf("%d",1); 	return 0; }

user: user-4
content: 释放后它已经是野指针了，接下来打印什么，以及会不会段错误都不是你能控制的
user-0 提问: “腾讯”三面的题，求答：压栈和出栈时 栈指针是增加还是减少，PC 呢，另外PC 本身是不是寄存器，和栈指针有关系吗？

回复:
user: user-1
content: 引用 15 楼 a345485527 的回复:[quote=引用 8 楼 zxj10620 的回复:] [quote=引用 3 楼 u012538549 的回复:] 压栈减少，出栈增加，栈是从上到下，栈顶在上。pc是寄存器，是程序计数寄存器，pc寄存器里面存放哪条指令的地址，哪条指令就执行 PC放的是相对地址，与当前指令的下一条指令地址的偏移量[/quote] PC放的不是偏移量吧，我怎么记得就是绝对地址？[/quote] 查了一下应该是绝对地址，搞错了，jmp或者call后面那个值对应的二进制数才是偏移量

user: user-2
content: 这些都是跟硬件很相关的东西，不指定硬件平台怎么回答，面试官傻x

user: user-3
content: 腾讯问的问题果然很有深度呀，非科班很难答出这些题来

user: user-4
content: 引用 8 楼 zxj10620 的回复:[quote=引用 3 楼 u012538549 的回复:] 压栈减少，出栈增加，栈是从上到下，栈顶在上。pc是寄存器，是程序计数寄存器，pc寄存器里面存放哪条指令的地址，哪条指令就执行 PC放的是相对地址，与当前指令的下一条指令地址的偏移量[/quote] PC放的不是偏移量吧，我怎么记得就是绝对地址？

user: user-4
content: 都三面了呀？我们简历投递还没截止... 这个应该是平台相关的吧，没有标准规定栈必须向下增长

user: user-5
content: 压栈和出栈时 栈指针是增加还是减少 应该是跟具体的架构有关系的吧，不同的平台，方向应该也不一样的吧

user: user-6
content: http://en.wikipedia.org/wiki/Stack_pointer#Functions_of_the_call_stack

user: user-7
content: 啥叫实时操作系统？

user: user-8
content: 哥们，腾讯现在在哪个学校宣讲？我也马上毕业想试试

user: user-9
content: 引用 楼主 wykqhyjs 的回复:谢谢，如题，尤其是不知道PC 和栈 指针是什么关系  另外 实时操作系统的栈 和分时操作系统的栈 有什么关系和区别没 增长方向还真没什么标准确定，比如arm的就有2个方向共4种增减方式。pc就是个寄存器，pc里面的值就是正在或者将要执行的指令放的地址，至于具体动作还是得看体系结构。有些平台或许不叫pc。  最后一个问题感觉问的好模糊，实时和分时最大的区别就是任务生存时间或者说线程生存时间，实时是给定的，非要扯上栈的我也只能想出栈占用时间有限与无限这样的区别。

user: user-8
content: 压栈减少，出栈增加，栈是从上到下，栈顶在上。pc是寄存器，是程序计数寄存器，pc寄存器里面存放哪条指令的地址，哪条指令就执行

user: user-10
content: 引用 1 楼 TheNewIpad 的回复:push一次， 栈指针减少，减少的长度跟压入长度相关。 pop一次，指针增加，增加的长度跟弹出的长度相同。  PC是计数器，不属于寄存器。  有些平台没有PC， 取代的是CS 和 IP。 我说的增减是intel 平台。其他不知道。

user: user-10
content: push一次， 栈指针减少，减少的长度跟压入长度相关。 pop一次，指针增加，增加的长度跟弹出的长度相同。  PC是计数器，不属于寄存器。  有些平台没有PC， 取代的是CS 和 IP。

user: user-11
content: 引用 6 楼 zhao4zhong1 的回复:啥叫实时操作系统？ 就是及时操作系统

user: user-8
content: 引用 8 楼 zxj10620 的回复:[quote=引用 3 楼 u012538549 的回复:] 压栈减少，出栈增加，栈是从上到下，栈顶在上。pc是寄存器，是程序计数寄存器，pc寄存器里面存放哪条指令的地址，哪条指令就执行 PC放的是相对地址，与当前指令的下一条指令地址的偏移量[/quote] 嗯，下一条指令地址的偏移量

user: user-8
content: 引用 8 楼 zxj10620 的回复:[quote=引用 3 楼 u012538549 的回复:] 压栈减少，出栈增加，栈是从上到下，栈顶在上。pc是寄存器，是程序计数寄存器，pc寄存器里面存放哪条指令的地址，哪条指令就执行 PC放的是相对地址，与当前指令的下一条指令地址的偏移量[/quote] 嗯，当前指令的下一条指令地址

user: user-1
content: 引用 3 楼 u012538549 的回复:压栈减少，出栈增加，栈是从上到下，栈顶在上。pc是寄存器，是程序计数寄存器，pc寄存器里面存放哪条指令的地址，哪条指令就执行 PC放的是相对地址，与当前指令的下一条指令地址的偏移量
user-0 提问: 刚开始自学C语言，试着编写了一个简单的计算器，遇到问题，望各位帮忙解答一下

回复:
user: user-1
content: 弄个死循环~~再设置个跳出循环的条件，就行了 while(true) {     do something;     if(condition)     {         break;      } }

user: user-2
content: 写个循环~，1楼正解！

user: user-0
content: 谢谢大家！一楼的解答是我预期的效果。非常感谢！

user: user-3
content: 1L正解！！！

user: user-4
content: #include"stdio.h" int main() { 	char d; 	float a,b,c; 	printf("please input two numbers\nthen use '+,-,*,/'operation:"); 	scanf("%f%c%f",&a,&d,&b); 	switch(d) 	{ 	case '+':c=a+b;break; 		case '-':c=a-b;break; 			case '*':c=a*b;break; 				case '/':c=a/b;break; 	} 	printf("%.1f is the answer.\n",c); }  楼主可以作为参考。

user: user-5
content: 你每次就只有一个运算啊！

user: user-6
content: 最简单的方法就是加一层循环，不过这种方法会让程序一直运行，直到你ctrl+c。 # include <stdio.h>  int main(void) {   int a,b;   char ch;    while (1) {   printf("请输入一个式子(比如：4+6):\n");   scanf("%d",&a);   ch=getchar();   scanf("%d",&b);       switch(ch)   {                      case'+':printf("%d+%d=%d\n",a,b,a+b);break; case'-':printf("%d-%d=%d\n",a,b,a-b);break; case'*':printf("%d*%d=%d\n",a,b,a*b);break; case'/':printf("%d/%d=%d\n",a,b,a/b);break; default:printf("enter data error!please enter again!\n");   }  }   return 0; }
user-0 提问: 单链表的插入

回复:
user: user-1
content: C只能用＊＊

user: user-2
content: 引用 5 楼 max_min_ 的回复:[quote=引用 4 楼 tuzhutuzhu 的回复:] [quote=引用 2 楼 u012586257 的回复:] 原因在于主程序里的L和子程序里的L不是一回事。子程序里虽然初始化了L却没办法返回给主程序，所以主程序L始终是NULL。 可以把initList改为返回list，即 list initList(void); 主程序里 list L = initList(); 去掉creatlist()里面的initList调用 引用 3 楼 max_min_ 的回复:2楼正解，指针地址传递也只是值传递而已！这里传引用或者双指针 最简单的方法还是在main中给L malloc一块空间吧，然后以L为头结点创建一个链表[/quote] 那它的create函数就没有必要了！再说也不符合实际开发的！[/quote] 版主说的对，是我欠考虑了

user: user-3
content: 引用 4 楼 tuzhutuzhu 的回复:[quote=引用 2 楼 u012586257 的回复:] 原因在于主程序里的L和子程序里的L不是一回事。子程序里虽然初始化了L却没办法返回给主程序，所以主程序L始终是NULL。 可以把initList改为返回list，即 list initList(void); 主程序里 list L = initList(); 去掉creatlist()里面的initList调用 引用 3 楼 max_min_ 的回复:2楼正解，指针地址传递也只是值传递而已！这里传引用或者双指针 最简单的方法还是在main中给L malloc一块空间吧，然后以L为头结点创建一个链表[/quote] 那它的create函数就没有必要了！再说也不符合实际开发的！

user: user-2
content: 引用 2 楼 u012586257 的回复:原因在于主程序里的L和子程序里的L不是一回事。子程序里虽然初始化了L却没办法返回给主程序，所以主程序L始终是NULL。 可以把initList改为返回list，即 list initList(void); 主程序里 list L = initList(); 去掉creatlist()里面的initList调用 引用 3 楼 max_min_ 的回复:2楼正解，指针地址传递也只是值传递而已！这里传引用或者双指针 最简单的方法还是在main中给L malloc一块空间吧，然后以L为头结点创建一个链表

user: user-3
content: 2楼正解，指针地址传递也只是值传递而已！这里传引用或者双指针

user: user-4
content: 原因在于主程序里的L和子程序里的L不是一回事。子程序里虽然初始化了L却没办法返回给主程序，所以主程序L始终是NULL。 可以把initList改为返回list，即 list initList(void); 主程序里 list L = initList(); 去掉creatlist()里面的initList调用

user: user-2
content: 问题在：list L=NULL; 这里的L指向NULL，但是你在creatlist的函数中使用了L->next，必然会出错。 改成list L=malloc(sizeof（struct node）)
user-0 提问:  use "::" under C 

回复:
user: user-0
content: 上面传递的版本有个bug，在strufunc.c里，涉及到的几个stringparser实例初始化语句用了::语法，是不允许的。 看没有人用，继续的更新就不上传了，因为还要花时间打包开发环境。

user: user-1
content: 不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件，或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。

user: user-0
content: 更新     2014，april 3 1，修复了几个bug。 2，源码变更为第二个版本的"::"语法，这样就再用不到strufunc1了。

user: user-2
content: 为毛也自己写stack。。C++都有啊。

user: user-3
content: ……直接用C++得了。 这种写法跟OOP有什么关系么。

user: user-4
content: 牛

user: user-0
content: 回复#2： 在极少的情形下，这个工具是有用处的。像比，你要给linux写模块。  回复#4： “带来复杂性的东西”——容我分辩一下，工具包用起来并不复杂。你只需要： 0，把工具包放到系统的搜索$PATH下。 1，如果想用"::"操作一个结构体xx，那它要声明在xx.h里，xx.c里的相关函数要以xx_前缀。           这个要求不过分，像比as3语言里就是这样。至于xx_前缀，也是不少c程序员本来的习惯。 2，把工具包里的makefile模板拷贝到工作目录。                     这要求你得用makefile编译文件，对linux下的同学不算过分。 3，没有了。  如果咬咬牙，可以把这个工具写成“高大全”的类型，也不需要makefile，直接用它封装gcc，相当于给c编译器加个壳，用来支持“：：”语法。 帖子里讲的是原理，所以话很多。 希望有人试试，唉，不骗你。

user: user-5
content: stringparser_go_tail(&parser); 为啥觉得别扭啊，我看着挺舒服的啊

user: user-6
content: 首先，这个确实很牛逼 其次，说实话估计没人敢用。这是为自己带来复杂性的东西
user-0 提问: grouping="\3",这个数字是二进制的3     ，这里的 “二进制的3” 是什么意思？

回复:
user: user-1
content: grouping="\3"，说的是千分的写法： 1,234,456

user: user-1
content: 11是二进制的3

user: user-2
content: 二进制的3？ 二进制没有3啊
user-0 提问: modf，ldexp的ld，SIGINT，localeconv的conv，sig_atomic_t的atomic的全称是啥？只要简单写个名字就够了

回复:
user: user-0
content: C 库函数里的

user: user-1
content: linux中的东西？

user: user-2
content: modf = modulo fractional? ldexp = load exponent SIGINT = signal interrupt  conv = conversion atomic = atomic

user: user-0
content: 为啥没人回答捏？

user: user-0
content: 顶上去楼。。。。
user-0 提问: hook全局api的问题

回复:
user: user-0
content: 需要编程实习实现……

user: user-0
content: 另外我想禁止用户添加账户有没有好的办法？

user: user-0
content: 引用 3 楼 buyong 的回复:NetUserAdd? are you sure all winows add user method must ues this func? 请问一下怎么能确定在管理/本地用户和组/用户  下面添加账户调用什么函数？

user: user-1
content: 组策略里面好象可以直接设置吧。

user: user-2
content: NetUserAdd? are you sure all winows add user method must ues this func?

user: user-3
content: 什么叫没hook成功？首先确定是不是你hook这个函数就行，加个MessageBox吧，当添加账户的时候就弹出一个对话框，没有弹出说明并没有调用这个函数， 然后r3钩子注入参考http://blog.csdn.net/user-3/article/details/6255636

user: user-0
content: 自己顶一下 求大神支招啊~
user-0 提问: 关于linux c文件操作的疑问

回复:
user: user-1
content: 刷数据到磁盘吧, 一个sync操作，根据传入的描述符是1还是2, 并且还要通过一次fileno校验一下fd1和2是否真的用于stdout和stderr。

user: user-2
content: 分不同的情况，设置不同的流对象啊HOHO

user: user-3
content: 根据输入的参数，清空输出缓冲区，或者错误缓冲区。 即，将输出缓冲区或错误缓冲区的东西展示出来。

user: user-4
content: 将缓冲中的文件内容刷到目的文件： 如果是stdin,stdout，使用fflush刷到控制输入、输出； 如果是stdin,stdout意外的其他文件，刷新到磁盘。

user: user-5
content: 有吊用，哈哈

user: user-6
content: 强制刷新缓冲区以同步。  引用 楼主 ididy10 的回复:下面的这个函数有什么功能，求指导！ bool u_sync_fd(int fd) {     FILE *fp;      if (fd < 0)         return false;      switch (fd) {     case STDOUT_FILENO:         fp = stdout;         break;     case STDERR_FILENO:         fp = stderr;         break;     default:         fp = NULL;         break;     }     if (fp) {         if (fileno(fp) == fd)             fflush(fp);         return true;     }     return fdatasync(fd) == 0; }
user-0 提问: 请问这段代码是什么意思

回复:
user: user-1
content: 做CRC？

user: user-2
content: 不是加密，原数据又没变。肯定是校验，接收方把收到的数据一路异或下去最后得到0就校验无误。不过最后 bySource[j++]  ^= bSum; 这里要保证要保证数组之前清过0才对

user: user-3
content: 会不会是特定的转换为了掩盖？或者加密？

user: user-4
content: 这一点看出来是什么操作了！只是异或后结果不知道拿去干啥了

user: user-0
content: 引用 2 楼 boxmanstan 的回复:你自己才知道用来做什么  做异或操作  这里保持符号位不变，我列了一串01试了一下，没找出规律 我也不知道，这是公司的代码。把这个字节数组最后传到com口给硬件了，硬件那边怎么用的我没有代码

user: user-5
content: 你自己才知道用来做什么  做异或操作  这里保持符号位不变，我列了一串01试了一下，没找出规律

user: user-6
content: 把所有元素异或起来而已，估计是用于做什么校验之类的。  引用 楼主 iloveiverson 的回复: BYTE bySoure[512]; . . . . //往这个数组里面写东西，一共写了j个字节 unsigned char  bSum=0; for(int i=0;i < j;i++) { bSum ^= bySoure[i]; } bySource[j++]  ^= bSum;  谁知道中间那个循环是什么意思？
user-0 提问: 关于 GetObjectArrayElement获取对象数组的问题

回复:
user: user-0
content: 引用 1 楼 user-1 的回复:GetObjectArrayElement是不是JNIEnv的对象的成员呢？  什么意思，它应该是JAVA和C的转换接口。

user: user-1
content: GetObjectArrayElement是不是JNIEnv的对象的成员呢？
user-0 提问: SWU 求助

回复:
user: user-1
content: 引用 2 楼 u013978386 的回复:大致的原理可以理解一些，就是一些小问题只是在自己摸索，很费劲。 char p[] 标识数组的意思，只是在初始化时候这么用，  char a ; 只能存放一个字节的哦！  ps：楼主找一个基础的c语言书看看吧！c和指针

user: user-2
content: 1、a='2v'   字符型的常量只能是一个字符啊! 2、如果已经给字符串的初始值了，就没有必要给他定长度了。      具体的内容先看书本上关于字符的这一章。 3、对于vi的使用，直接在新生手册里面有的，积极去找资料。

user: user-0
content: 大致的原理可以理解一些，就是一些小问题只是在自己摸索，很费劲。

user: user-3
content: 我想LZ的问题可以总结为： 1. 怎样搭建c语言编程环境？     答： 可以网络搜索，有很多相关信息。 2. 怎样编写c语言代码？     答：找一本合适的教材。如《C Primer Plus》《The C Programming Language》

user: user-4
content: vm9 是什么啊,看楼主的编辑器这么好看,应该是vs2012以上了

user: user-3
content: "#define NUM 10" 可以翻看c语言书籍的“宏”相关章节。  “char c1 []” 可以翻看c语言书籍的“数据类型”，“数组”，“字符串”相关章节。  “VM 9” 不知道是不是Vmware 9?如果是，这是1个虚拟机软件，用来模拟pc计算机，可以在里面安装其他操作系统。 如果是学习c语言开发，不用这么麻烦。直接在windows操作系统下配置c语言开发环境即可。至于怎么配置， 可以网络搜索，不要放弃这么强大的网络，呵呵。
user-0 提问: oj上一道 题就是不知道怎么错了

回复:
user: user-1
content: 引用 4 楼 u011584929 的回复:知道为什么错了。。因为Oj上不支持fllush(stdin);这个微软自己外带的函数 试试rewind(stdin);

user: user-0
content: 知道为什么错了。。因为Oj上不支持fllush(stdin);这个微软自己外带的函数

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

user: user-0
content: 还是不对，不知道哪里有逻辑错误。

user: user-2
content: int produce(int x,int y)
user-0 提问: 奇怪的指针使用

回复:
user: user-1
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。  其实电脑开机后物理内存的每个字节都是可读写的，区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。

user: user-2
content: 楼主没运行吗，这个运行肯定是要有警告的。 char **next[1];数组指针没有初始化  char **next[1] = {NULL}; 初始化后我在VC6.0上运行OK没有问题。

user: user-0
content: 引用 4 楼 tuzhutuzhu 的回复:修改方法的话，这么做就可以了： char **next[1];-->char *next; strtol(s,next[0],12)-->strtol(s,&next,12) 为什么你这么一改就对了？我的方法有何缺陷？？

user: user-3
content: 修改方法的话，这么做就可以了： char **next[1];-->char *next; strtol(s,next[0],12)-->strtol(s,&next,12)

user: user-4
content: 这个不太可能呀，二者一致！

user: user-5
content: 两种用法都是错的，但是运行时会不会段错误就看楼主运气了

user: user-3
content: LZ，你确定第一种写法不会出现segment fault？
user-0 提问: 第一次来论坛，希望大家多多关照哈

回复:
user: user-1
content: 使用电脑计时有时误差会很大，因为待测程序段的运行会影响电脑时钟。 将待测程序段循环足够多次，手动掐秒表计时可能更准确。

user: user-2
content: 计算程序运行时间，使用gettimeofday。 在程序开始和结束分别调用两次gettimeofday，然后相减，取得运行时间
user-0 提问: # 2345 "src/app.cpp" 这种用法是什么意思，后面的数字怎么可以查到含义

回复:
user: user-0
content: 实际调整代码后，发现#1234这种没有具体含义。

user: user-0
content: 这个不是用VS开发的，不过倒可以在VS下试试。 引用 1 楼 zhao4zhong1 的回复:VS IDE中，在不明白的符号上点鼠标右键，选转到定义。

user: user-1
content: VS IDE中，在不明白的符号上点鼠标右键，选转到定义。
user-0 提问: C语言问题 

回复:
user: user-1
content: 对数组名取地址，得到的是数组的地址。值就等于数组名，仅仅是值相等，意义不同 所以：&a得到数组的地址，再*(char**)&a，得到的是数组的第一个元素

user: user-0
content: *(char**)&a 表示什么含义？？？ 谁要是能把这个含义帮我讲清楚了 我也就明白了，谢谢

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

user: user-3
content: 数组名不等于指针。数组名只是一个符号， 指针才是变量。 p为指向数组的指针，&p为存储指针的地址。这两个值是不一样的。 a和&a的值是一样的。

user: user-0
content: 现在我的迷惑是： *(char**)&a == a 为什么不等； *(char**)&a 表示什么含义？？？

user: user-0
content: char a[3] = {‘a’，‘b’}   改成  char a[3] = {‘x’，‘y’}  是我失误了，现在好了 我知道正确答案，就是有点迷糊，求大神帮忙哦

user: user-1
content: #include <stdlib.h> #include <stdio.h>  int main() {         char a[3] = {'a', 'b'};         char *p = a;          printf("p=%p, a=%p\n", p, a);          printf("&p=%p, &a=%p\n", &p, &a);         printf("*(char **)&p=%p, *(char **)&a=%p\n", *(char **)&p, *(char **)&a);         printf("*(char **)&p=%p, p=%p\n", *(char **)&p,p);         printf("*(char **)&a=%p, a=%p\n", *(char **)&a, a);           return 0; }

user: user-4
content: lz下边的a是说数组名还是字符啊，的把问题描述清楚啊

user: user-1
content: LZ，对于这种问题，最简单的方法就是写个小程序，把每个表达式的左右值都打印出来。这样就一目了然了，而且也便于分析
user-0 提问: [求助]代码报内存错误

回复:
user: user-1
content: 要么 char *str = "            abcdefg        hijklmn      opq rst        uvwxyz "; 改为 char str[] = "            abcdefg        hijklmn      opq rst        uvwxyz ";  要么 #pragma comment(linker,"/SECTION:.rdata,RW") //加这句可以让常量区可写，后果自负！

user: user-0
content: 引用 1 楼 user-2 的回复:char *str = "            abcdefg        hijklmn      opq rst        uvwxyz "; 这里str指向的是只读存储区，当然不能修改。定义的地方改成字符数组 非常感谢！

user: user-2
content: char *str = "            abcdefg        hijklmn      opq rst        uvwxyz "; 这里str指向的是只读存储区，当然不能修改。定义的地方改成字符数组
user-0 提问: 1>sph_render.cpp(22): fatal error C1083: 无法打开包括文件:“Cg/cg.h”: No such file or dir

回复:
user: user-1
content: 楼主能不能把cg.h,cg.lib,cg.dll这几个文件发我一下，我也出现了这个错误，但是我里面没有cg.h,cg.lib,cg.dll

user: user-2
content: 搜“跟我一起写makefile” 在“附加头文件所在目录”中不要填写相对路径，要填写绝对路径。

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:VC6： 工程、设置、C/C++、分类：Preprocessor、附加包含路径：填写附加头文件所在目录 逗号间隔多项 工程、设置、Link、分类：Input、附加库路径：填写附加依赖库所在目录 分号间隔多项 工程、设置、Link、分类：Input、对象/库模块：填写附加依赖库的名字.lib 空格间隔多项 VS20xx： 项目、属性、C/C++、附加包含目录：填写附加头文件所在目录 分号间隔多项 项目、属性、链接器、常规、附加库目录：填写附加依赖库所在目录 分号间隔多项 项目、属性、链接器、输入、附加依赖项：填写附加依赖库的名字.lib 空格或分号间隔多项 程序本来运行地好好的，今天又遇到这个问题了，按你的方法改了还是不行

user: user-0
content: 这个看起来好麻烦啊，不知道是不是能从根本上解决问题，嵌入清单改成否反正能解决，不过还是mark一下~

user: user-2
content: VC6： 工程、设置、C/C++、分类：Preprocessor、附加包含路径：填写附加头文件所在目录 逗号间隔多项 工程、设置、Link、分类：Input、附加库路径：填写附加依赖库所在目录 分号间隔多项 工程、设置、Link、分类：Input、对象/库模块：填写附加依赖库的名字.lib 空格间隔多项 VS20xx： 项目、属性、C/C++、附加包含目录：填写附加头文件所在目录 分号间隔多项 项目、属性、链接器、常规、附加库目录：填写附加依赖库所在目录 分号间隔多项 项目、属性、链接器、输入、附加依赖项：填写附加依赖库的名字.lib 空格或分号间隔多项

user: user-0
content: 第一次发帖，居然还是自己解决了问题，噗~~~~~

user: user-0
content: 问题解决了，原来就是忘了把嵌入清单工具改成否了，so easy~哈哈哈
user-0 提问: 奇怪的指针声明

回复:
user: user-1
content: 知识点： 数组->指针转换。

user: user-1
content: size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );  可以转化void*， 所以没有编译OK。

user: user-2
content: 求送点分，我没分了，谢谢

user: user-3
content: part[1]的结构： part是一个指向数组的指针，所以如下 part-->{结构}，{结构} 但是数组只有一个元素，所以上图中实际上只有一个结构。 这样的话，你读的数据放在了用来保存结构的地址空间中。  *part[1] part-->{指针}-->{结构} 其中，结构要经malloc分配能合法使用。 但是你实际把数值写进了保存指针的空间，大小不一定符合可能会越界。之所以没有出错，是因为你程序太短了。

user: user-0
content: 引用 9 楼 u012033027 的回复:Part *part[1] 这样应该是要出错的。 没出错是因为你没有执行到会出错的地方。 我执行完整个程序了啊，就是一开始的那个程序

user: user-3
content: Part *part[1] 这样应该是要出错的。 没出错是因为你没有执行到会出错的地方。

user: user-0
content: 引用 3 楼 turingo 的回复:碰巧而已，Part*的话需要先用malloc分配内存。  [quote=引用 2 楼 u014463229 的回复:] [quote=引用 1 楼 turingo 的回复:] Part part[1]完全符合语法啊，有什么疑问呢？  [quote=引用 楼主 u014463229 的回复:] #include <stdio.h> #include <stdlib.h> int main() {     FILE *file=fopen("rr","r");     typedef struct{         int i;         long a;     }Part;     Part part[1];      //这里改成Part *part[1];为什么也对？     fread(part,sizeof(Part),1,file); } [/quote] 看后面的注释啊，问题在注释里[/quote][/quote] 你说的这个碰巧而已实话说我听不懂什么意思

user: user-0
content: 引用 5 楼 wang0635 的回复:fread的第一个参数只要是指针就行，第二个只要是size_t的就行，sizeof（）括号里什么都可以，编译器只管这些了，后果自负 但是运行也没错误啊

user: user-0
content: 引用 4 楼 u012033027 的回复:也许指针和数组元素的大小刚好相等，对sizeof操作来说，他们的结果是相同的。 我的意思是fread第一个参数为什么没报错，和sizeof没关系

user: user-4
content: fread的第一个参数只要是指针就行，第二个只要是size_t的就行，sizeof（）括号里什么都可以，编译器只管这些了，后果自负

user: user-3
content: 也许指针和数组元素的大小刚好相等，对sizeof操作来说，他们的结果是相同的。

user: user-5
content: 碰巧而已，Part*的话需要先用malloc分配内存。  引用 2 楼 u014463229 的回复:[quote=引用 1 楼 turingo 的回复:] Part part[1]完全符合语法啊，有什么疑问呢？  [quote=引用 楼主 u014463229 的回复:] #include <stdio.h> #include <stdlib.h> int main() {     FILE *file=fopen("rr","r");     typedef struct{         int i;         long a;     }Part;     Part part[1];      //这里改成Part *part[1];为什么也对？     fread(part,sizeof(Part),1,file); } [/quote] 看后面的注释啊，问题在注释里[/quote]

user: user-0
content: 引用 1 楼 turingo 的回复:Part part[1]完全符合语法啊，有什么疑问呢？  [quote=引用 楼主 u014463229 的回复:] #include <stdio.h> #include <stdlib.h> int main() {     FILE *file=fopen("rr","r");     typedef struct{         int i;         long a;     }Part;     Part part[1];      //这里改成Part *part[1];为什么也对？     fread(part,sizeof(Part),1,file); } [/quote] 看后面的注释啊，问题在注释里

user: user-5
content: Part part[1]完全符合语法啊，有什么疑问呢？  引用 楼主 u014463229 的回复:#include <stdio.h> #include <stdlib.h> int main() {     FILE *file=fopen("rr","r");     typedef struct{         int i;         long a;     }Part;     Part part[1];      //这里改成Part *part[1];为什么也对？     fread(part,sizeof(Part),1,file); }
user-0 提问: 求解释下面程序的结果

回复:
user: user-1
content: 引用 3 楼 boxmanstan 的回复:return;+1 主函数要近回int型的！！

user: user-2
content: for (A;B;C) D; //等价于 {  A;  while (1) {   if (!(B)) break;   D;   C;  } }

user: user-3
content: return;

user: user-4
content: 什么结果都不会有，因为 for 循环里 i 初始化为4之后一开始就不满足循环条件，导致此 for 循环根本没有得到执行。

user: user-0
content: 我知道了，查了一下书 ，原来for（表达式1，表达式2，表达式3）语句的执行过程是1.先求表达式1 。2.再求表达式2，若真执行语句，否则退出循环。3.求解表达式3 4转回步骤2
user-0 提问: C语言中的 （无符号字符指针）unsigned char *pImage 对应JAVA的byte[]是吗？

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

user: user-0
content: 还有继续补充的吗，就要接贴了。

user: user-2
content: 大概是这个意思。  引用 4 楼 lgmsyy 的回复:也就是说JAVA读取图片信息保存在byte[]后，可以将byte[]作为参数传给C语言的 unsigned char *pImage;(当然，中间需要JNI) 而并不需要在意byte是有符号的，而unsigned char *pImage是无符号的，是这样吗？  [quote=引用 3 楼 turingo 的回复:] 直接转就可以了。  [quote=引用 楼主 lgmsyy 的回复:] 但是byte[]怎么让他也是无符号的呢。  是这样的，在C中读取图片保存到无符号的字符指针变量。当读取的时候打印出>0的数字  但是JAVA读取图片保存在byte[]中，读取的时候，发现有的数据是负数。我如何将JAVA的byte[]也保存成无符号的呢。  有点绕，可能做过的人明白我的意思。[/quote][/quote]

user: user-0
content: 也就是说JAVA读取图片信息保存在byte[]后，可以将byte[]作为参数传给C语言的 unsigned char *pImage;(当然，中间需要JNI) 而并不需要在意byte是有符号的，而unsigned char *pImage是无符号的，是这样吗？  引用 3 楼 turingo 的回复:直接转就可以了。  [quote=引用 楼主 lgmsyy 的回复:] 但是byte[]怎么让他也是无符号的呢。  是这样的，在C中读取图片保存到无符号的字符指针变量。当读取的时候打印出>0的数字  但是JAVA读取图片保存在byte[]中，读取的时候，发现有的数据是负数。我如何将JAVA的byte[]也保存成无符号的呢。  有点绕，可能做过的人明白我的意思。[/quote]

user: user-2
content: 直接转就可以了。  引用 楼主 lgmsyy 的回复:但是byte[]怎么让他也是无符号的呢。  是这样的，在C中读取图片保存到无符号的字符指针变量。当读取的时候打印出>0的数字  但是JAVA读取图片保存在byte[]中，读取的时候，发现有的数据是负数。我如何将JAVA的byte[]也保存成无符号的呢。  有点绕，可能做过的人明白我的意思。

user: user-0
content: 引用 1 楼 user-3 的回复:为何要把二进制数据当作数字或者字符串打印，没有意义的事情。  打印出来是正是负完全取决于你用有符号还是无符号存储，可见java的byte是有符号的。  C语言对外提供的接口参数要求是无符号字符指针类型，这里保存的是图片信息。  而JAVA读取图片后保存在byte[]中，因为byte[]是带符号的，我不知道这样传给C的参数unsigned char *是否可以

user: user-3
content: 为何要把二进制数据当作数字或者字符串打印，没有意义的事情。  打印出来是正是负完全取决于你用有符号还是无符号存储，可见java的byte是有符号的。
user-0 提问: 对统一个文件进行读取图片，为什么C语言和JAVA的结果不一样呢。我如何才能让JAVA读取和C一样的结果呢？

回复:
user: user-1
content: 1、数据本质上都是一样的，只是被理解为有符号数和无符号数而已； 2、用byte类型就好，不需要转换的，后续主要把它理解为无符号数即可； 3、如果应是想转换，那么可以这样： 正常情况下，Java提供的数据类型是有符号signed类型的，可以通过位运算的方式得到它们相对应的无符号值： public int getUnsignedByte (byte data) {     return data & 0x0FF;  }  引用 楼主 lgmsyy 的回复:C语言：	 	FILE *fpImageFile; 	long lBegin, lEnd; 	unsigned char *pImage; 	int  nImageSize; 	 	fpImageFile = fopen("a.bmp", "rb");//读取图片 	 	lBegin = ftell(fpImageFile); 	fseek(fpImageFile, 0L, SEEK_END); 	lEnd = ftell(fpImageFile); 	nImageSize = int(lEnd - lBegin); 	pImage = new unsigned char[nImageSize]; 		 	fseek(fpImageFile, 0L, SEEK_SET);	 	fread(pImage, sizeof(unsigned char), nImageSize, fpImageFile);	         	fclose(fpImageFile); 	         int k=0; 	for(k=0;k<10;k++){ 		printf("%d : %d\n",k,pImage[k]); 	} 打印字符，假设前10个 0 : 66 1 : 77 2 : 202 3 : 61 4 : 7 5 : 0 6 : 0 7 : 0 8 : 0 9 : 0  ------------------------------------------------- JAVA语言：      public  byte[] image2Bytes(String imagePath) throws Exception {                 	 BufferedImage bu=ImageIO.read(new File(imagePath));       	           ByteArrayOutputStream imageStream = new ByteArrayOutputStream();                      try {           	               ImageIO.write(bu, "bmp", imageStream);                          } catch (Exception e) {           	               e.printStackTrace();            }            imageStream.flush();                    return imageStream.toByteArray();      } -------------------- 	byte[] imgBuff = hello.image2Bytes("a.bmp");			 	int nImageSize = imgBuff.length;	  	for(int i=0;i<10;i++){ 		if(imgBuff[i]!=-1){ 			System.out.println(i+":"+imgBuff[i]); 		}				 	}   读取字符，假设前十个 0:66 1:77 2:-54 3:61 4:7 5:0 6:0 7:0 8:0 9:0 ------------------------------ 为什么第二个元素的内容不一样呢？ 真实的情况下，不仅仅读取是个元素，图片有多大就图去多大，这样。C和JAVA打印出来的数据就以后很大的不同。

user: user-2
content: 引用 2 楼 lgmsyy 的回复:[quote=引用 1 楼 user-2 的回复:] 无符号和有符号数。 请问怎么让JAVA的byte[]也是无符号的呢。目的是与C语言的 unsigned char *pImage对应。  我实验了以下，但是不行         byte[] mybyte = bos.toByteArray();                 for(int i=0;i<mybyte.length;i++){         	mybyte[i] = mybyte[i] & 0xff;           }[/quote] java没有无符号的byte,可以用更长的类型存储，然后再截断吧。

user: user-0
content: 引用 1 楼 user-2 的回复:无符号和有符号数。 请问怎么让JAVA的byte[]也是无符号的呢。目的是与C语言的 unsigned char *pImage对应。  我实验了以下，但是不行         byte[] mybyte = bos.toByteArray();                 for(int i=0;i<mybyte.length;i++){         	mybyte[i] = mybyte[i] & 0xff;           }

user: user-2
content: 无符号和有符号数。
user-0 提问: clock_t实际是什么类型 ？怎么打出clock（）返回值？

回复:
user: user-1
content: clock()的粒度比较粗，各大平台的clib实现基本都保持在10ms左右的粒度上。需要更细粒度的你不能用clock()。

user: user-0
content: 这个问题还没解决那： 我把lu换成ld格式码，为什么输出还是0？

user: user-0
content: 顶上去累了乐乐

user: user-0
content: 我把lu换成ld格式码，为什么输出还是0？

user: user-2
content: C:\Program Files\Microsoft Visual Studio 10.0\VC\include\time.h      82: typedef long clock_t;

user: user-3
content: clock_t是个长整型数。 #include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { long i = 10000000L; clock_t start, finish; double duration; /* 测量一个事件持续的时间*/ printf( "Time to do %ld empty loops is ", i) ; start = clock(); while( i-- ); finish = clock(); duration = (double)(finish - start) / CLOCKS_PER_SEC; printf( "%f seconds\n", duration ); system("pause"); }

user: user-2
content: VS IDE中，在不明白的符号上点鼠标右键，选转到定义。
user-0 提问: 如何将mac地址转换成6字节的字符数组

回复:
user: user-1
content: 16进制转字节表示。

user: user-2
content: 第6行maxhex[i]=(char)v; 纠正为machex[i]=(char)v;

user: user-2
content: char macstr[18] = "00:0f:2a:d2:fe:ef"; char machex[6]; int v,i; for (i=0;i<6;i++) {     sscanf(macstr+3*i,"%2x",&v);     maxhex[i]=(char)v; }  作为一个C程序员，对  scanf,sscanf,fscanf  printf,sprintf,fprintf 这类函数的用法，还是要做到“拳不离手，曲不离口”的。

user: user-0
content: 嗯，谢谢了，实验了，没有问题！！！

user: user-3
content: 要这个效果吗？     char mac[] = "00:0f:2a:d2:fe:ef";     unsigned char addr[6];     sscanf(mac,"%2x:%2x:%2x:%2x:%2x:%2x",addr,addr+1,addr+2,addr+3,addr+4,addr+5);
user-0 提问: 刚下的c-free，怎么会这样啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊

回复:
user: user-1
content: 无聊路过看看。  zhao4zhong1  就是CSDN的佑哥

user: user-2
content: 把源代码的后缀名.cpp改成.c

user: user-3
content: 推荐使用vc或者vs。如果是win8的系统的话，vc不怎么兼容，只有用vs。win8以下的应该两种都兼容。具体下载地址你可以去百度。

user: user-4
content: stdio.h找不到！

user: user-5
content: http://www.microsoft.com/visualstudio/chs/downloads#d-2010-express 点开Visual C++ 2010 Express下面的语言选‘简体中文’，再点立即安装

user: user-0
content: #include<stdio.h> void main() { 	printf("运行不了"); }
user-0 提问: 不在数组正常坐标的值是什么值？

回复:
user: user-1
content: int a[] = {1,2,3}   对数组的访问, 其实就是以数组的首地址为基地址, 然后以索引为偏移取地址访问数据.  按int为4字节为例 比如 a数组首地址为 0x12340000  那么 a[-1] 即相当于访问  0x12340000 - 4  =  0x1233FFFC  其它类似.

user: user-2
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对应的汇编并单步执行观察相应内存和寄存器变化。）  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

user: user-3
content: 引用 楼主 u012421069 的回复:int a[] = {1,2,3}  a[-1] a[188] a[11123]  这些值代表的是什么？在内存中吗？ 就你上面几个例子，都在内存中. a是数组，也就是一个分配的地址 a[-1]表示a的地址减去int个字节 a[188]表示a的地址加上188个int字节。

user: user-2
content: 其实电脑开机后物理内存的每个字节都是可读写的，区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。
user-0 提问: 结构体大小的计算中嵌套结构体的情况

回复:
user: user-0
content: 谢谢各位的解释，借用了zhao4zhong1大牛的代码测试了一下，编译器设置仍然是默认8，结果如图，是我那个理解

user: user-1
content: 打印两个变量的内存地址看一下就知道了。

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("\n");     printf("A1.a %d\n",field_offset(A1,a));     printf("A1.b %d\n",field_offset(A1,b));     printf("A1.c %d\n",field_offset(A1,c));     printf("\n");     printf("A2.a %d\n",field_offset(A2,a));     printf("A2.b %d\n",field_offset(A2,b));     printf("A2.c %d\n",field_offset(A2,c));     printf("\n");     printf("A4.a %d\n",field_offset(A4,a));     printf("A4.b %d\n",field_offset(A4,b));     printf("A4.c %d\n",field_offset(A4,c));     printf("\n");     printf("A8.a %d\n",field_offset(A8,a));     printf("A8.b %d\n",field_offset(A8,b));     printf("A8.c %d\n",field_offset(A8,c));     printf("\n");     printf("A16.a %d\n",field_offset(A16,a));     printf("A16.b %d\n",field_offset(A16,b));     printf("A16.c %d\n",field_offset(A16,c));     printf("\n");     return 0; } //AD.a 0 //AD.b 4 //AD.c 24 // //A1.a 0 //A1.b 4 //A1.c 17 // //A2.a 0 //A2.b 4 //A2.c 18 // //A4.a 0 //A4.b 4 //A4.c 20 // //A8.a 0 //A8.b 4 //A8.c 24 // //A16.a 0 //A16.b 4 //A16.c 24 // //

user: user-3
content: 输出它们的指针, 应该会有所发现.

user: user-4
content: 你的理解应该是对的，你同学的错了 首先要搞清楚为什么需要字节对齐。如果是你同学的那种方式，那么cpu在读取stB的时候，需要做两次读操作。这样很耗时的
user-0 提问: 将十进制整数转换为字符串的printd函数看不明白

回复:
user: user-0
content: 明白了，有一种顿悟的感觉！！！！higxin

user: user-1
content: 用gcc测试通过，不过puchar是不是写错了，是不是putchar。。。。。。

user: user-0
content: 唉，还是不懂啊，

user: user-2
content: 引用 6 楼 u014082409 的回复:哥们，我没有理解，你就解释下呗。我要是理解了就不会上来问了。  主要是一开始你就把这个排除了  引用 1 楼 u014082409 的回复:当然每一语句都没问题，还有递归的调用。问题在于  .

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

user: user-4
content: 引用 3 楼 u014082409 的回复:测试能通过，我的意思是这个函数的逻辑没有弄清楚。123这个数，经过 两次的 /，最后剩下  1（十进制的1），然后 % 10 + ‘0’，就得到字符串的‘1’，但是貌似这个函数就没有然后了。另外，第一个 if（n / 10）后，再到printd（n / 10），这里面的两个n的值是一样的吗？ 建议： 1. step into 2. 打印输出运行信息。  供参考。

user: user-0
content: 哥们，我没有理解，你就解释下呗。我要是理解了就不会上来问了。

user: user-2
content: 引用 3 楼 u014082409 的回复:测试能通过，我的意思是这个函数的逻辑没有弄清楚。123这个数，经过 两次的 /，最后剩下  1（十进制的1），然后 % 10 + ‘0’，就得到字符串的‘1’，但是貌似这个函数就没有然后了。另外，第一个 if（n / 10）后，再到printd（n / 10），这里面的两个n的值是一样的吗？ 之所以你弄不清楚，你因为你没理解递归

user: user-4
content: 同样测试过，输入123，输出123。 只是发现puchar写错了，应该是putchar。

user: user-0
content: 测试能通过，我的意思是这个函数的逻辑没有弄清楚。123这个数，经过 两次的 /，最后剩下  1（十进制的1），然后 % 10 + ‘0’，就得到字符串的‘1’，但是貌似这个函数就没有然后了。另外，第一个 if（n / 10）后，再到printd（n / 10），这里面的两个n的值是一样的吗？

user: user-5
content: vs2005测试通过，结果 123

user: user-6
content: 数字加 ‘0’ 之后就成对应ascii的字符数字了！ 递归取每一位数字
user-0 提问: 新手刚学C语言getchar函数，有个问题想问问

回复:
user: user-1
content: 和编译器有关，VC6的变异器不是你这种情况，你用的什么编译器？ 如果你的代码想避免这种情况可以在printf之后加上这句：fflush(stdout);应当就可以了。 引用 楼主 weiryou10 的回复: #include<stdio.h> int main() { 	int c; 	printf("hello\n"); 	while ((c = getchar()) != EOF && c != '\n') { 		printf("%c", c); 	} 	return 0; }  我的打印hello的语句在getchar函数前面，为什么运行的时候，还是等待我输入后，才打印hello

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

回复:
user: user-1
content: 软件是可以写自己的，弄个计数器，装一次就+1.

user: user-2
content: 开源时代，再说在中国市场上，反盗版你是做不到的

user: user-3
content: 不绑定安装主机的相关信息,   什么作用也没有. 一般限制安装的做法, 都是绑定目标机器的一些硬件信息. 符合则能运行安装, 不符合则不安装. 但是你能这样限制, 别人肯定也有方法破解. 现在都是软件免费, 服务收费的年代了.

user: user-4
content: 在 神 朝 ，讲究 分享 与 和平；当然如果是卖到国外，有些国家可以直接在授权声明里面 做好授权即可

user: user-5
content: 这个只能找逆向大神帮你加壳了。

user: user-6
content: 一般的思路都是不限制安装，但是控制运行（比如注册码的形式）

user: user-7
content: 奉劝楼主不要把有限的生命浪费在无限的加密解密死循环中！  现在是开源时代。

user: user-8
content: 用个usb key，记录安装数量，每次安装必须要插入key，安装完成后更新对应的数值
user-0 提问: C语言串口通信

回复:
user: user-1
content: google下吧，应该有很多例子吧！

user: user-2
content: 另外：推荐使用portmon软件辅助调试串口通讯程序。

user: user-3
content: http://download.csdn.net/detail/zmdcn1989/3872150

user: user-2
content: 引用 2 楼 z_jzhao 的回复:哪里有下载的？ 搜MSDN98或MSDN 6.0

user: user-0
content: 哪里有下载的？

user: user-2
content: MSDN98\SAMPLES\VC98\SDK\WINBASE\IO\SERIAL\*.*
user-0 提问: linux中运行程序如何得到 "^D" ?

回复:
user: user-1
content: 搜NCURSES库。

user: user-1
content: Ctrl+D在Linux下代表EOF ？

user: user-2
content: 本题不用答了，我把号换了

user: user-2
content: 本体作废。。。

user: user-0
content: 引用 4 楼 user-3 的回复:puts("^D");//... 不实用程序实现，是在终端运行程序时按下CTRL+D

user: user-3
content: puts("^D");//...

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:Ctrl+D在Linux下代表EOF ？ 我的意思是，我想让终端显示成这样： root  # ./a.out abc ^D abc  可实际上却是这样的： root  # ./.a.out abc abc  我忘了^D这字符是在哪种情况下显示出来的
user-0 提问: 各位大神帮我找找那有问题

回复:
user: user-1
content: 在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。

user: user-0
content: /*华氏温度转换为摄氏温度和绝对温度*/ #include<stdio.h> void Temperatures(double);//函数声明 int main(void) { 	/*变量声明*/ 	double a;  	printf("请输人华氏温度："); 	while(scanf("%lf",&a) == 1)//当输入非数字值时结束循环 	{  		Temperatures(a);//调用函数 		printf("请输人华氏温度："); 	}  	getchar(); 	getchar(); 	return 0;  }    /*温度的转换*/ void Temperatures(double Fahrenheit) { 	double Celsius, Kelvin;     const float n = 1.8; 	const float m = 32.0; 	const float t = 273.16;  	Celsius = n * Fahrenheit + m;//摄氏温度 	Kelvin = Celsius + t;//绝对温度  	printf("\n华氏温度：%.2f\n", Fahrenheit); 	printf("摄氏温度：%.2f\n", Celsius); 	printf("绝对温度：%.2f\n", Kelvin);  }

user: user-2
content: 这种问题有过不少讨论了，scanf 把以前缓冲的字符读取了。可以先清一下缓冲或者就用 u=getchar()

user: user-3
content: #include<stdio.h> void Temperatures(double Fahrenheit);  int main(void) { 	double b; 	char u;  	printf("请输入u的值："); 	scanf("%c", &u);  	while (u != 'Q') 	{ 		printf("请输人华氏温度："); 		scanf("%f", &b); 		Temperatures(b); 		getchar();    //吃掉输出流中的那个'\n'  		printf("请输入u的值："); 		scanf("%c", &u); 	}  	getchar(); 	return 0; }  void Temperatures(double Fahrenheit) { 	double Celsius, Kelvin; 	const float a = 1.8; 	const float b = 32.0; 	const float c = 273.16;  	Celsius = a * Fahrenheit + b; 	Kelvin = Celsius + c;  	printf("\t      华氏温度为：%.2e", Fahrenheit); 	printf("\n华氏温度转换为摄氏温度为：%.2e\n", Celsius); 	printf("摄氏温度转换为绝对温度为：%.2e\n", Kelvin); }

user: user-4
content: b是double型的，所以： scanf("%f", &b),->scanf("%lf", &b),
user-0 提问: C语言是不是汇编语言写出来的？

回复:
user: user-1
content: 蛋生鸡，，然后开始滚动发展，就是这样

user: user-1
content: borland TC2.0 是的，是使用汇编语言直接写出来的，包括他的IDE界面，都是用汇编写的； 早期的编译器，甚至和全部的源代码一起发行。  这个编译器的库里，甚至有库的初始化代码的，汇编源代码。 使用时，可能还需要自己汇编出来，生成.obj，不过提供了一个 build.bat 专门做这个。  另外，borland 早期的 pascal 也是用汇编写的。

user: user-2
content: C语言是不是汇编语言写出来的？  应该是“C的编译器是不是汇编语言写出来的？”  答案是，早期是。那时没有任何现成的语言的编译器，只有汇编语言及其汇编器。人们用汇编写了一个简单语法的编译器，然后由这个编译器及其简单语法，去写更复杂语法的编译器，直到语言和编译器都成熟。 先在有很多语言及其实现了，所以，用Java也可以写C的编译器，用Python也可以写编译器。  C语言写的程序不同的CPU是否要翻译成不同的机器语言？（例如有intel和amd的CPU是否要分别编译）  是，但是LZ举的例子不太好，AMD和intel的CPU是兼容的，都是x86的架构，所以“目标代码”是兼容的，不需要另外翻译。 举x86和mips或者arm就比较好，这种情况下，一份代码，多处编译。  自己想写一个不同语法风格的C语言是不是要实现各个不同的CPU的汇编代码？   首先，“语法风格”都不同了，那还是C么？所以其实就是LZ自行开发一个语言而已。 至于CPU不同，那么目标代码一定是不一样的。

user: user-3
content: 你是问C语言的编译器吧

user: user-4
content: 蛋生鸡，和鸡生蛋的问题！ 其实在计算机世界里，是先有的汇编，然后有汇编写成的编译器，然后再有高级语言编译器。C的第一版编译器肯定是汇编写成的，而后就可以有C语言写成的编译器。。。越来越多的语言以及编译器。。。

user: user-5
content: 一般不能用自身编译自己编译器的语言都是流氓.   编译器实现自举编译的版本都是要大书特书一把的.

user: user-6
content: 参考Tiny C源代码。

user: user-7
content: C语言是自编译语言，我的理解是自身滚动发展，不是鸡生蛋、蛋生鸡。

user: user-8
content: 最早是，后来就不是了。 现在GCC好像是用C++开发的。

user: user-9
content: c语言在编译是时候会进行汇编，转换为机器指令，才可以运行。。。。

user: user-10
content: C语言写的程序不同的CPU是否要翻译成不同的机器语言？（例如有intel和amd的CPU是否要分别编译）  准确的说，应该是不同指令集的CPU需要编译成不同的机器语言。 目前PC机的CPU的指令集都是一样的，所以，你在你的PC上编译了一份可执行文件，复制到你同学的PC里面，也可以用，但是复制到平板电脑里，就无法使用了。

user: user-11
content: 引用 楼主 tiwenid0 的回复:C语言是不是汇编语言写出来的？  嗯？lz这话不对吧

user: user-12
content: 引用 楼主 tiwenid0 的回复:C语言是不是汇编语言写出来的？ C语言写的程序不同的CPU是否要翻译成不同的机器语言？（例如有intel和amd的CPU是否要分别编译） 自己想写一个不同语法风格的C语言是不是要实现各个不同的CPU的汇编代码？  感觉你把C语言和C编译器搞混了

user: user-13
content: C语言是不是汇编语言写出来的？ 可以是，也可以不是。理论上，任何语言都可以写c语言编译器。  C语言写的程序不同的CPU是否要翻译成不同的机器语言？（例如有intel和amd的CPU是否要分别编译） 是的。  自己想写一个不同语法风格的C语言是不是要实现各个不同的CPU的汇编代码？  对的。不过既然是c语言，就要满足c语言规范定义的内容，否则就不叫c语言了。
user-0 提问: ++运算符的问题

回复:
user: user-1
content: 不客气，不要纠结这种问题了，正像我上面说的，你看——    上面是C-Free 5  ，下面是VC6.0的结果

user: user-0
content: 引用 1 楼 u012421456 的回复:这样的问题很多人问过了，自加或自减这种事不同的机器不同的编译器就可能出现不同的结果，lz可以看置顶帖——http://bbs.csdn.net/topics/370153775 看了一下 thank you

user: user-2
content: 代码是错的 结果没有意义

user: user-3
content: 我觉得纠结于这种问题没意义

user: user-1
content: 这样的问题很多人问过了，自加或自减这种事不同的机器不同的编译器就可能出现不同的结果，lz可以看置顶帖——http://bbs.csdn.net/topics/370153775
user-0 提问: 段错误为何称为 段 ？

回复:
user: user-1
content: 内存实际上还是分页管理吧，分段只是另一种形式体现和程序员吧。分页是按照固定大小分配的，这对于程序员来说很不好用，因为程序员所需要的内存都不是固定的，这样可能造成程序员分配得到的内存是不连续的。所以操作系统以分段的形式呈现给程序员，这对程序员来说分配得到的内存是连续的。

user: user-2
content: 举个常见的例子 char *p = "hello"; strcpy(p, "world");  上面的例子会产生段错误，原因在于指针p指向的是只读存储区。 只读区自然不能修改，因此strcpy访问了不该访问的内存段，所以出现段错误

user: user-2
content: 是的。因为内存分段，然后程序中访问了不能访问的段，所以称为段错误
user-0 提问: 栈

回复:
user: user-1
content: 这个思想就是“可以先进一个，出一个；或者进多个，出多个”

user: user-0
content: 懂了谢谢。。

user: user-0
content: 入栈顺序是123 那出栈不就唯一是321吗

user: user-0
content: 第一道的结果是怎么出来的解释下可以吗

user: user-2
content: 引用 6 楼 u014462801 的回复:进栈是123，出栈可能是：123、321、213、231、132 进栈是123456，出栈则不可能是435612（根据先进后出的原则，1不能先于2出栈）                                出战顺序可能是135426（1进，1出、2进、3进，3出、4进、5进，5出、4出、2出、6进，6出）  正确

user: user-0
content: 设无序表的关键字序列为：13,26,20,24,23,31,19,23,12,37。取中间位置元素的键值做基准值，应用快速排序算法，第一次分组后得到的序列为  A.13,12,20,19,23,31,26,23,24,37  B.12,19,13,20,23,37,26,24,23,31  C.19,12,20,13,23,23,37,31,24,26  D.20,19,13,12,23,23,24,31,26,37 顺便问一下这道题。我没有分了。不好意思

user: user-3
content: lz是打算让火车掉头啊？一个个车厢调换位置，栈是后进先出的

user: user-4
content: 进栈是123，出栈可能是：123、321、213、231、132 进栈是123456，出栈则不可能是435612（根据先进后出的原则，1不能先于2出栈）                                出战顺序可能是135426（1进，1出、2进、3进，3出、4进、5进，5出、4出、2出、6进，6出）

user: user-5
content: 栈是后进先出的（也可以说先进后出）——http://www.weixueyuan.net/view/5864.html 进去123，出则321

user: user-6
content: 按123进栈，如果3先出栈，1，2一定还在栈中，出栈一定是2、1，以此类推。。。

user: user-5
content: lz了解栈吗

user: user-0
content: 那结果是什么，怎么分析的

user: user-7
content: 先进后出。进栈的倒序。
user-0 提问: fread第一个参数的疑问

回复:
user: user-1
content: part没有初始化

user: user-0
content: 你们说我的part指针没有初始化，因为我认为fread把读到的数据的地址赋给了part指针。 那么按照你们的意思，fread这个函数是把数据的值赋给了指针所指的地址，而不是把数据的地址赋给指针？？？

user: user-2
content: 引用 楼主 u014463229 的回复:程序如下,我看到fread的第一个参数是void *buffer，所以我就这样写了 #include <stdio.h> int main() {        FILE *file;     int *part;     file=fopen("ff","rb");     fread(part,sizeof(int),1,file); }  而正确用法应该是： int part； fread（&part，........); 我不知怎么总结我的错误，请各位帮忙了 int *part; 是指针，没有初始化。 初始化要指向一个对象。即指向一个实例、实体。否则就是野指针。可以把指针可以当成一本书的目录。没有指向实体的指针就像目录没有页码。根本没有办法是用。

user: user-3
content: 引用 楼主 u014463229 的回复:程序如下,我看到fread的第一个参数是void *buffer，所以我就这样写了 #include <stdio.h> int main() {        FILE *file;     int *part;     file=fopen("ff","rb");     fread(part,sizeof(int),1,file); }  而正确用法应该是： int part； fread（&part，........); 我不知怎么总结我的错误，请各位帮忙了  int *part;  这个指针没有赋值  可以按楼上说的在堆上申请内存，也可以 int nPart = 0； int* pPart = &nPart； file=fopen("ff","rb"); fread(pPart ,sizeof(int),1,file);

user: user-4
content: 你没有为part申请空间 int *part; part = (int *)malloc(sizoef(int)); 这样也可以
user-0 提问: ACM题目：素数求和问题

回复:
user: user-1
content: 试试这个算法 “sieve of eratosthenes”

user: user-0
content: 引用 2 楼 oYinGui1 的回复:还有main没返回值这种写法，早过时了。。。书上这么写就把书扔了吧。。。 请教一下，为什么main要int，然后最后还要return 0？？

user: user-2
content: 引用 4 楼 alexbem 的回复:[quote=引用 2 楼 oYinGui1 的回复:] 还有main没返回值这种写法，早过时了。。。书上这么写就把书扔了吧。。。 请教一下，为什么main要int，然后最后还要return 0？？[/quote] 返回个值判断一下执行的情况呗。。0是表示正确执行，其它值就是系统定义的了，代表不同含义。

user: user-3
content: 题目说：0<M<10；0<N<1000，每个数都小于1000 假如系统测试用例m=9 切每个N都为999个数每个数都为999那样你的程序很吃力了。还有你的循环怎么不从0开始。边界问题值得思考一下。附上修改了的代码。 #include <stdio.h> #include <math.h>  int prm[1001]={0};//0表示是素数，1表示不是   void prime()	 {	//if Num is a prime number, return 1 	int i,Num=2; 	prm[1]=1; 	prm[0]=1;		 	while(Num<=1000) 	{for (i = 2; i <= sqrt(Num); i++) 		if (Num%i == 0) 			{prm[Num]=1; 			break;}  	Num++; 	}	 }  main() {	 	int Qty, QtyLtl, Num;	//quantity 	int j, k, Sum[10] = { 0 }; 	scanf("%d", &Qty); 	prime(); 	for (k=0; k<Qty; k++) 	{ 		scanf("%d", &QtyLtl); 		for (j=0; j<QtyLtl; j++) 		{ 			scanf("%d", &Num); 			if (prm[Num]==0)    //只需查表prm中是不是素数直接判断就可以了。  				Sum[k]=Sum[k]+Num; 		} 	} 	for (k=0; k<Qty; k++) 	{ 		printf("%d\n", Sum[k]); 	}  }

user: user-3
content: 我想问一下楼主   你的提交结果是wa 还是运行超时。我觉得应该是超时吧。我觉得这题应该打表。你先回复到底是哪种错误类型。然后我再看看

user: user-4
content: int main(void)    	return 0; 改成这种的，不要再直接main（）了

user: user-2
content: 还有main没返回值这种写法，早过时了。。。书上这么写就把书扔了吧。。。

user: user-2
content: 一般都要求个多次输入吧。。。搞个可以输入多次的就差不多了。
user-0 提问: 多行宏定义的代码

回复:
user: user-1
content: 编译选项加/EP /P，重新编译，查看宏展开后对应的.i文件。gcc加-E

user: user-2
content: return语句出现在宏里不太好吧！！ 这样的程序，程序运行流程被宏替换遮住了，看不清楚。 这是不准备让人看懂得代码么？？？  宏替换，应该是比较独立的代码，像 return ,goto 这样的语句，最好不出现。  if else，switch 语句也最好不要拆分 for,while do while 同样最好不要拆分 拆分了以后。控制流程支离破碎，代码就很难看懂了，这个宏也就不好使用了。

user: user-3
content: 没明白什么意思
user-0 提问: 并行的三个种群+各自循环400次之后交互一次，再循环交互，出现第一个种群循环完，第二个还没有循环完，无法交互 怎么办

回复:
user: user-1
content: 这东西已经不是c语言范畴了

user: user-2
content: 1. 可以創建一個調度器，提供各個循環的狀態查詢接口 2. 交互通過異步消息，每個循環自己管自己循環，定期/不定期 發送/查詢交互消息。
user-0 提问: 初学指针变了程序三个warnings求助!!!!

回复:
user: user-1
content: 引用 4 楼 u013107295 的回复:调用时错了   maxAndmin(a[10],gpt); 不对 是 maxAndmin(a,gpt);

user: user-1
content: 调用时错了   maxAndmin(a[10],gpt);

user: user-2
content: 是函数没有声明罢了

user: user-3
content: 你的maxAndmin函数应这样写 void maxAndmin(int a, int b);

user: user-4
content: 改成这样： #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> void maxAndmin(int a[10],int*gpt); int main() {     int a[10];     int* gpt ;     int i=0 ;     gpt=&a[0];     printf("press 10 numbers:\n");     for(i=0;i<=9;i++)     {         scanf("%d",&*(a+i));     }     maxAndmin(a,gpt);     return 0 ; } void maxAndmin(int a[10],int* gpt) {     int max=*(a+0);     int min=*(a+9);     int i=0;     for(;i<=9;i++)     {         if(*(a+i)>=*(a+0))         *(a+0)=*(a+i);         else if(*(a+i)<=*(a+9))         *(a+9)=*(a+i);     }     printf("max is%d\n min is%d\n",*(a+0),*(a+9));      }  运行截图：
user-0 提问: 问个关于结构体指针的问题

回复:
user: user-1
content: #include <iostream> using namespace std;  struct LNode; typedef struct LNode *ptrLNode; typedef ptrLNode LinkList; struct LNode{ 	struct LNode *next; 	int date; }; int creatList(LinkList H, int n) { 	if (!H) 	{ 		return false; 	} 	LinkList p = (LinkList)malloc(sizeof(LNode)); 	p = H; 	while (n--) 	{ 		LinkList newLnode = (LinkList)malloc(sizeof(LNode)); 		if (!newLnode) 		{ 			return false; 		} 		cin >> newLnode->date; 		p->next = newLnode; 		p = p->next; 	} 	p->next = NULL; 	return true; }  void putoutAll(LinkList H) { 	LinkList p = H->next; 	while (p) 	{ 		cout << p->date << endl; 		p = p->next; 	} }  void unionList1(LinkList LA, LinkList LB, LinkList LC) { 	LinkList pa, pb, pc;  	pa = LA->next; 	pb = LB->next; 	pc = LC; 	//LC = LA; 	//pc = LA; #if 1 	while (pa && pb) 	{ 		if (pa->date <= pb->date) 		{ 			pc = pc->next = pa; 			pa = pa->next; 		} 		else 		{ 			pc = pc->next = pb; 			pb = pb->next; 		} 	} #else 	while (pa&&pb) 	{ 		if (pa->date<pb->date) 		{ 			pc->next = pa; 			pa = pa->next; 			pc = pc->next; 		} 		else if (pa->date>pb->date) 		{ 			pc->next = pb; 			pb = pb->next; 			pc = pc->next; 		} 		else if (pa->date == pb->date) 		{ 			pc->next = pa; 			pa = pa->next; 			pb = pb->next; 			pc = pc->next; 		} 	} #endif 	if (pa) 	{ 		pc->next = pa; 	} 	if (pb) 	{ 		pc->next = pb; 	} }  void main() { 	LinkList LA = (LinkList)malloc(sizeof(LNode)); 	creatList(LA, 3); 	//putoutAll(LA); 	LinkList LB = (LinkList)malloc(sizeof(LNode)); 	creatList(LB, 3); 	//putoutAll(LB); 	LinkList LC = (LinkList)malloc(sizeof(LNode)); 	unionList1(LA, LB, LC); 	putoutAll(LC); }  稍微修改了LZ的代码，在输入 1 2 3 4 5 6的情况下可以正常运行。  不过LZ本身的代码还存在严重的逻辑问题： 1. 合并的链表真正拥有的空间只有头结点，换句话说，就是共享了LA,LB的其他结点空间。 2. 也正是因为第一个逻辑问题，所以造成在合并的修改LA,LB结点的next域-----合并操作不应该修改LA,LB. 3. LZ的代码兼有排序逻辑，那么应该基于LA,Lb有序的情况下才可以。