Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 数据结构链表

回复:
user: user-0
content: 对啊，又是我。。。 下午问的是前面的题目，后面的也不对。 谢谢你

user: user-1
content: 又是你？我不是给了你一个参考吗？ 再发一遍： #ifndef _CRT_SECURE_NO_WARNINGS #define _CRT_SECURE_NO_WARNINGS #endif  #include <stdio.h> #include <stdlib.h>  typedef struct tagNode { 	void*           data; 	char*           type; 	struct tagNode* next; } Node;  Node* getNode(void* data, char* type, Node* next) { 	Node* node = (Node*)malloc(sizeof(Node)); 	if(NULL != node) 	{ 		node->data = data; 		node->type = type; 		node->next = next; 	} 	return (node); }  const char* getFormat(char* type) { 	return "%s"; }  void  display(Node* node) { 	printf("=-=-=-=-=-=-=-=-=-=-start=-=-=-=-=-=-=-=\n"); 	while(NULL != node) 	{ 		printf("type: %s, data:", node->type); 		printf(getFormat(node->type), node->data); 		printf("\n"); 		node = node->next; 	} 	printf("=-=-=-=-=-=-=-=-=-=-end=-=-=-=-=-=-=-=-=\n"); }  Node* addHead(Node* head, void* data, char* type) { 	return getNode(data, type, head); }  Node* addTail(Node* head, void* data, char* type) { 	Node* node = head; 	while(NULL != node && NULL != node->next) 	{ 		node = node->next; 	} 	node->next = getNode(data, type, NULL); 	return (head); }  void  destroy(Node* head) { 	Node* next = NULL; 	while(NULL != head) 	{ 		next = head->next; 		free(head->data);//这里要求data是由malloc分配 		free(head); 		head = next; 	} }  int main() { 	char* data = NULL; 	int i = 0; 	Node* head = NULL; 	Node* tail = NULL;  	data = (char*)malloc(sizeof(char)*5); 	sprintf(data, "%s", "Head"); 	head = getNode(data, "String", NULL); 	 	data = (char*)malloc(sizeof(char)*5); 	sprintf(data, "%s", "Tail"); 	tail = getNode(data, "String", NULL); 	 	for(; i < 9; i++) 	{ 		data = (char*)malloc(sizeof(char)*5); 		sprintf(data, "T%03d", i); 		tail = addHead(tail, data, "String"); 		data = (char*)malloc(sizeof(char)*5); 		sprintf(data, "H%03d", i); 		head = addTail(head, data, "String"); 	} 	display(head); 	display(tail); 	destroy(head); 	destroy(tail); 	return 0; }
user-0 提问: 怎么实现读取一个二进制文件里面的内容，把每个字节保存在一个无符号的整形数组里面？

回复:
user: user-1
content: The argument shflag is a constant expression consisting of one of the following manifest constants, defined in Share.h.  Term	Definition _SH_COMPAT	Sets Compatibility mode for 16-bit applications. _SH_DENYNO	Permits read and write access. _SH_DENYRD	Denies read access to the file. _SH_DENYRW	Denies read and write access to the file. _SH_DENYWR	Denies write access to the file.  第三个参数, 看MSDN帮助文档中说的, 是需要Share.h头文件. 如果没有, 你可以直接用fopen, 老版本的c函数,  FILE *pFile = fopen("1.data","rb");

user: user-0
content: 引用 3 楼 xiaohuh421 的回复:1楼的代码已经解决了你的问题了.  unsigned char *buff = new unsigned char[100000]; FILE* fp = _fsopen("1.dat","rb",_SH_DENYWR); fread(buff,1,100000,fp); fclose(fp); 请问_SH_DENYWR 这个参数是怎么意思 我调试了一下 报错

user: user-2
content: 首先要获取文件长度， fopen, fseek,  然后根据获取的文件长度分配缓冲, malloc 接着把文件中的内容读到分配的缓冲， fread 最后记得把文件关了， fclose 差不多这几个函数吧

user: user-1
content: 1楼的代码已经解决了你的问题了.  unsigned char *buff = new unsigned char[100000]; FILE* fp = _fsopen("1.dat","rb",_SH_DENYWR); fread(buff,1,100000,fp); fclose(fp);

user: user-0
content: 引用 1 楼 Slzde_sub 的回复:  你确定不是unsigned char? 而是DWORD ?   FILE* fp = _fsopen("1.dat","rb",_SH_DENYWR); fread(buff,1,100000,fp);   要unsigned char 这个的整形，谢谢
user-0 提问: vc6.0出错

回复:
user: user-1
content: 你clean一下，看看是不是没成功，上次编完的exe还在

user: user-0
content: 引用 楼主 微心的回复:编译编译不同的程序，出现同一个结果，卸载重装后，编译执行出现上几次中其中一次的运行结果。什么鬼 换了一个存放路径就对了，
user-0 提问: putchar(cr);这个怎么没有输出，求指教！

回复:
user: user-1
content: 正常呐哪里不对吗？

user: user-2
content: 程序没问题，应该是缓冲区理解的问题。scanf输入之后，其实有一个换行符“残留”在输入缓冲区里，因此第二个while正好接收到了这个'\n'。

user: user-3
content: 你试一下把“void display(char cr, int lines, int width)”改成“void display(int cr, int lines, int width)”,就是 cr 的类型错了吧，我记得putchar使用的类型也是int。
user-0 提问: 程序输入问题

回复:
user: user-1
content: 应该是缓冲区残留，没有取走，或者没有清空，下一次scanf就直接取走了。

user: user-2
content: 引用 4 楼 cfjtaishan 的回复:程序没问题，应该是缓冲区理解的问题。scanf输入之后，其实有一个换行符“残留”在输入缓冲区里，因此第二个while正好接收到了这个'\n'。 程序没问题，应该是缓冲区理解的问题。scanf输入之后，其实有一个换行符“残留”在输入缓冲区里，因此第二个个体插入()正好接收到了这个'\n'。并将其“吸收”了。

user: user-2
content: 程序没问题，应该是缓冲区理解的问题。scanf输入之后，其实有一个换行符“残留”在输入缓冲区里，因此第二个while正好接收到了这个'\n'。

user: user-3
content: ch=getchar();	 获取流中的下一个字符，在你这个操作中也就是换行/回车符 红色标注的代码作用主要就是丢弃掉这个字符

user: user-0
content: 引用 1 楼 jianwen0529 的回复:ch=getchar();	 获取流中的下一个字符，在你这个操作中也就是换行/回车符 红色标注的代码作用主要就是丢弃掉这个字符 那请问没有这行代码的话，为什么第二个printf函数就会自动换行呢？
user-0 提问: Matlab怎么转成C语句的，求解答，不能把程序放到下面，我就截图了，看起来不太方便，希望有大佬指导，谢谢啦

回复:
user: user-1
content: 不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件，或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。 比如： A将请求数据写到文件a.txt，写完后改名为aa.txt B发现aa.txt存在时，读取其内容，调用相应功能，将结果写到文件b.txt，写完后删除aa.txt，再将b.txt改名为bb.txt A发现bb.txt存在时，读取其内容，读完后删除bb.txt 以上A可以替换为任何一种开发语言或开发环境，B可以替换为任何一种与A不同的开发语言或开发环境。 除非A或B不支持判断文件是否存在、文件读写和文件更名。 但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢？ 可以将临时文件放在RamDisk上提高效率减少磨损磁盘。 数据的结构很复杂的话，文本文件的格式问题可参考json或xml  共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多，下面仅列出我现在能想到的： ·进程之间松耦合 ·进程可在同一台机器上，也可跨机，跨操作系统，跨硬件平台，甚至跨国。 ·方便调试和监视，只需让第三方或人工查看该临时文本文件即可。 ·方便在线开关服务，只需删除或创建该临时文本文件即可。 ·方便实现分布式和负载均衡。 ·方便队列化提供服务，而且几乎不可能发生队列满的情况（除非硬盘空间满） ·……  “跨语言、跨机，跨操作系统，跨硬件平台，跨国，跨*.*的”苦海无边， 回头是“使用共享纯文本文件进行信息交流”的岸！

user: user-2
content: 如果自己手动写个C版本的话，这个很麻烦，不过可以直接用命令转成C语言的，你可以参考：  https://blog.csdn.net/zzlzzh/article/details/45044905  或者：  https://blog.csdn.net/zyqdragon/article/details/71512790

user: user-0
content: Matlab to C（ or other )     function satpos = get_satpos(t,sv,eph);  % get_satpos 用来确定卫星的位置， % t为给出的接收机记录的卫星接收信号的时刻，是当前gps周的秒数 % sv 为卫星编码 % eph 为从nav file(*.yrN)读出来的卫星的定位信息  % 万有引力常数 GM = 3.986004418e14;  % 地球自转 , rad/s Omegae_dot = 7.2921151467e-5;  % 选出指定卫星的信息，既是指定卫星在所有时刻的定位信息 col = find(eph(1,:)==sv); eph = eph(:,col);  % 选定离时刻t最近的参考历元    [y,col] = min(abs(t-eph(18,:)));  % 选定指定卫星在离参考时刻最近的定位信息所在的列， eph = eph(:,col);  % read ephemerides svprn   =   eph(1); af2     =   eph(2); M0      =   eph(3); roota   =   eph(4); deltan  =   eph(5); ecc     =   eph(6); omega0  =   eph(7); cuc     =   eph(8); cus     =   eph(9); crc     =  eph(10); crs     =  eph(11); i0      =  eph(12); idot    =  eph(13); cic     =  eph(14); cis     =  eph(15); Omega0  =  eph(16); Omegadot=  eph(17); toe     =  eph(18); af0     =  eph(19); af1     =  eph(20); toc     =  eph(21);  %%%%%%%%%      开始计算卫星的位置         %%%%%%%%%%  %A为轨道长半轴 A = roota*roota;  %计算到参考历元的时间差 tk = t - toe;  % 计算t时刻的平近点角 M = M0 + (sqrt(GM/A^3)+deltan)*tk;  % 利用开普勒公式迭代求解偏近点角  E_old = M; dE = 1;   while (dE > 1e-12)     E = M + ecc*sin(E_old);     dE = abs(E-E_old);     E_old=E;   end  % 计算真近点角 v = atan2(sqrt(1-ecc^2)*sin(E), cos(E)-ecc);  %计算改正后的升交点经度 Omega = Omega0 + (Omegadot-Omegae_dot)*tk - Omegae_dot*toe;  phi = omega0 + v; phi = rem(phi,2*pi);  % 计算升角角距 omega = omega0 + cuc*cos(2*phi) + cus*sin(2*phi);  % 计算向径 r = A*(1-ecc*cos(E)) + crc*cos(2*phi) + crs*sin(2*phi);  %计算倾角 i = i0 + idot*tk + cic*cos(2*phi) + cis*sin(2*phi);  % 旋转矩阵，从卫星轨道平面坐标系转换到地心地固坐标系 R = [cos(Omega)*cos(omega)-sin(Omega)*sin(omega)*cos(i) -cos(Omega)*sin(omega)-sin(Omega)*cos(omega)*cos(i)  sin(Omega)*sin(i);      sin(Omega)*cos(omega)+cos(Omega)*sin(omega)*cos(i) -sin(Omega)*sin(omega)+cos(Omega)*cos(omega)*cos(i) -cos(Omega)*sin(i);      sin(omega)*sin(i)                                   cos(omega)*sin(i)                                      cos(i)       ];  % 计算卫星在轨道平面坐标系下的坐标 satpos_in = [r*cos(v)              r*sin(v)              0];  % 利用旋转矩阵计算在地心地固坐标系下的位置 satpos = R * satpos_in;  % 计算卫星钟差 dt = af0 + af1*tk + af2*tk^2; satpos = [satpos; dt];
user-0 提问: 新手入门，求指教！

回复:
user: user-1
content: 引用 3 楼 ab17171313 的回复:第一题， （1）x=-1    y=-1    z=-1 这个直接赋值应该没问题 （2）x=-1    y=0     z=0   首先&&的优先级高于||，所以先看++y&&++x，++y等于0则&&不会再计算++x（因为与任一为假则为假，编译器是如此执行的），所以x的值仍为-1；计算完&&再计算||，&&的左边为0所以&&计算结果为0，但||左边为0还要继续计算右边，所以++z，z为0 （3）x=0     y=0     z=-1  这个道理与（2）相同 NB，忘了逻辑与了

user: user-0
content: 引用 5 楼 阿七七七 的回复：第二题，答案C A中switch参数和case都不为整数 B中case不为整数 D中case不能为变量名  多看看定义，书上都有写 所写的任何switch语句都必须遵循以下规则： 只能针对基本数据类型中的整型类型使用switch，这些类型包括int、char等。对于其他类型，则必须使用if语句。 switch()的参数类型不能为实型 。 case标签必须是常量表达式(constantExpression)，如42或者"42"。 case标签必须是惟一性的表达式；也就是说，不允许两个case具有相同的值。感谢

user: user-2
content: 第二题，答案C A中switch参数和case都不为整数 B中case不为整数 D中case不能为变量名  多看看定义，书上都有写 所写的任何switch语句都必须遵循以下规则： 只能针对基本数据类型中的整型类型使用switch，这些类型包括int、char等。对于其他类型，则必须使用if语句。 switch()的参数类型不能为实型 。 case标签必须是常量表达式(constantExpression)，如42或者"42"。 case标签必须是惟一性的表达式；也就是说，不允许两个case具有相同的值。

user: user-2
content: 引用 3 楼 ab17171313 的回复:第一题， （1）x=-1    y=-1    z=-1 这个直接赋值应该没问题 （2）x=-1    y=0     z=0   首先&&的优先级高于||，所以先看++y&&++x，++y等于0则&&不会再计算++x（因为与任一为假则为假，编译器是如此执行的），所以x的值仍为-1；计算完&&再计算||，&&的左边为0所以&&计算结果为0，但||左边为0还要继续计算右边，所以++z，z为0 （3）x=0     y=0     z=-1  这个道理与（2）相同 呃，其实&&和||的优先级就可以看成数学的*和+

user: user-2
content: 第一题， （1）x=-1    y=-1    z=-1 这个直接赋值应该没问题 （2）x=-1    y=0     z=0   首先&&的优先级高于||，所以先看++y&&++x，++y等于0则&&不会再计算++x（因为与任一为假则为假，编译器是如此执行的），所以x的值仍为-1；计算完&&再计算||，&&的左边为0所以&&计算结果为0，但||左边为0还要继续计算右边，所以++z，z为0 （3）x=0     y=0     z=-1  这个道理与（2）相同

user: user-3
content: x=-1    y=-1    z=-1 x=-1    y=0     z=0 x=0     y=0     z=-1  C  1

user: user-1
content: -1  -1  -1 0  0  0 0 0 -1  C  1
user-0 提问: 最后一个putchar（ch）是什么意思？不是原样输出吗？

回复:
user: user-1
content: isalpha() 是用来判断你输入的字符是否是英文字母的 #include <stdio.h> #include <ctype.h> #include<stdlib.h>　　 int main(void) {     char ch;     while ((ch = getchar()) != '\n')	// 当一行未结束时     {         if (isalpha(ch))	//判断你输入的字符是否是英文字母              putchar(ch + 1);//是，则输出该字符ch在ascii码表中的后一个字符          else             putchar(ch);	//否，原样输出该字符ch，比如空格，!,之类的标点，数字，等等     }     putchar(ch);//打印换行符     system("pause");     return 0; }

user: user-2
content: 最后一个putchar()是输出的换行符'\n'，因为最后一个getchar()赋值给ch，然后判断是是'\n'，因此不满足条件，执行while循环后的一个putchar(ch);即换行符
user-0 提问: 可变参数宏定义编译报错“未找到用户定义的文本计算符号”，但是不影响实际使用。请问到底错在哪里？

回复:
user: user-1
content: VC编译选项加/EP /P（项目、属性、配置属性、C/C++、预处理器、预处理到文件：是，预处理取消显示行号：是），重新编译，查看宏展开后对应的.i文件。gcc加-E http://bbs.csdn.net/topics/391003898
user-0 提问: C语言网的一个题，不知道是不是编译器的问题？

回复:
user: user-1
content: while 里面rest的值有重新赋值么？没有while咋符合退出条件？

user: user-2
content: while中没有跳出循环的条件，因此逻辑就是一个死循环（若条件满足）。

user: user-0
content: 引用 2 楼 qq_31917799 的回复:while(1){         y1=(y0+x/y0)/2.0;         t=y1;         y0=y1;        if(fabs(y1-t) < 0.00001)               break;     }里面顺序改下才行 ok

user: user-3
content: #include <stdio.h> #include<math.h> int main() { 	double x, y0, y1, t; 	bool rest = true;//把rest类型修改为bool 	y0 = 1.0; 	y1 = 2.0; 	scanf("%lf", &x); 	while (rest) {  		y1 = (y0 + x / y0) / 2.0; 		t = y1; 		rest = fabs(t - y0)<0.00001;//使用fabs替代abs，并将rest赋值语句放在while循环中 		y0 = y1; 		 	} 	printf("%.3lf", y1); 	 	return 0; }

user: user-0
content: 引用 1 楼 Slzde_sub 的回复:fabs是浮点数绝对值  abs是整数绝对值 还是不行，debug，rest的值一直是1

user: user-4
content: while(1){         y1=(y0+x/y0)/2.0;         t=y1;         y0=y1;        if(fabs(y1-t) < 0.00001)               break;     }
user-0 提问: 链表的指向

回复:
user: user-1
content: 引用 12 楼 kang2618 的回复:[quote=引用 8 楼 M_lty63 的回复:] [quote=引用 5 楼 这个冬天有点冷灬的回复:]就这两句而言，第一句没有意义 new->next=tail->nextw为什么这么指，不懂，他们好像没联系[/quote] 你的需求是尾部插入新的节点吗？可以考虑下面的代码  tail->next=new tail=tail->next [/quote] 前提是你tail还有作用，不然tail=tail->next也是没有意义的

user: user-1
content: 引用 8 楼 M_lty63 的回复:[quote=引用 5 楼 这个冬天有点冷灬的回复:]就这两句而言，第一句没有意义 new->next=tail->nextw为什么这么指，不懂，他们好像没联系[/quote] 你的需求是尾部插入新的节点吗？可以考虑下面的代码  tail->next=new tail=tail->next

user: user-0
content: 引用 10 楼 英雄@末路的回复:[quote=引用 7 楼 M_lty63 的回复:] [quote=引用 6 楼 英雄@末路的回复:]第二句把第一句覆盖了，如果没有其他有特殊含义的上下文，那前一行没用。 new->next=tail->nextw为什么这么指，不懂，他们好像没联系[/quote] 这个是讲新节点插入队尾，这个和你在主题里可是不一样的！这个操作的目的是保存（或者说初始化）新节点的next元素 [/quote] 我要说的就是这个.怎么指得

user: user-2
content: 引用 7 楼 M_lty63 的回复:[quote=引用 6 楼 英雄@末路的回复:]第二句把第一句覆盖了，如果没有其他有特殊含义的上下文，那前一行没用。 new->next=tail->nextw为什么这么指，不懂，他们好像没联系[/quote] 这个是讲新节点插入队尾，这个和你在主题里可是不一样的！这个操作的目的是保存（或者说初始化）新节点的next元素

user: user-2
content: 第二句把第一句覆盖了，如果没有其他有特殊含义的上下文，那前一行没用。

user: user-0
content: 引用 2 楼 赵4老师的回复:数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633 new->next=tail->nextw为什么这么指，不懂，他们好像没联系

user: user-0
content: 引用 5 楼 这个冬天有点冷灬的回复:就这两句而言，第一句没有意义 new->next=tail->nextw为什么这么指，不懂，他们好像没联系

user: user-0
content: 引用 6 楼 英雄@末路的回复:第二句把第一句覆盖了，如果没有其他有特殊含义的上下文，那前一行没用。 new->next=tail->nextw为什么这么指，不懂，他们好像没联系

user: user-3
content: 数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633

user: user-4
content: tail->next=new->next tail->next=new 第一句和第二句都是修改tail->next指针的指向。有点重复的意思，不过这个还要看你的需求，但从这两句来看是重复的意思。 但从这两句可以考虑这样： new->next = tail->next; tail->next = new;

user: user-1
content: 就这两句而言，第一句没有意义

user: user-0
content: 引用 1 楼 自信男孩的回复:tail->next=new->next tail->next=new 第一句和第二句都是修改tail->next指针的指向。有点重复的意思，不过这个还要看你的需求，但从这两句来看是重复的意思。 但从这两句可以考虑这样： new->next = tail->next; tail->next = new; 我不知道tail->next=new->next到底是什么意思，为什么这么指
user-0 提问: 指针写冒泡排序，不知道程序哪里错了

回复:
user: user-1
content: 数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633

user: user-2
content: #include<stdio.h>  void paixu(float *p, int n) {     int i,j;     float a;     for(j = 0; j < n; j++)     {         for(i = 0; i < n-j - 1; i++)         {             if(*(p+i) > *(p+i+1))             {                 a = *(p+i);                 *(p+i) = *(p+i+1);                 *(p+i+1) = a;             }         }     } } int main() {     int i;     float num[10]={1,10,6,20,50,3,7,14,21,12};     float *p = num;      paixu(p, 10);      for(i=0;i<10;i++) {         printf("%-8.2f",*(p+i));     }     putchar(10);      return 0; } 无意义的返回值。应该去掉，另外返回int类型，但是*p是float类型。

user: user-2
content: #include<stdio.h>  int paixu(float *p, int n) {     int i,j;     float a;     for(j = 0; j < n; j++)     {         for(i = 0; i < n-j - 1; i++)         {             if(*(p+i) > *(p+i+1))             {                 a = *(p+i);                 *(p+i) = *(p+i+1);                 *(p+i+1) = a;             }         }     }     return *p; } int main() {     int i;     float num[10]={1,10,6,20,50,3,7,14,21,12};     float *p = num;      paixu(p, 10);      for(i=0;i<10;i++)     {         printf("%-8.2f",*(p+i));     }     return 0; } 参考一下吧  判断条件是i < n - j - 1;否则数组越界了。当j=0时，i < 10 - 0，即i < 10，那么当i= 9时，p + i + 1即p+10已经越界了。因为p+9已经是指向最后一个元素了。

user: user-3
content: 下面当然也需要减一，大方向没错，只是有点瑕疵。

user: user-3
content: for(j=0;j<n-1;j++)//这里需要－1 	{ 		for(i=0;i<n-j-1;i++) 		{ 			if(*(p+i)>*(p+i+1)) 			{ 				a=*(p+i); 				*(p+i)=*(p+i+1); 				*(p+i+1)=a; 			} 		} 	} 10个数 第一次遍历只需要比较9次，n个数 第一次需要比较n-1次
user-0 提问: C语言自加问题，帮忙看下如何一个过程

回复:
user: user-1
content: 正解， printf 参数入栈是从右到左的执行的

user: user-2
content: printf的入栈顺序是从右到左的，会先执行z++

user: user-3
content: 原题 int x = 3, y = 3, z = 1; int m = 0; printf("%d,%d\n", (++x, y++, x + y + z), z++);  首先有两个知识点： 1、printf输出是先从右往左计算，再从左往右输出(编译器之间可能存在差异，没测试，我用的vs2017) 2、++i，i自增1。i++，系统会拷贝出一个副本+1，也就是有一个i，还有一个副本是i+1 这个题z=1，先计算z++，z生成了一个副本也就是2，然后再从左往右计算逗号运算符， 逗号运算符里计算的z是z的副本，也就是2，printf输出第二个变量z的时候，输出的是他的原版本也就是1,所以最后输出的是10,1

user: user-4
content: 找个通用编译器看汇编，就讲汇编的执行顺序

user: user-5
content: 兩個要點:1、printf入參順序從右往左，2、逗號表達式從左往右依次執行，結果為最後一個表達式

user: user-6
content: 这种问题就看反汇编喽，以前也碰到过同一代码，不同版本的编译器计算结果不一样，这时候就分析一下汇编，很容易的发现相同代码的执行在不同的编译器里面执行不一样。有可能是编译器本身的问题，也可能是语言标准的变化（比如C++11和C++9）。

user: user-7
content: ++i与i++的区别。

user: user-8
content: 跟编译器有关系，跟系统没关系。

user: user-9
content: sequence point  函数参数右结合

user: user-10
content: 函数参数的处理顺序，和逗号表达式不一样

user: user-0
content: 感谢各位。 感谢，统一回复。其实我也不想纠结这样的问题，这种问题在工程应用中根本不存在，但是现在我是在一个职业学校教书，教C语言，没办法，考试要考这中问题。

user: user-0
content: 引用 5 楼 shihengzhen101 的回复:这种事别就纠结了，搞懂++x和x++就行了，个人意见！ 感谢，其实我也不想纠结这样的问题，这种问题在工程应用中根本不存在，但是现在我是在一个职业学校教书，教C语言，没办法，考试要考这中问题。

user: user-4
content: 百度sequence point，你就不再会纠结这种问题

user: user-11
content: 6楼正解，函数参数右结合

user: user-12
content: 函数参数的计算顺序造成的吧，从右往左。你可以看一下汇编代码（windows下codeblocks的汇编），先计算的z，然后是前面的参数，按照逗号表达式顺序，先x，再y，然后是x+y+z，0x401340	push   %ebp 0x401341	mov    %esp,%ebp 0x401343	and    $0xfffffff0,%esp 0x401346	sub    $0x20,%esp 0x401349	call   0x401960 <__main> 0x40134e	movl   $0x3,0x1c(%esp);x 0x401356	movl   $0x3,0x18(%esp);y 0x40135e	movl   $0x1,0x14(%esp);z 0x401366	movl   $0x0,0x10(%esp);m 0x40136e	mov    0x14(%esp),%eax 0x401372	lea    0x1(%eax),%edx 0x401375	mov    %edx,0x14(%esp) 0x401379	addl   $0x1,0x1c(%esp) 0x40137e	addl   $0x1,0x18(%esp) 0x401383	mov    0x1c(%esp),%ecx 0x401387	mov    0x18(%esp),%edx 0x40138b	add    %edx,%ecx 0x40138d	mov    0x14(%esp),%edx 0x401391	add    %ecx,%edx 0x401393	mov    %eax,0x8(%esp) 0x401397	mov    %edx,0x4(%esp) 0x40139b	movl   $0x403024,(%esp) 0x4013a2	call   0x401bd0 <printf> 0x4013a7	mov    $0x0,%eax 0x4013ac	leave 0x4013ad	ret 不过不同的编译器出来的结果可能会不同。

user: user-13
content: 关于C,C++表达式求值顺序 http://blog.csdn.net/fefe82/article/details/37833767，http://bbs.csdn.net/topics/370153775

user: user-0
content: 对了，补充下，是在Windows的平台下编译运行

user: user-14
content: 正如6楼所说，printf()函数的入栈顺序是从右向左；所以先执行z++；此时z的值变为2，所以最后的输出是10

user: user-15
content: lz跟编译器较啥劲啊，不确定的话，就一步一步执行喽

user: user-16
content: 10,1结果是这么来的. printf 参数入栈是从右到左的.  所以先执行表达式z++, 再执行表达式(++x, y++, x + y + z) z++  ==> z =2  但++在后, 对于printf来说, 参数入栈 1  然后吞逗号表达式是从左到右.   先执行++x  ==> x = 4 再执行 y++ ==> y=4 (++x, y++, x + y + z) 最终结果 ===> (4, 3, 4+4+2) ==> 10  printf最终结果: ==>  printf("%d,%d\n", 10, 1);
user-0 提问: 链表逆序算法实现

回复:
user: user-1
content: pr是干什么的？好像没什么用

user: user-2
content: 代码没看出什么问题，所以，你的问题是？

user: user-0
content: 非常感谢各位帮忙看，我理解错了

user: user-2
content: 引用 3 楼 baidu_33083779 的回复:pr是干什么的？好像没什么用 pr是保存下一个节点的地址，是非常有用的，否则找不到下一个节点，链表就会出问题。

user: user-3
content: 数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633
user-0 提问: 这个链表要怎么改，感觉没错啊，怎么就不行呢

回复:
user: user-1
content: 你的add函数和明显的不是尾插法，因为tail直接指向了头指针，你的插入方式是每次插到头结点的下一个节点。 尾插法应该是:首先要找到最后一个节点，然后将新节点插到最后一个节点的末尾。但是你的逻辑并没有找到最后一个节点

user: user-1
content: student*add(student*hear)//添加.tail是尾指针 {     student*tail = NULL;     //tail = (student*)malloc(sizeof(student));    //redundant     tail = hear;     student *new = NULL;     new = (student*)malloc(sizeof(student));      printf("name>");     scanf("%s", new->name);     printf("age>");     scanf("%d", &new->age);     printf("sex>");     scanf("%s", new->sex);      new->next = tail->next;      tail->next = new;     //tail = new;     //redundant     //tail->next = NULL; //error      return hear; }   int print(student*hear) {     student*s = NULL;     //s = (student*)malloc(sizeof(student));    //redundant     //s->next= hear->next;    //redundant     s = hear;      while(s->next!=NULL)     {         printf("%s\t%d\t%s\n",s->name,s->age,s->sex);         s = s->next;     }      return 0; } 参考一下吧。 程序中有冗余代码，也有逻辑错误的代码。 冗余和

user: user-2
content: 1、tail为什么要分配内存呢？你分配的内存也没被使用到，要指向链表头就只需要tail指向hear指向的内容就可以了。====>内存泄漏 2、新节点加入需要找到链表尾部，在链表尾部添加新节点，通过hear循环遍历链表可以找到链表尾部。 3、print函数内部也不应该分配内存，把链表头传入，加一个临时指针就可以循环遍历链表打印
user-0 提问: 求排列组合的程序为何只运行到一半就完了？

回复:
user: user-1
content: 显示问题吧，有4000多的。 还有zdlx *aa = (zdlx *)malloc(n*n*n*sizeof(zdlx)); 你这空间申请的大小，你会知道是多少吗？n没有初始化

user: user-0
content: 用手机怎么结贴给分阿

user: user-0
content: 引用 3 楼 自信男孩的回复:n = 17;     zdlx *aa = (zdlx *)malloc(n*n*n * sizeof(zdlx)); 这两条语句调换一下先后。否则n是随机数，最大为255,最小可能为0。因此malloc的空间可能会导致溢出，当n随机数小于17时，就会导致溢出。 是的 搞错了 非常感谢

user: user-0
content: 引用 2 楼 King_of_Kindom的回复:显示问题吧，有4000多的。 还有zdlx *aa = (zdlx *)malloc(n*n*n*sizeof(zdlx)); 你这空间申请的大小，你会知道是多少吗？n没有初始化 嗯 看到了 非常感谢

user: user-2
content: n = 17;     zdlx *aa = (zdlx *)malloc(n*n*n * sizeof(zdlx)); 这两条语句调换一下先后。否则n是随机数，最大为255,最小可能为0。因此malloc的空间可能会导致溢出，当n随机数小于17时，就会导致溢出。

user: user-0
content: #include <stdio.h> #include <stdlib.h> typedef struct {     int n;     char b[3];  }zdlx; void zd(zdlx a[], unsigned char n) { unsigned char i,j,t; int cn; cn=0; for (i=0;i<n;i++)  for (j=0;j<n;j++)   for (t=0;t<n;t++)     {        a[cn].n=cn; 	  a[cn].b[0]=i; 	  a[cn].b[1]=j; 	  a[cn].b[2]=t;	 	  cn=cn+1; 	  printf("cn=%d i=%d j=%d t=%d\n",cn,i,j,t);     }   	} int main(void)  {     int  ii;    unsigned char n;     zdlx *aa = (zdlx *)malloc(n*n*n*sizeof(zdlx));    n=17;    zd(aa,n); 	for(ii=0;ii<n*n*n;ii++) 	 { 	 	 printf("a=%d %c %c %c\n", aa[ii].n,aa[ii].b[0],aa[ii].b[2],aa[ii].b[2]);   	 } 	}
user-0 提问: 和16进制数据处理这段什么意思

回复:
user: user-1
content: 上面写错了'F'-3='C'

user: user-1
content: 用于显示的是字符，字符的值是个整数，ASCII字符表的连续字符的值也是连续的，在表范围内，一个字符减去几个数字就是前面第几个字符，加上个数字，就是后面第几个字符，比如'1'+2='3'，'F'-3='B','a'+25='z'

user: user-0
content: 引用 4 楼 justkoomega 的回复:E1R1date1和E1R1date1分别是r1_Buff1[k]的低四位和高四位，就是数字啊，无关什么进制。 然后把存的数字 转成 16进制表示 的字符 的ASCII码。 你把2个8位的存在16位寄存器，不要移动8位么。 为什么又要转ASCII码，直接用16进制不行吗

user: user-2
content: 先确认E1R1date1 的赋值，是某个数组元素（字节）的低四bit 然后确认 0x30, 0x40的意义，分别对应ascii 吗的'0'和 '@'， 而'@' 字符ascii 码的下一个字符是‘A’，这个才是我们关心的。 其实那个 if(E1R1date1 > 9) { } else { } 的目的就是把该字节的低四比特换成ASCII码对应的字符（数组0~9变成字符‘0’~‘9’，赋值A~F 变成字符'A' ~'F'）。

user: user-3
content: 移动八位是因为一个字节就是八位，比如0x3A就是一个字节

user: user-3
content: 0x41～0x46即对应ASCII码的A~F。

user: user-4
content: E1R1date1和E1R1date1分别是r1_Buff1[k]的低四位和高四位，就是数字啊，无关什么进制。 然后把存的数字 转成 16进制表示 的字符 的ASCII码。 你把2个8位的存在16位寄存器，不要移动8位么。

user: user-0
content: 变成0X41和0X42有什么用， RD[11200+k]是16位的寄存器，

user: user-5
content: 1. 是用十六进制表示：10变成A（0x41），11变成B（0x42），…… 2. 要看RD数组元素类型了

user: user-0
content: 引用 1 楼 user-5 的回复:1. 是用十六进制表示：10变成A（0x41），11变成B（0x42），…… 2. 要看RD数组元素类型了  E1R1date1和 E1R1date2的数据是十进制还是16进制的？如果是16进制的只会是A至F，哪会有10和11呢  RD[11200+k]是整形32位数值， E1R1asc2和 E1R1asc1得到的是ASCII码数据吗？ 中间是不是少了一个将ASCII码转 为16进制的数在赋值给 RD[11200+k]？
user-0 提问: 求非空链表变成空表

回复:
user: user-1
content: 记录两条链表的长度len。然后分别回收两条链表的每个结点，然后用一个循环执行以下操作 printf("NULL\n");len--;当len=0时跳出循环，如果你想合并置空之后再遍历结点这是做不到的，因为当你把结点置空了之后就访问不到它所指向的结点了，指针是在堆里面的，你可以把它理解为一个间址寻址的存储单元，当你把它置空(c语言保证NULL绝对不是有效的内存地址),当你试图访问它所在的结点的时候，MAR（这是负责在内存地址里面找到指定内存单元的一个存储器)会寻址失败，然后操作系统产生中断，程序运行失败，这也就是我们常说的空指针异常

user: user-2
content: 引用 2 楼 King_of_Kindom 的回复:你的打印出NULL是指打一个还是原本每个元素的地方你都想打出NULL？如果置空了，应该顶多只能打出一个NULL吧 //置NULL      L1 = NULL;     L2 = NULL; 注意这两句是否可以将调用函数里的实参L1，L2赋值为NULL呢？

user: user-2
content: 合并为一个链表就是创建新的链表，将2个L1，L2链表的节点添加到一个新链表上（创建一个新链表）。原来两个链表就没有节点了。自然头结点指向了NULL

user: user-3
content: 你的打印出NULL是指打一个还是原本每个元素的地方你都想打出NULL？如果置空了，应该顶多只能打出一个NULL吧

user: user-4
content: //list是链表结构图，L1是链表1的头指针，L2是链表2的头指针（L1，L2非空）  list*  combine(list* L1, list* L2) { 	//新链表  	list* new_list = (list*)malloc(sizeof(list)); 	 	//新链表指向L1的next  	new_list = L1->next; 	 	//寻找L1的最后一个元素  	list* p = L1; 	while(NULL != (p->next)) p++; 	 	//L1的最后一个元素指向L2的next  	p->next = L2->next; 	 	//置NULL  	L1 = NULL; 	L2 = NULL; 	 	return new_list; }
user-0 提问: 有个小小的问题，希望大家可以帮忙解决一下？

回复:
user: user-1
content: 书上错的，第一个阶段费用重复加了！

user: user-2
content: 要么改为 #define BASE3  (BASE2+(RATE3*(BREAK3-BREAK2))) 要么改为 #define BASE2  (RATE2*(BREAK2-BREAK1))

user: user-3
content: 红线处是错的，按红线处的写法，重复收了第一阶段的电费。

user: user-4
content: 如你所说的 原文确实错了 应该按照你改成的那样

user: user-5
content: 原文确实是错的

user: user-6
content: 不是，红线处是正确的。 要清楚电费的计费方式，它不是在某个越界点处往下计算的，而是从基础电费开始往上计算的。 打个比如，有3个越界点a,b,c，分别对应3种费率Pa,Pb,Pc，它是先收每个取越界点的费用后，再计算越出的电量，所以如果你的电量b<t<=c，那么它先收取a点的电费，再收取b点的电费（b点的电费又依赖a点），最后再计算越出电量的电费，以上结果相加，才是总电费。
user-0 提问: VS2013 error LNK2001: 无法解析的外部符号 

回复:
user: user-1
content: 程序动态库没有加载正确。确认程序中包含了动态库的头文件和库文件（lib和dll），并且要把动态库文件拷贝到指定位置。 请参考《动态库相关知识》 希望能够帮到你

user: user-2
content: dll或者 你的lib没加载对。

user: user-3
content: 这一看就是没有连接所需的静态库或者动态库的导入库，连接上就可以了

user: user-4
content: 如果调用的第三方库 查下lib是否引用了？或者lib使用时有特定的宏未定义？ 找库的demo来查比较方便些

user: user-5
content: 你用了錯誤信息中提到的Slice之類的類和接口嗎？應該是沒有正確include進來或庫沒安裝好吧。
user-0 提问: c语言在子函数中使用malloc，会自动free吗？return后我该怎么办？

回复:
user: user-1
content: 可以用智能指针

user: user-2
content: 定义的函数 return 后，后面语句就不执行，也可以用 if判断，多个 return，返回不同的结果   char* get_num_bit() {     /*子函数体片段*/     static  char* buf = (char*)malloc(1024 * 64);     strcpy(buf, "hello world!");     return buf; }  可以试试这样，函数多次使用，也不会内存浪费了

user: user-3
content: 你的这个程序很简单，虽然在子函数中没有free，确实有内存泄漏，但是整个程序执行完成之后，系统还是会回收你malloc申请的str的空间的，因此对于你现在的这段程序来说，也不会对系统造成啥负担。 子函数到了return，程序就已经结束并返回相关结果了，renturn后面的代码是肯定不会运行了的。如果要free，可以这样 #include<stdio.h> #include<stdlib.h>  char * get_num_bit() {     /*子函数体片段*/     char * str = (char*)malloc(sizeof(char)*100);     str = "hello world!";     return str; }  int main()/*主函数*/ {     char *p = get_num_bit();     printf("%s\n",p);     system("pause");     free(p);     return 0; }

user: user-4
content: 3、4行删掉。 main返回后，程序对应进程退出，操作系统会自动释放。 如果想自己free,可将函数的返回值保存到比如一个char*类型的变量s中，等不用时free(s);即可。
user-0 提问: C语言 函数for循环内递归的问题

回复:
user: user-1
content: 做成参数往下传递了

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

user: user-3
content: 另外设置一个数组，rec函数里记录递归层数，然后根据递归层数保存j在数组里
user-0 提问: ctrl+F5行，F5不行，这是啥原因？

回复:
user: user-1
content: Ctrl + F5强制刷新后台读取 F5只是从缓存中读，有则直接读取

user: user-2
content: 用vs的话 scanf用scanf_s   结尾要加  system("pause");

user: user-3
content: 引用 1 楼 hou09tian 的回复:system("pasue"); 改为 system("pause");  这个正解了

user: user-4
content: F5：开始调试/Start Debugging Ctrl + F5：开始执行（不调试）/Start Without Debugging  如果F5调试的话，没有设置断点，也没有system("pause")或者getchar()之类的话，cmd窗口显示完运行结果，然后就会立马关闭。 Ctrl + F5是开始执行，如果是win32控制台应用程序这样的项目，就会有一个cmd执行窗口，显示运行结果，然后窗口一直保留。  你这里就是system("pasue"); 语句中的pause拼错了，所以才一闪而过的。

user: user-5
content: 你怕是用的vs  然后F5在调试。。

user: user-6
content: 关于自己是否适合编程的很简单的测试： 在报纸或杂志上随便找一段约1000字的文章，在Word中输入一遍。输完后再参考下面答案：  A里面有10处以上文字或标点错误 B里面没有文字或标点错误并敢为此跟人打赌 C里面没有文字或标点错误并且字体和排版完全与原稿一致 D打印在半透明的纸上和原稿重叠在一起检查一模一样，且自我感觉很有成就感  A不适合编程（理由：打字准确度偏低、粗心大意） B初级程序员（理由：打字准确度很高、认真细致、自信、理解全角半角概念） C高级程序员（理由：在B的基础上理解字体和排版也是电脑打印的重要因素、但相比D还不够偏执、精益求精、结果可验证） D软件项目经理（理由：能针对项目给出令人信服的细致到极点的需求说明和典型测试用例。用户几乎挑不出毛病。专业！）  如果想从A变成B的话，到我的资源http://download.csdn.net/detail/zhao4zhong1/4084259里面下载“适合程序员的键盘练习”

user: user-7
content: system("pasue"); 改为 system("pause");
user-0 提问: 如何安全的分配scanf输入的字符串空间？

回复:
user: user-1
content: Linux做不到scanf，windows有scanf_s可以输入长度，但是这个机制也只是将输入的字符串截断，而不能正好分配。所以这个还是编程人员自己控制

user: user-2
content: 看下你的应用会不会有恶意破坏的人，如果有，就控制最大输入，如果没有，按照业务控制，稍微留大一点就可以了，现在的内存以g为单位，你加多个1k都是微不足道的

user: user-3
content: 改用更安全的scanf_s

user: user-4
content: 一般情况下 都会预估输入值得大小，预留出一些空间，你也可以改用sacnf_s()，指定最大输入。
user-0 提问: 演示用户交互是发生冲突，什么原因？

回复:
user: user-0
content: printf的格式话输出%s没有对应的变量，这个说的对的，仔细看了下，的确是少个变量！

user: user-1
content: printf("Also,%s, your first name has %d letters,\n",letters);

user: user-2
content: 再加个头文件#include<stdlib.h>，如果用system函数的话。

user: user-3
content: #include<stdio.h> #include<string.h>  #define DENSITY 62.4  int main() {     float weight, volume;     int size, letters;     char name[40];     printf("Hi! what's your first name?\n");     scanf("%s", name);     printf("%s, what's your weight in pounds?\n",name);     scanf("%f", &weight);     size = sizeof name;     letters = strlen(name);     volume = weight / DENSITY;     printf("Well,%s, your volume is %2.2f cubic feet.\n",name,volume);     //printf("Also,%s, your first name has %d letters,\n",letters);     printf("Also,%s, your first name has %d letters,\n", name, letters);     printf("And we have %d bytes to store it.\n", size);     system("pause");     return 0; } printf的格式话输出%s没有对应的变量

user: user-4
content: size = sizeofname;这个语句写的有问题吧
user-0 提问: 求解define后多赋值变量语法。

回复:
user: user-1
content: VC编译选项加/EP /P（项目、属性、配置属性、C/C++、预处理器、预处理到文件：是，预处理取消显示行号：是），重新编译，查看宏展开后对应的.i文件。gcc加-E http://bbs.csdn.net/topics/391003898

user: user-2
content: 楼主找一下define后的标识符在程序里是怎么用的，比如搜索一下EMIT_CLEAR(addr)，然后用( (OPCODE_CLEAR     << 4 ) | 1 ) , addr替换掉。也许看完代码就明白了。

user: user-3
content: 就是在程序中嵌入机器码，和汇编中在代码段中用db嵌入机器码类似。 EMIT_MASKWRITE(addr,mask,val) 在引用的地方会生成：0x33 xx xx xx，后三段是addr,mask,val的值

user: user-4
content: 从代码来看就是替换啊  #define EMIT_MASKWRITE(addr,mask,val)     ( (OPCODE_MASKWRITE << 4 ) | 3 ) , addr, mask, val 用EMIT_MASKWRITE(addr,mask,val)   替换( (OPCODE_MASKWRITE << 4 ) | 3 ) , addr, mask, val 至于( (OPCODE_MASKWRITE << 4 ) | 3 ) , addr, mask, val是实现什么功能这谁知道，又没有代码，只有你自己去看啊

user: user-5
content: 那就不太清楚了，我对他的理解仅限于此，坐等大佬来解答。

user: user-0
content: #define OPCODE_EXIT                            0U #define OPCODE_CLEAR                         1U #define OPCODE_WRITE                         2U #define OPCODE_MASKWRITE               3U #define OPCODE_MASKPOLL                 4U #define OPCODE_MASKDELAY               5U #define NEW_PS7_ERR_CODE                  1  /* Encode number of arguments in last nibble */ #define EMIT_EXIT()                                      ( (OPCODE_EXIT      << 4 ) | 0 ) #define EMIT_CLEAR(addr)                           ( (OPCODE_CLEAR     << 4 ) | 1 ) , addr #define EMIT_WRITE(addr,val)                      ( (OPCODE_WRITE     << 4 ) | 2 ) , addr, val #define EMIT_MASKWRITE(addr,mask,val)   ( (OPCODE_MASKWRITE << 4 ) | 3 ) , addr, mask, val #define EMIT_MASKPOLL(addr,mask)           ( (OPCODE_MASKPOLL  << 4 ) | 2 ) , addr, mask #define EMIT_MASKDELAY(addr,mask)         ( (OPCODE_MASKDELAY << 4 ) | 2 ) , addr, mask 寄存器值取得是逗号前边的值，但是不太理解怎么写是啥意思！！！？而且变量与本身宏没有啥相关性，代码是SDK编译自动生成的，平台vivado16.3 标准c代码，之前从没遇到过类似的写法，不明其意？

user: user-5
content: define 的作用就是原样替换，而且只是原样替换，你的这个好像不是返回一个值的吧。。     Example:  #define x(a,b)  (a+b)*(a-b) cout << x(1,2) << endl; ====>cout << (1+2)*(1-2) << endl;

user: user-5
content: 你的这个好像是函数的参数吧， 比如函数原型为 void xxxx(类型1 a, 类型2 b,类型3 c,类型4 d) {.......} ===调用的时候 就可以 xxxx(EMIT_MASKWRITE(b,c,d)); 还是那句话，只是原样替换。。。
user-0 提问: 给解释下代码的意思；

回复:
user: user-0
content: 谢谢 大家的解答

user: user-1
content: 两个unsigned char类型的数组。里面的内容是0x是表示16进制数。MAC地址一般是16进制表示的

user: user-2
content: 存储的是网卡的MAC地址，这些地址由IEEE管理和分配，所以每个厂商都有一个唯一的标识，前面3个字节代表厂商编码，后面3个字节由厂商自行分配，这样就保证了全球唯一性。

user: user-3
content: 这两个变量应该都表示计算机的MAC地址，MAC地址就是6个部分，每个部分是一个字节的十六进制数

user: user-4
content: 应该是存的48位MAC地址
user-0 提问: 直接对磁盘的读写会不会被操作系统记录下来？

回复:
user: user-0
content: 引用 8 楼 zhao4zhong1 的回复:不会 赵老师，谢谢啦，也不好意思哈

user: user-1
content: windows里面createfile  操作系统不会记录  覆不覆盖看位置，有些夹缝、标记已写的不覆盖（可以利用这一点来藏私密信息）

user: user-2
content: 引用 5 楼 weixin_39158150 的回复:[quote=引用 3 楼 ckc 的回复:] 不会形成文件，不过看你写在哪里，有可能会修改文件或者修改文件系统 普通人不需要用这个函数，别折腾这个了 我不是要用这种函数，我只是在想，用这种函数在磁盘上写的数据，操作系统会认为这里是已经有数据的还是空闲区域，这里会不会在以后被其他文件覆盖[/quote] 看你写的位置，如果写的地方已经被用了，比如是某文件的一部分，那么你实际上破坏了那个文件。甚至于你写在重要的区域可能直接导致文件系统甚至分区被破坏。如果写的地方没被用，是空的，那以后可能会被操作系统分配写入其它数据。 基本上除非很特殊的情况，我们不需要直接写磁盘

user: user-0
content: 引用 9 楼 Mr_sandman1994 的回复:[quote=引用 8 楼 zhao4zhong1 的回复:] 不会 看你把赵老师逼的[/quote]

user: user-3
content: 引用 8 楼 zhao4zhong1 的回复:不会 看你把赵老师逼的

user: user-4
content: 不会

user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:[quote=引用 3 楼 ckc 的回复:] 不会形成文件，不过看你写在哪里，有可能会修改文件或者修改文件系统 普通人不需要用这个函数，别折腾这个了 其实我已经相当于回答了，只是你不识货。[/quote] 不识货没错，可我本就是一个小白问问题，想听一个一两句话的直白回答，为什么要搞这么复杂的回答，我的确没从这个网页里看出什么

user: user-0
content: 引用 3 楼 ckc 的回复:不会形成文件，不过看你写在哪里，有可能会修改文件或者修改文件系统 普通人不需要用这个函数，别折腾这个了 我不是要用这种函数，我只是在想，用这种函数在磁盘上写的数据，操作系统会认为这里是已经有数据的还是空闲区域，这里会不会在以后被其他文件覆盖

user: user-4
content: 引用 3 楼 ckc 的回复:不会形成文件，不过看你写在哪里，有可能会修改文件或者修改文件系统 普通人不需要用这个函数，别折腾这个了 其实我已经相当于回答了，只是你不识货。

user: user-2
content: 不会形成文件，不过看你写在哪里，有可能会修改文件或者修改文件系统 普通人不需要用这个函数，别折腾这个了

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:FDump - Dumping File Sectors Directly from Disk using Logical Offsets http://www.codeproject.com/Articles/32169/FDump-Dumping-File-Sectors-Directly-from-Disk-usin 赵老师，这个网页只是介绍了一种API来操作磁盘，并没有回答我的问题啊

user: user-4
content: FDump - Dumping File Sectors Directly from Disk using Logical Offsets http://www.codeproject.com/Articles/32169/FDump-Dumping-File-Sectors-Directly-from-Disk-usin
user-0 提问: 关于指针的指针，何时是个尽头？

回复:
user: user-1
content: 你说的是对的，没有尽头，直到内存满了。是可以一直指针下去，如楼上所说的，就是一直指向其他的内存，但是没有什么意义

user: user-2
content: 一个数据就放在一个内存单元中，它有地址，可以没有指针，你所谓的指向它的指针，只是又在另一个空间保存了这块地址，这个空间就是个指针，当你不在这个空间保存它的地址的时候，它就没有指针，所以不存在指针的指针，我刚学的时候也想过这个问题，那是因为你以为指针必须有指针保存它的地址，而事实上是一个变量数据就是一个空间地址，不需要指针，指针只是你在另一个空间保存了它的地址罢了

user: user-3
content: 难道得一个比较热烈的帖子

user: user-4
content: 指针可以指回自身，那就真的没有尽头了。 ：）

user: user-5
content: 引用 58 楼 赵4老师的回复:[quote=引用 57 楼 weixin_43209425 的回复:] 指针理论是存在尽头的，因为指针也要占用内存，而一台机器的内存是有限的，所以，指针不能无限下去! 那循环链表呢？[/quote] 循环链表就相当于一个圆圈，是数据结构的一种特殊形式，你问一个圆圈有没有尽头不是一个没有意义的问题么。再者，循环链表的每一个指针指向都已经确定了，只是不断重复而已！

user: user-6
content: 引用 57 楼 weixin_43209425 的回复:指针理论是存在尽头的，因为指针也要占用内存，而一台机器的内存是有限的，所以，指针不能无限下去! 那循环链表呢？

user: user-5
content: 指针理论是存在尽头的，因为指针也要占用内存，而一台机器的内存是有限的，所以，指针不能无限下去!

user: user-7
content: 好厉害好厉害啊

user: user-8
content: 没有尽头的没有的 别反抗

user: user-9
content: 指针的指针只是你编程的时候需要，首先你要确定你要干什么，编程中根据需要确定使用几级指针，没必要纠结这个，都是人为定义的。

user: user-10
content: 在指针指了n次之后，那个内存里存的东西是不是个指针，如果是就继续指下去，如果不是就到头了。

user: user-11
content: 项目中出现三级指针都要被老大骂了。。。

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

user: user-12
content: 楼主说的是多级指针，理论上可以无限极，但是工作中最多也就二级指针了，三级的都没有遇到，所以不用纠结了呀

user: user-13
content: 没有指针的指针的。 通常这样说是简化了，是指向指针变量的指针。 只有变量才有地址的，指针变量是存储指针（地址）的变量。 任何变量都是有地址的（auto 变量除外），也就说都是有指针的，这是递归定义。

user: user-14
content: 指针是一个变量，它的值用于保存其它数据的地址。从这个最基本概念出发，指针真的没什么难理解的，别被人渲染指针有多难理解唬住了。

user: user-15
content: 呀呀呀哈哈哈哈哈哈哈哈哈哈哈

user: user-16
content: 指针就是地址 差不多是对的，不完全对，因为指针还有类型，同一个地址，用int *解析它，还是char *解析它，还是struct Student *解析，是各不相同的。  楼主应该了解内存，比如系统有1M的内存（打个比方），就是1024x1024个字节，你可以想象成100万（多）个格子，每个格子都有编号（从0开始），编号就是地址。比如int i，i变量被分配在编号为第100~103个格子（分配的位置是由系统决定的），如果赋值i=10，那么这4个格子里面存储的就是 00000000 00000000 00000000 00001010（等于整数10，这里还有内存字节序的问题，可以先不管），i的地址，就是&i，等于100（编号）。如果有一个int* p，p是一个指针变量，p变量被分配在编号为第104~107个格子，如果赋值p=&i，那么这4个格子里面存储的就是 00000000 00000000 00000000 01100100 （等于整数100），也就是p==100，p变量本身的地址，也就是&p，等于104。  常量，比如const int i=100，是不为i分配空间的，程序编译的时候自动把使用i的地方用100代替。 const char *str="Hello,world", "Hello,world"字符串字面量位于进程内存空间中的文字常量区，比如分配在编号第200~211个格子（每个格子存一个字符，最后有一个'\0'是自动添加的），如果用printf("%p:%s",str,str)输出，结果就是200:Hello,world，200表示str变量指向的地址，str变量可能被分配在108~111个格子（这4个格子里面存的值就等于200），而str变量的地址&str==108。

user: user-17
content: C 语言中需要修改指针的值，才用到二级指针，也就是指针的指针，一般三级都很少用了。当然你可以无限制创建下去，但意义何在？ 引用 30 楼 zhao4zhong1 的回复:见第一贴附带“四季青90后女孩在家无聊玩手机，存款惊 呆父母”广告模特。四季青，暴露位置了！我这里大半年都是“张江27岁刘某辞去保安工作，半年存款惊呆众人！”。

user: user-18
content: 指针是指向某一数据类型的，而指针也只一种数据类型，因此没有尽头。楼主可能觉得指针不是实在的数据类型，而是一种间接的表达方式，才会有这种想法。
user-0 提问: Digital Roots题目大意将输入的正整数的各个数相加

回复:
user: user-1
content: 思路是没问题，但是你没有初始化sum，结果就会错。 简单地说就是 int sum=0; 改一下就好

user: user-0
content: 谢谢，可以了
user-0 提问: 一百个人，一杀二然后把刀给三，三杀四然后把刀给五。以此规律往后，最后活着的是几？

回复:
user: user-1
content: #include "stdio.h" #include <conio.h> void main() { 	int z,count;          //遍历从首到尾为一大轮 	int i,j; 	int a[100]; 	int b[50]; 	j=1; 	count=0;            //定义count,为每一轮结束后，累加的总遍历人数  	for(i=1;i<101;i++)  //*给数组a[]赋值从1－100 	{ 		a[i-1]=i; 	}       int max=100;      //*定义max，为每一大轮开始场上剩下的总人，初始为100     int n=0;  	for(j=1;j<=max;j++)         	{	  		if(count%2==0)   //count为双，本轮留下奇数 		{ 			if(j%2!=0) 			{ 			n=n+1; 		    b[n-1]=a[j-1];		 		    printf("该数为：%d\n",b[n-1]); 			} 		}  		if(count%2!=0)    //count为单，本轮留下偶数 		{ 			if(j%2==0) 			{ 			n=n+1; 			b[n-1]=a[j-1];             printf("该数为：%d\n",b[n-1]); 			} 		}    		if(j==max) 		{  			for(z=0;z<n;z++) 			{ 				a[z]=b[z]; 			}   			count=count+max; 			max=n; 			j=0; 			printf("累计%d人次，本轮过后场上还留下%d人。\n",count,max); 			printf("按任意健继续……\n"); 			getch();  			n=0; 			z=0;  		}         if (max==1) 		{  		  break;  		}   	} 	printf("最终留下的数为：%d\n",a[z]); 	printf("Byebye!\n"); }

user: user-2
content: 循环链表

user: user-3
content: #include "stdio.h" #include "string.h"  #define MAX_SIZE 100  int KillMan(int a[], int n) { 	int q[MAX_SIZE]; 	int front = -1,rear = -1;   	for(int i = 0; i < MAX_SIZE; i++) 		q[++rear] = i;   	while(front != rear -1) 	{  		front = (front+1) % MAX_SIZE; 		int t1 = q[front];   		front = (front+1) % MAX_SIZE; 		int t2 = q[front];   		printf("\n%d", t2);   		rear = (rear+1) % MAX_SIZE; 		q[rear] = t1; 	}  	front = (front+1) % MAX_SIZE; 	return q[front];  }  void main() { 	int a[MAX_SIZE]; 	int n = sizeof(a) / sizeof(int);  	printf("\nrest:%d\n\n", KillMan(a, n)); }

user: user-4
content: 队列的思想还是清晰一点

user: user-5
content: 引用 2 楼 Slzde_sub 的回复:   约瑟夫循环 对，是一样的，只是3个人变两个人

user: user-6
content: 这种问题用数组多捞啊，用个循环链表不好么

user: user-7
content: 这问题搞复杂了，就是个队列问题，每次出队两个，进队一个，当队列长度为1时候的元素是啥
user-0 提问: C语言

回复:
user: user-1
content: 不需要返回值的时候用

user: user-2

user: user-3
content: 作为返回值或者作为参数，作为返回值时表示没有返回值，作为参数时表示没有参数

user: user-4
content: 不需要返回值或传入参数时，或者用于void *的返回值或参数，主要是不清楚返回值的类型或传入参数的类型时会使用void

user: user-5
content: 不需要返回值的时候就可以

user: user-6
content: 如果xx函数就不需要有返回值，则可用void xx()来声明和定义该函数。

user: user-7
content: void用处很多啊，可以当返回值，可以当参数。void指针用处更加广泛。很多消息发送，都先转成void*，再转回相应都数据结构

user: user-8
content: 试试说一下，好像是说不用返回值时或无参数时，会用到。 有一种函数，**它是不带参数的函数。没用过。 int rand(void); 还有一种是无返回值的函数如： void copy(char to[], char from[])         //有两个形式参数，用作：目标数组，源数组。 {     int i;      i = 0;          while ((to[i] = from[i]) != '\0')     {         ++i;     } } 这是一个子函数。它的作用就是，复制一个字符数组保存到另外某个字符数组中。**void是显现说明不用返回任何值。 下面这个是有返回值类型，有参数的子函数。以作比较。 int putline(char line[], int abc, int i_end)     //int 是要求类型为整形，函数返回的值要按要求来 { 	while (abc <= i_end) { 		putchar(line[abc]); 		abc++; 	} 	return abc;       //返回值为abc，类型会是int型。 } 这个子函数是有返回值的。打印行，并返回最后一个元素下标的值。
user-0 提问: 怎样获得自己拍的视频的码流

回复:
user: user-1
content: h264 文件比较简单，开头sps pps 然后后面就都是nalu帧。  h265还没接触过。。

user: user-0
content: 引用 1 楼 user-2的回复:使用ffmpeg库，一帧一帧的解。 谢谢您的回复，看来我要学习ffmpeg了

user: user-2
content: 使用ffmpeg库，一帧一帧的解。
user-0 提问: STL string类中文问题

回复:
user: user-1
content: 中文请使用wstring

user: user-2
content: 为什么 不用wstring呢？

user: user-3
content: 引用 1 楼 user-6 的回复: 字符串比较用strcmp吧。 直接== 怕是不行。我反正没试过string 的== 字符串比较可以用==。strcmp是C的用法吧。 ISO/IEC 14882:2011 21.4.8.2  [string::operator==]   template<class charT, class traits, class Allocator>   bool operator==(const basic_string<charT,traits,Allocator>& lhs,                   const charT* rhs) noexcept;   要求： rhs 指向一个至少包含 traits::length(rhs) + 1 个 chartT 的数组。 返回： lhs.compare(rhs) == 0.

user: user-4
content: 编码问题，需要转码。 可以参考以下文章 https://blog.csdn.net/jcjc918/article/details/52200478?locationNum=7&fps=1

user: user-5
content: 编码问题。。

user: user-6
content: 字符串比较用strcmp吧。 直接== 怕是不行。我反正没试过string 的==
user-0 提问: 请教一个预编译问题 #if #elif #endif

回复:
user: user-1
content: 引用 楼主 u010315185 的回复:#define COMM_PC // ---------------------------------------------------------------------------------------------[1] #if defined(COMM_PC)         #define MASTER_COMM_PC                       4  //-----------------------------------------------------[2] #elif defined(MAX3485_COMM_PC)         #define MASTER_COMM_PC                       3 #elif defined(MAX3232_COMM_PC)         #define MASTER_COMM_PC                       1 #else         #define MASTER_COMM_PC                       4  #endif   #if (MASTER_COMM_PC== 1)         #define PTZCOMMPC_USARTx USART1    //--------------------------------------------------------------[3]         #define PTZCOMMPC_NVIC_IRQChannel USART1_IRQn #elif (MASTER_COMM_PC== 4)         #define PTZCOMMPC_USARTx UART4//-------------------------------------------------------------------[3]         #define PTZCOMMPC_NVIC_IRQChannel UART4_IRQn #else         #define PTZCOMMPC_USARTx USART2         #define PTZCOMMPC_NVIC_IRQChannel USART2_IRQn #endif 背景：因为在项目中，使用的接口会有RS232或者RS485接口，所以想通过预编译指令来条件选择          本来是想要的执行顺序是   【1】-->【2】-->【3】          可是编译完成后，Go to Definition “PTZCOMMPC_USARTx”老是执行 绿色的代码【3】；即 【1】-->【2】-->【3】             //if(USART_GetITStatus(PTZCOMMPC_USARTx, USART_IT_RXNE) != RESET)   请问各位大神，这是什么原因？？？？  楼主写的语句问题， 如果想要【1】-->【2】-->【3】[/color]招待，那么#if defined(COMM_PC)改成 #ifdef  COMM_PC就可以了。 你的#define COMM_PC这种写法，只能用#ifdef或者#ifndef来判断， #if defined(COMM_PC)这种写法需要有具体的值，才可以。

user: user-2
content: 搞两个头文件，确保编译顺序

user: user-3
content: 运行时打印下MASTER_COMM_PC，然后全部重新编译一遍

user: user-4
content: Go to Definition  是不对的, 你实际编译运行后看结果
user-0 提问: errror C 2061  语法错误：标识符‘’Nodeptr‘’

回复:
user: user-1
content: 如楼上所说，遵循先定义后使用，编译器默认是从上往下搜寻的，所以必须要把声明或者实现放在使用的前面。

user: user-2
content: int FindPrevious(int nun, NodePtr header); 这一行移到NodePtr 定义之后

user: user-3
content: 你得把函数FindPrevious的声明放到结构体的定义之后。不然NodePtr都还未定义，编译器不认识  #include <stdio.h> #include <stdlib.h>   struct ListNode {     int num;     struct ListNode *next; }; typedef struct ListNode Node; typedef Node *NodePtr;  int FindPrevious(int nun, NodePtr header);  int main() { //... }

user: user-0
user-0 提问: 关于c语言中scanf赋值的一个疑问？

回复:
user: user-1
content: 作为局部变量a，定义之后你没有显式地给a赋值过，那么a的值应该就是内存中的乱码，应该程序每次运行时a的值都会不一样。如果你每次运行都是a的值都是0，那也许是跟编译器有关了。

user: user-0
content: 您好，我显示的a为0是为什么呢，跟系统有关吗，我用的mac

user: user-1
content: 第一段程序，如果输入的内容与类型不匹配，scanf函数会终止当前输入，并将已经输入的字符'f'退回到缓冲区，此时，缓冲区中仍然留着你输入的f56。而你所说的a的值是乱码，的确，由于没有从scanf获得输入，此时a的值，还是你当时定义的局部变量a，其内存中的乱码的那个值。以下的代码和结果，可以给你参考 #include <stdio.h> int main(void) {     int a;     char ss[100];     printf("plese \n");     printf("a = %d\n",a);     scanf("%d\n", &a);     scanf("%s",ss);     printf("number is %d\n", a);     printf("string is %s\n", ss);     return 0; }   第二段程序也是同样的道理，a的输入由于类型不匹配，a的输入被终止，a的值，那就原来内存里是啥就还是啥。你自己可以检验一下。 #include <stdio.h> int main(void) {    char b[20], c[20];    int a;    printf("a = %d\n",a);    scanf("%d", &a);    scanf("%s", b);    scanf("%s", c);      printf("a=%d, b=%s, c=%s.\n", a, b, c);    return 0; }  当然，此时的缓冲区里还剩下7，你可以自己再增加一个scanf语句来试试看。
user-0 提问: 在数据结构中单链表的插入和删除操作?

回复:
user: user-1
content: 数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633

user: user-2
content: 楼主想问的是链表头节点是否放元素的吧，如果链表头不放元素，在初始化链表的时候，需要分配一个空节点，用于存储头节点，后续插入删除都在头节点后面进行，好处就是不需要在动链表的指针了，且操作会简单一点，但会浪费一个节点的内存。如果链表头放元素的话，在删除，添加头节点的时候，需要更新链表头的指针，操作会麻烦一点，但不会浪费内存，这个要不要这个链表头空节点，取决于个人爱好，有没有关系都不大。 此外，楼主提供的代码，貌似有点小问题，首先你的i看起来是从1开始算，如果取0的话，搞个负数是啥意思，且好像没有考虑表头元素修改的问题。

user: user-3
content: 需要，0插入最开始处，是否变更L的值，依据实际情况考虑 如果变更那就更改指向，如果不变更，原始的第一个元素的值和插入值（内存）交换，并后插在头指针后

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

user: user-0
content: 引用 2 楼 沐雨青城的回复:楼主想问的是链表头节点是否放元素的吧，如果链表头不放元素，在初始化链表的时候，需要分配一个空节点，用于存储头节点，后续插入删除都在头节点后面进行，好处就是不需要在动链表的指针了，且操作会简单一点，但会浪费一个节点的内存。如果链表头放元素的话，在删除，添加头节点的时候，需要更新链表头的指针，操作会麻烦一点，但不会浪费内存，这个要不要这个链表头空节点，取决于个人爱好，有没有关系都不大。 此外，楼主提供的代码，貌似有点小问题，首先你的i看起来是从1开始算，如果取0的话，搞个负数是啥意思，且好像没有考虑表头元素修改的问题。 因为有些参考书上给出了这些，我很疑惑，我也感觉位置没有0位置，但是一想会不会凡事要有个意外

user: user-0
content: 引用 2 楼 沐雨青城的回复:楼主想问的是链表头节点是否放元素的吧，如果链表头不放元素，在初始化链表的时候，需要分配一个空节点，用于存储头节点，后续插入删除都在头节点后面进行，好处就是不需要在动链表的指针了，且操作会简单一点，但会浪费一个节点的内存。如果链表头放元素的话，在删除，添加头节点的时候，需要更新链表头的指针，操作会麻烦一点，但不会浪费内存，这个要不要这个链表头空节点，取决于个人爱好，有没有关系都不大。 此外，楼主提供的代码，貌似有点小问题，首先你的i看起来是从1开始算，如果取0的话，搞个负数是啥意思，且好像没有考虑表头元素修改的问题。 代码1和代码2的区别就是有没有考虑到用户输入的位置是0位置，即i=0

user: user-0
content: 引用 2 楼 沐雨青城的回复:楼主想问的是链表头节点是否放元素的吧，如果链表头不放元素，在初始化链表的时候，需要分配一个空节点，用于存储头节点，后续插入删除都在头节点后面进行，好处就是不需要在动链表的指针了，且操作会简单一点，但会浪费一个节点的内存。如果链表头放元素的话，在删除，添加头节点的时候，需要更新链表头的指针，操作会麻烦一点，但不会浪费内存，这个要不要这个链表头空节点，取决于个人爱好，有没有关系都不大。 此外，楼主提供的代码，貌似有点小问题，首先你的i看起来是从1开始算，如果取0的话，搞个负数是啥意思，且好像没有考虑表头元素修改的问题。 我的意思是：在对链表进行插入或删除操作时，需不需要考虑用户输入在0位置的插入和删除操作，若用户输入的是0，那么这个代码的意思就是，寻找0位置进行插入或删除操作，但0位置是没有意义的，即进行操作失败，我表达的应该是这个意思
user-0 提问: C# 读取MYSQL数据 列的所有值并且判断

回复:
user: user-0
content: 引用 5 楼 Smliling 的回复:我想在MySQL中存取 视频或图片，转化后都报格式错误！请个为大神指教  Mysql 储能图片和视频的地址，读取的时候直接读取地址就行了

user: user-1
content: 我想在MySQL中存取 视频或图片，转化后都报格式错误！请个为大神指教

user: user-0
content: 引用 1 楼 jianwen0529 的回复:偷偷告诉你，论坛里面有C#专区  在那里

user: user-2
content: 偷偷告诉你，论坛里面有C#专区

user: user-0
content: 请大神们，指导！！！！

user: user-2
content: 引用 2 楼 lidaoying 的回复:引用 1 楼 jianwen0529 的回复:偷偷告诉你，论坛里面有C#专区  在那里 .Net技术——C#
user-0 提问: getchar；与gets（）的读取

回复:
user: user-1
content: 自己试了试第二种，结果和第一种情况是一样的，a一样不能输出

user: user-2
content: scanf是格式化输入，既然是格式化，那么%d就是匹配一个整型，输入abcde因为不匹配，scanf返回0，getchar()是对应的换行符，输入的内容还在输入缓存里，当遇到gets时，就会将"abcde"赋值给a。因此可以正常输出。可以检查一下n，应该是一个随机值。

user: user-3
content: 第一个getchar读的是a 第二个getchar读的是回车

user: user-4
content: char *a; getchar(); 此处读取掉a  int n, m, t; scanf( "%d", &n ); //此处读取掉换行符，也就是你输入n回车键时候的换行符

user: user-0
content: 但是我scanf后面用了一次getchar啊，不是应该也是读取了第一个字母，gets从第二个开始吗，还是%d有什么特别意义

user: user-5
content: getchar scanf gets 等等 这些函数都是从stdin获取数据 你输入 abcede\n  缓冲区数据abcede\n 运行getchar 缓冲区数据 bcede\n 后面的gets就读取到b开头的字符串  你用scanf %d %d不处理 abcede\n 缓冲区数据不变  scanf 返回值0 n值不变 你后面gets获取到的字符串是a开头的
user-0 提问: 怎样提高clion的警告等级

回复:
user: user-0
content: 奇怪，不能上传图片。 点击file/settings/editor/code style/inspections，这时，在目录右侧出现C/C++/Data flow analysis，其中有一个项是“missing return”，点一下这个项，在右侧会出现选择warning或error的选项。 但是若程序中故意注释掉return语句，编译后什么也没有报。

user: user-0

user: user-0
content: 引用 1 楼 jianwen0529 的回复:把option选项和工程配置等浏览一遍，总会找得到的  找到了这个选项，缺少return时，默认是warning，但是将程序中的return注释掉，编译时不出现任何warning。将默认的warning选项更改为error，编译后仍然不报错。 不知怎么回事。。。

user: user-1
content: 把option选项和工程配置等浏览一遍，总会找得到的
user-0 提问: 求助

回复:
user: user-1
content: 你的代码已经做到了 不过楼上的说反了，因为你用的是#ifndef a  #ifndef a #include "b.h" #else #include "c.h" #endif 这段话的作用就是： 如果前面或预处理定义中没有 #define a 那么就 include "b.h" 如果有，那么就 include "c.h"

user: user-2
content: 前面或预处理定义中有 #define a 那么就选择b，没有就选择c
user-0 提问: 宏定义求助

回复:
user: user-1
content: 引用 2 楼 zhouchao_0321 的回复:首先你用#define a这种格式，应该是赋不了值的，只有真和假，如果想赋值做判断，有个方法你可以试一下行不行。 #define a 111, 然后如果需要重新定义的话，再#undef a; #define a 123(或其他)，判断的时候，用#if defined(a==123)来做判断。 +1

user: user-2
content: #define a 1 // 此处1可以改为其他值   #if(a==1) #define b 3 #elif(a==2) #define b 4 #else #endif

user: user-3
content: 首先你用#define a这种格式，应该是赋不了值的，只有真和假，如果想赋值做判断，有个方法你可以试一下行不行。 #define a 111, 然后如果需要重新定义的话，再#undef a; #define a 123(或其他)，判断的时候，用#if defined(a==123)来做判断。

user: user-4
content: #define a   //定义a //define a   //未定义a
user-0 提问: c语言关于字模输出函数的问题

回复:
user: user-1
content: 从上下文看 w单位是“位”，表示字模的宽度 char *pdata 存放的是字模具体数据，单位是字节，每字节等于8位 所以要w=(w+7)/8*8 算出，每行需要多少字节

user: user-2
content: 保证w/8是整除的，防止小数部分被舍弃，因为int/int得出的是向下取整（对于>=0的情况）

user: user-3
content: 重新计算w，看起来像是为了保证w始终为8的倍数。看起来代码像是每行同时控制8个点的，保证w为8的倍数应该是为了避免出现重复或者遗漏。
user-0 提问: 求助

回复:
user: user-1
content: 可以编译的时候，添加命令来指定

user: user-2
content: 你想通过scanf输入的a的值动态来判断include哪个头文件，貌似是不行，ifdef是编译时候确定的

user: user-3
content: #ifdef a==1 #include "b.h" #ifdef a==0 #include "c.h" #endif

user: user-4
content: #ifndef这类语句主要用在编译选择的时候，通过定义的宏来选择编译的内容，你这个用scanf函数是想根据运行时，来决定include哪个文件，应该是不行的，而且你的scanf("a = %d",&a);中的a是需要指定变量类型的，应该编译都过不了的吧。 不过可以通过在代码里使用#define 和#undef来开关编译选项，来选择#include文件的时机。

user: user-5
content: ifndef是判断有没有宏定义，而不是a的值是否为0

user: user-6
content: 了解一下代码生成技术。
user-0 提问: 求助

回复:
user: user-1
content: 是不是应该用C++的编译器编译呢？如果是需要调用C的头文件，建议使用#include <cqueue>

user: user-2
content: 没听说过驱动开发可以调用STL的。

user: user-3
content: 你包含的STL，不是C语言的头文件，用C编译肯定会出错
user-0 提问: 小白求教      c函数的参数指针问题

回复:
user: user-1
content: 请那些喜欢将数组作为函数参数传来传去或作为函数返回值的码农思考一下为什么不把整个互联网内容当作函数参数传来传去或作为函数返回值呢？

user: user-0
content: 引用 1 楼 hou09tian 的回复:func()函数的参数本身就是一个一维数组，并不是二维数组，所以ptr+1只能指向该数组的第二个元素。如果把func()的代码修改为 void func(int ptr[2][3]) { 	printf("ptr point is %p\n", ptr); 	printf("*ptr point is %p\n", *ptr); 	printf("*(ptr + 1) point is %p\n", **(ptr + 1)); } 此时，输出为  此时func()函数的参数是一个二维数组，ptr+1指向的是二维数组的第二个元素，即第二个一维数组。 请参考《C++中对数组名的运算》 希望能够帮到你   非常感谢您的回答。   但是难道 *ptr[8]不是由指针构成的数组,而ptr作为数组名是指针，则 ptr 等效为指针的指针？   作为小白，在我的认知里就是 [] 和 *不是可以匹配相等么， 那么* ptr[8] 可以匹配**ptr？ 谢谢帮助

user: user-0
content: 非常感谢你们的回答。   但是难道 *ptr[8]不是由指针构成的数组,而ptr作为数组名是指针，则 ptr 等效为指针的指针？   作为小白，在我的认知里就是 [] 和 *不是可以匹配相等么， 那么* ptr[8] 可以匹配**ptr？ 谢谢帮助

user: user-2
content: 你写的int *ptr[8]不就是一维数组指针么？

user: user-2
content: 你写的就是一位数组啊

user: user-3
content: func()函数的参数本身就是一个一维数组，并不是二维数组，所以ptr+1只能指向该数组的第二个元素。如果把func()的代码修改为 void func(int ptr[2][3]) { 	printf("ptr point is %p\n", ptr); 	printf("*ptr point is %p\n", *ptr); 	printf("*(ptr + 1) point is %p\n", **(ptr + 1)); } 此时，输出为  此时func()函数的参数是一个二维数组，ptr+1指向的是二维数组的第二个元素，即第二个一维数组。 请参考《C++中对数组名的运算》 希望能够帮到你

user: user-4
content: 数组传参，弱化成指针

user: user-3
content: 引用 5 楼 Eagle_hwei 的回复:[quote=引用 1 楼 hou09tian 的回复:] func()函数的参数本身就是一个一维数组，并不是二维数组，所以ptr+1只能指向该数组的第二个元素。如果把func()的代码修改为 void func(int ptr[2][3]) { 	printf("ptr point is %p\n", ptr); 	printf("*ptr point is %p\n", *ptr); 	printf("*(ptr + 1) point is %p\n", **(ptr + 1)); } 此时，输出为  此时func()函数的参数是一个二维数组，ptr+1指向的是二维数组的第二个元素，即第二个一维数组。 请参考《C++中对数组名的运算》 希望能够帮到你  非常感谢您的回答。   但是难道 *ptr[8]不是由指针构成的数组,而ptr作为数组名是指针，则 ptr 等效为指针的指针？   作为小白，在我的认知里就是 [] 和 *不是可以匹配相等么， 那么* ptr[8] 可以匹配**ptr？ 谢谢帮助[/quote] * ptr[8] 可以匹配**ptr 可以看一下func()函数的声明 void func(int **); func()函数的定义 void func(int *ptr[8]) 这就说明了可以匹配。 但是需要注意的是，在func()函数的定义中，该函数的形参ptr是一个一维数组，该数组中的元素类型是int*。所以ptr+1指向的是该数组中的第二个元素。

user: user-5
content: void func(int *ptr[8])     {         printf("ptr point is %p\n", ptr);         printf("*ptr point is %p\n", *ptr);         printf("*(ptr + 1) point is %p\n", *(ptr + 1));     } ============= 这一句，void func(int *ptr[8])中的int * ptr[8],是定义了一个有8个元素的int指针数组，这个指针数组里的每一个元素都是一个int指针。  主函数中的int ptr[2][3] = { {8, 7, 3}, {4, 5, 6} };这一句是定义了一个二维数组，作函数参数时，它应该是数组指针，即应该定义为 int (*ptr)[3]，  而楼主的程序写法是将一个二维数组的首地址传给了一个指针数组的首元素，由于C编译器使用线性的方式存放二维数组，子函数中的ptr事实上是分别指向了二维数组的元素(当然，最后2个指针越界了）
user-0 提问: 有限条边连接图的问题

回复:
user: user-1
content: 引用 2 楼 Scaramouch_ 的回复:[quote=引用 1 楼 adlay 的回复:] 方法一: 如果剩余的边数量 > 剩余未选到的点的数量:      从所有剩余边中选择最大的 否则:      从剩余的点关联的边上选择一条最大的  方法二:    1. 对每一个点, 选择一条和它相连的边种最大的一条    2. 去除重复的边    3. 剩余的按从大到小选取即可 方法二的话 ，这样有可能没有构成一个连通的图[/quote] 嗯, 确实是有这个可能, 看下这样:  1. 初始化已选边为空, 已选的点为空 2. 选择一条最长的边加入到已选的边中, 这条边的两个点加入到已选的点中. 3. 从剩余边中筛选出连接 已选的点 和 剩余的点 的边, 并从中选择最长的一条边出来 4. 将选择的边加入到已选边中, 将这条边上的点加入到已选的点中 5. 重复 3, 4 步, 直到剩余的点为空 6. 从剩余的边中从大到小选择  这样应该可以保证每一次选择出来的边都能和已选择的边构成一个连通图

user: user-1
content: 方法一: 如果剩余的边数量 > 剩余未选到的点的数量:      从所有剩余边中选择最大的 否则:      从剩余的点关联的边上选择一条最大的  方法二:    1. 对每一个点, 选择一条和它相连的边种最大的一条    2. 去除重复的边    3. 剩余的按从大到小选取即可

user: user-0
content: 引用 1 楼 adlay 的回复:方法一: 如果剩余的边数量 > 剩余未选到的点的数量:      从所有剩余边中选择最大的 否则:      从剩余的点关联的边上选择一条最大的  方法二:    1. 对每一个点, 选择一条和它相连的边种最大的一条    2. 去除重复的边    3. 剩余的按从大到小选取即可 方法二的话 ，这样有可能没有构成一个连通的图