Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: C语言 位域计算

回复:
user: user-1
content: unsigned int 是4字节，如果你写成char才是1字节  如果相邻位域字段的类型相同，且其位宽之和小于类型的sizeof大小，则后面的字段将紧邻前一个字段存储，直到不能容纳为止；  你后面有个unsigned int  :0; 也就是4字节中后面部分都不使用了  另外这方面网上也有一些讲解的，可以去网上搜索  结构体 位域

user: user-0
content: 引用 1 楼 user-1 的回复:这里占用4个字节 unsigned int a:4;  unsigned int  :0;   \\（空域，就也是说后面不用了）  这里又占用4个字节：       unsigned int b:4;        unsigned int c:4;        unsigned int d:5;        unsigned int  :0;   这里又是4个字节： unsigned int e:4;    一共12个  unsigned int  :0;   \\（空域，就也是说后面不用了）   是说这int类型的4个字节后面的不用了吗    不是该字节（第一个字节内）后面的不要吗  下面五点我就是看不太理解：位宽之和小于类型的sizeof大小   sizeof大小：是指8个位还是指类型的字节总数  帮解答下 谢谢 新年快乐

user: user-1
content: 这里占用4个字节 unsigned int a:4;  unsigned int  :0;   \\（空域，就也是说后面不用了）  这里又占用4个字节：       unsigned int b:4;        unsigned int c:4;        unsigned int d:5;        unsigned int  :0;   这里又是4个字节： unsigned int e:4;    一共12个

user: user-1
content: 1) 如果相邻位域字段的类型相同，且其位宽之和小于类型的sizeof大小，则后面的字段将紧邻前一个字段存储，直到不能容纳为止； 2) 如果相邻位域字段的类型相同，但其位宽之和大于类型的sizeof大小，则后面的字段将从新的存储单元开始，其偏移量为其类型大小的整数倍； 3) 如果相邻的位域字段的类型不同，则各编译器的具体实现有差异，VC6采取不压缩方式，Dev-C++采取压缩方式； 4) 如果位域字段之间穿插着非位域字段，则不进行压缩； 5) 整个结构体的总大小为最宽基本类型成员大小的整数倍。
user-0 提问: 一个C语言打印三角形的问题！

回复:
user: user-1
content: 楼主应该是这里没有控制好，输入完t之后，再输入n时，scanf将回车当做输入赋值给了n。因此每次循环都运行一次之后才是实际输入n值。 楼主可将scanf("%c",&n);改为scanf("\n%c",&n);或者每次打印之后再进行判断是否t--；

user: user-2
content: 我在学习C++ primer plus这本书，课后习题有一个就是这样。我编的代码有点繁琐，你可以参考一下。   #include <stdio.h>  char lets [26] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; int FindNumber(char);  int main (void) { 	int ROW, rows, chars, space, up, down; 	char letter, ch;  	while(1) 	{ 		printf ("\n\n请您输入一个大写字母，以便为您建造一个漂亮的字母金字塔^_^\n"); 	    letter = getchar(); 		if (letter >= 'A' && letter <= 'Z') 		{ 			printf ("\n\n\n"); 			ROW = FindNumber(letter); 			 			for (ch = 'A', rows = 1; rows <= ROW; rows++) 			{ 				for (space = 1; space <= ROW - rows; space++) 					printf (" "); 				printf ("%c", ch); 				for (up = 0; up < rows - 1; up++)                                   			 					printf ("%c", ++ch); 				for (down = 0; down < rows - 1; down++) 					printf ("%c", --ch); 				printf ("\n"); 			}     	} 		else 		{ 		 			printf ("童鞋，你输入的怎么不是大写字母呀！请按任意键退出程序。。。。。。。。。。。。。。。。");  			break; 		} 		getchar();  	} 	 	return 0; }  int FindNumber(char ch)			// 此函数实现的功能是在用户输入一个大写字母后，能找出它是26个字母中的第几个字母 { 	int index; 	 	for (index = 0; index < 26; index++) 	{ 		if (ch == lets [index]) 			break; 	} 	return index+1; }

user: user-3
content: int main() {     int t,i,j,m;     char ch,n;     scanf("%d",&t); 	getchar();     while(t--)     {         scanf("%c",&n); 	getchar();         if(n>='A'&&n<='Z')   加上两个getcgar（）；  我试了可以 你可以试一下         .........................

user: user-4
content: 请问下楼主，有这种需求吗？

user: user-0
content: 引用 1 楼 user-5的回复:打印什么式样的三角形？ 直角  锐角？   A AA AAA 还是     A    AA   AAA  AAAA AAAAA 输入字母或者数字，如输入C，就打印第一行A，第二行ABA，第三行ABCBA的等腰三角形，这个我已经写好了，问题是while（t--），t输入一个数字，控制测试数据有几组，但是总是不能达到t组数据

user: user-5
content: 打印什么式样的三角形？ 直角  锐角？   A AA AAA 还是     A    AA   AAA  AAAA AAAAA
user-0 提问: 对10个数排序的问题

回复:
user: user-1
content: 常见的排序方法总结： http://blog.csdn.net/zhangxiangdavaid/article/details/25082013

user: user-2
content: for(i=0;i<9;i++)     for(j=i+1;j<10;j++) {if(a[j]<a[i]) a[i]=t;a[i]=a[j];a[j]=t; 主要还是交换有问题。还有编程语言不是按行来分割的，是按分号进行判断这一行是否结束。判断这里需要加大括号 if(a[j] < a[i])  {                 t = a[i];                 a[i] = a[j];                 a[j] = t; }

user: user-3
content: #include<stdio.h> int main(){ 	int j,b,c,d,i,a[10]; 	for(j=0;j<10;j++) 	scanf("%d",&a[j]); 	for(b=0;b<9;b++) 	   for(c=0;c<9;c++){    		if(a[c]>a[c+1]){ 		   	d=a[c]; 			   a[c]=a[c+1]; 			      a[c+1]=d; 		   }    	} 	for(i=0;i<10;i++) 	printf("%d ",a[i]); 	return 0;	 }   你的错误根本在那个判断句，“if(a[j]<a[i])”在第二个for语句中，i的值始终是0；

user: user-4
content: 您好！我稍微改了一下你的代码：  请别忘记给点分，谢谢哈

user: user-5
content: if(a[j]<a[i]) { t=a[i];a[i]=a[j];a[j]=t;}     } //并且加花括号对

user: user-0
content: 吧a[i]=t换成了t=a[i] 结果还是不对

user: user-6
content: #include<stdio.h> int main() {     int i,j,t,a[10];     for(i=0;i<10;i++)     {         scanf("%d",&a[i]);     }     for(i=0;i<10;i++)         for(j=0;j<10;j++)         if(a[i]<a[j])     {         t=a[i];         a[i]=a[j];         a[j]=t;     }     for(i=0;i<10;i++)         printf("%5d",a[i]);     return 0; }  比较大小的时候循环有问题你自己看看= =

user: user-7
content: for(i=0;i<9;i++)//改成(i=0;i<10;i++)     for(j=i+1;j<10;j++)//改成(j=0;j<i-1;j++) {if(a[j]<a[i]) a[i]=t;a[i]=a[j];a[j]=t;     }  为什么这么改自己好好自习想想
user-0 提问: 使用数组，指针，函数，还冒泡排序的方式，使输入3个数字按照从大到小排序出来，输入数字后无反应。

回复:
user: user-1
content: 数据结构与算法之排序 http://blog.csdn.net/zhangxiangdavaid/article/details/25082013

user: user-0
content: 感谢各位的帮助，非常谢谢，不好意思，这两天新年很忙没时间来看，非常谢谢

user: user-2
content: #include <stdio.h> int main(int argc, char const *argv[]) {     int a[3],*b[3],i;     void compare(int *b1[],int a1[]);     printf("please enter 3 number:");     for (i = 0; i < 3; i++) {         scanf("%d",&a[i]);  //修改处 输入时如：1 2 3 回车 数间加空格。     }           for (i = 0; i < 3; i++) {         b[i]=&a[i];     }           compare(b,a);          for (i = 0; i < 3; i++) {         printf("%d\n",a[i]);     }     return 0; }   void compare(int *b1[],int a1[]) {     int i,j,t;     for (i = 3; i > 0; i--) {  //修改处          for (j = 0; j < i-1; j++) {             if(a1[j]<a1[j+1]){                 t=*b1[j];   //修改处                  *b1[j]=*b1[j+1];  //修改处                  *b1[j+1]=t;  //修改处              }         }     } }

user: user-3
content: 用空白符结尾时，scanf会跳过空白符去读下一个字符，所以你必须再输入一个数 空白符包括空格，制表符，换行符，回车符和换页符

user: user-3
content: scanf("%d\n",&a[i]); 改成 scanf("%d",&a[i]);
user-0 提问: 用rand得到一个随机数作为创建文件的文件名应该怎么写

回复:
user: user-1
content: sprintf格式化n成字符串，然后fopen建立文件就可以了

user: user-0
content: 没人啊没人啊

user: user-2
content: 利用系统提供的tmp比较好 另外，随机数是有重复的

user: user-3
content: 先用srand初始种子
user-0 提问: hdu2014

回复:
user: user-0
content: 引用 4 楼 user-1 的回复:只要输入n大于2，你代码貌似是对的  最后prinf中也用 %.2lf 看下 今天原来的代码也能a了，找照你的改也能a，可能那天杭电oj有问题

user: user-1
content: 只要输入n大于2，你代码貌似是对的  最后prinf中也用 %.2lf 看下

user: user-0
content: 引用 1 楼 user-1 的回复:写得有点冗余，不过貌似没什么问题 我 想 知 道 哪 里 有 问 题 ，试了一下，输   出 也 是 对 的

user: user-0
content: 引用 1 楼 user-1 的回复:写得有点冗余，不过貌似没什么问题 a不了 直接max=0； min = 100；可以a

user: user-1
content: 写得有点冗余，不过貌似没什么问题
user-0 提问: 测试GTK+安装的小程序出错，寻求帮助！

回复:
user: user-1
content: http://www.oschina.net/question/100374_57793 这里有说明的，-c是编译，还没链接成可执行文件呢，还有学业学gtk3吧，虽说不等gimp移植到gtk3，gtk2是不会死的
user-0 提问: 关于数组越界后还能成功赋值的问题

回复:
user: user-1
content: 谢邀，  看了下你写的代码，ans[y]，这种形式是在运行时赋值，编译器是无法提前知道你运行时y的赋值情况，因此编译器是不会检查y是否大于100005的。  另外，数组的访问也可以写为指针形式的访问，如ans[y] ===> *(ans+y), 因此ans+y的地址如果在内存中存在，C语言即可访问，这是C的牛B之处，也是C麻烦之难。

user: user-2
content: 引用 3 楼 xvcksai 的回复:[quote=引用 2 楼 paschen 的回复:] 越界不是编译错误，但是会读写不属于你内存的东西，这可能造成程序运行时崩溃，没出错最多能说明运气好  越界赋值从本质上来讲是不对的？成功赋值只是看概率？ 请问是这个意思吗？[/quote]  这是一种不确定行为，这不是产生编译错误，而是产生运行错误，如果你数组后还有其他重要的数据，赋值就会把他们覆盖了，严重的话会使程序崩溃，并不是成功只是看概率，是没失败不代表正确！

user: user-3
content: 这不是明摆着不可以的吗？

user: user-2
content: 越界不是编译错误，但是会读写不属于你内存的东西，这可能造成程序运行时崩溃，没出错最多能说明运气好

user: user-0
content: 引用 1 楼 ynsenyu 的回复:越界的内存没有分配就可以啊，人家可不管这个越界检查的  那是对还是错的？。。我下次可以这么做吗?

user: user-0
content: 引用 2 楼 paschen 的回复:越界不是编译错误，但是会读写不属于你内存的东西，这可能造成程序运行时崩溃，没出错最多能说明运气好  越界赋值从本质上来讲是不对的？成功赋值只是看概率？ 请问是这个意思吗？

user: user-3
content: 越界的内存没有分配就可以啊，人家可不管这个越界检查的

user: user-4
content: 应用程序的所有内存，都是可用（读写）的 只是只读内存,写入会出错，或者没有作用 其他内存可能不再应用程序可用范围，会发生莫名其妙的错误 但是这些跟编译器确实没啥关系 有关系的是程序员，你不能写这种容易出错，没有保障的程序。 这是你自己的错误，编译器没有义务处理这种逻辑错误。 C的原则是信任程序员，你做的任何事情都是允许的，只要不是语法错误。 你要保证，你的程序是正确的 C++虽然没有完全继承这个逻辑，但是还是继承了相当一部分的。

user: user-5
content: 指针越界 和 犯法一样 一次没被抓住，不等于合法
user-0 提问: 一个小的问题，但我怎么也想不明白

回复:
user: user-1
content: Status AddSMatrix(TSMatrix M,TSMatrix T,TSMatrix *P) {    int col,pa,pb,pc;    P->mu=M.mu;    P->nu=M.nu;    pa=0,pb=0,pc=0;    for(col=1;col<=M.mu;col++)    {     while(M.data[pa].i==col&&M.data[pb].i==col)  //打错了，改为M.data[pa].i==col&&T.data[pb].i==col  { if(M.data[pa].j==T.data[pb].j) {    P->data[pc].i=T.data[pb].i;    P->data[pc].j=T.data[pb].j;    P->data[pc].e=M.data[pa].e+T.data[pb].e;    pa++;    pb++;    pc++;  } if(M.data[pa].j>T.data[pb].j) {    P->data[pc].i=M.data[pa].i;    P->data[pc].j=T.data[pb].j;    P->data[pc].e=M.data[pa].e+T.data[pb].e;    pb++,pc++; } if(M.data[pa].j<T.data[pb].j) {    P->data[pc].i=M.data[pa].i;    P->data[pc].j=M.data[pa].j;    P->data[pc].e=M.data[pa].e+T.data[pb].e;    pa++,pc++; } printf("pa=%d,pb=%d\n",pa,pb); printf("P->tu=%d\n",pc);  }      }    P->tu=pc;    printf("P->tu=%d",pc);    return OK; } 具体可参考稀疏矩阵加法_百度的  int AddMtrix(struct TSMtrix A,struct TSMtrix B,struct TSMtrix *C)  函数。

user: user-2
content: 给个建议，如果想不明白不要空想，单步运行调试程序，每一步观察各个变量如何变化，然后就会找到原因

user: user-0
content: #include<stdio.h> #include<stdlib.h> #define MAXSIZE 1250 #define OK 1 #define ERROR -1 typedef int ElemType; typedef int Status; typedef struct {    int i,j;    ElemType e; }Triple; typedef struct {    Triple data[MAXSIZE+1];    int mu,nu,tu; }TSMatrix; Status InitMatrix(TSMatrix *M) {    int k;    printf("Input mu,nu,tu\n");    scanf("%d,%d,%d",&(M->mu),&(M->nu),&(M->tu));    if(M->mu<=0||M->nu<=0)printf("ERROR");    else    { 	  printf("Please input the elem\n"); 	  for(k=0;k<M->tu;k++) 	  { 		 printf("The row\n"); 		 scanf("%d",&(M->data[k].i)); 		 printf("The col\n"); 		 scanf("%d",&(M->data[k].j)); 		 printf("The value\n"); 		 scanf("%d",&(M->data[k].e)); 	  }    }    return OK; }  Status PrintMatrix(TSMatrix *M) {    int k,j;    for(k=0;k<M->tu;k++)    { 	  printf("(%d,%d,%d)\n",M->data[k].i,M->data[k].j,M->data[k].e);    }    return OK; } Status AddSMatrix(TSMatrix M,TSMatrix T,TSMatrix *P) {    int col,pa,pb,pc;    P->mu=M.mu;    P->nu=M.nu;    pa=0,pb=0,pc=0;    for(col=1;col<=M.mu;col++)    { 	  	 while(M.data[pa].i==col&&M.data[pb].i==col) 		 { 			if(M.data[pa].j==T.data[pb].j) 			{ 			   P->data[pc].i=T.data[pb].i; 			   P->data[pc].j=T.data[pb].j; 			   P->data[pc].e=M.data[pa].e+T.data[pb].e; 			   pa++; 			   pb++; 			   pc++;  			} 			if(M.data[pa].j>T.data[pb].j) 			{ 			   P->data[pc].i=M.data[pa].i; 			   P->data[pc].j=T.data[pb].j; 			   P->data[pc].e=M.data[pa].e+T.data[pb].e; 			   pb++,pc++; 			} 			if(M.data[pa].j<T.data[pb].j) 			{ 			   P->data[pc].i=M.data[pa].i; 			   P->data[pc].j=M.data[pa].j; 			   P->data[pc].e=M.data[pa].e+T.data[pb].e; 			   pa++,pc++; 			} 			printf("pa=%d,pb=%d\n",pa,pb); 			printf("P->tu=%d\n",pc); 		 } 	     }    P->tu=pc;    printf("P->tu=%d",pc);    return OK; }  int main(void) {   TSMatrix M,T,P;   clrscr();   InitMatrix(&M);   InitMatrix(&T);   AddSMatrix(M,T,&P);   printf("The result is");   PrintMatrix(&P);   return 0; }

user: user-1
content: 求完整代码。
user-0 提问: 请各位大神帮忙看一下一个小程序，如何提高运算效率，必有重谢！！！

回复:
user: user-1
content: for(k=0;k<15000;k++)//这地方是否有错误？         {             /****/             for(i=0;i<=n-1;i++)             {                 for(j=0;j<=n-1;j++)                 {                     for(k=0;k<8;k++) 改成  for(k1=0;k1<15000;k1++)//这地方是否有错误？         {             /****/             for(i=0;i<=n-1;i++)             {                 for(j=0;j<=n-1;j++)                 {                     for(k=0;k<8;k++) 只要6~7秒就可以了,应该可以更快

user: user-1
content: for(k=0;k<15000;k++)//这地方是否有错误？         {             /****/             for(i=0;i<=n-1;i++)             {                 for(j=0;j<=n-1;j++)                 {                     for(k=0;k<8;k++)

user: user-1
content: 感觉你这个从头设计比修改要好

user: user-2
content: 首先从宏观上优化，能用更好的算法就用更好的 然后再从细部优化，你看下你程序是否方便用并行运算，这样可以提高效率 优化了这些还是觉得慢，可以用profier测试一下，看是哪一部分是瓶颈，然后再对这一部分想办法

user: user-1
content: if(k==0) esum2 = 0.5*s[i][j][0]*s[(i+1)&7][j][5]/t;                         if(k==1) esum2 = 0.5*s[i][j][1]*s[(i+1)&7][j][4]/t;                         if(k==2) esum2 = 0.5*s[i][j][2]*s[i][(j+1)&7][7]/t;                         if(k==3) esum2 = 0.5*s[i][j][3]*s[i][(j+1)&7][6]/t;                         if(k==4) esum2 = 0.5*s[i][j][4]*s[(i-1)&7][j][1]/t;                         if(k==5) esum2 = 0.5*s[i][j][5]*s[(i-1)&7][j][0]/t;                         if(k==6) esum2 = 0.5*s[i][j][6]*s[i][(j-1)&7][3]/t;                         if(k==7) esum2 = 0.5*s[i][j][7]*s[i][(j-1)&7][2]/t; 这个可以改成一次比较
user-0 提问: 关于函数指针返回值为字符数组时的问题。

回复:
user: user-0
content: 类似于值传递和地址传递的意思吧？我明白了。

user: user-1
content: 不要返回指向局部变量的指针，第一种情况你数组是个局部变量，是在栈上分配的，函数执行完就销毁了；第二种情况，你的指针是指向常量区的字符串，并不是局部变量，所以没有问题

user: user-2
content: 楼上正解。如果楼主了解 堆和栈的区别，这个现象就很好理解了。

user: user-3
content: 补充一下一楼，hello world存储在文字常量区而pcstr指针直接指向该区地址，返回可以打印成功，而acstr[]数组在函数栈内自行开辟一块内存空间并将hello world从文字常量区拷贝出来复制到该栈内，而acstr直接指向该栈地址，当函数调用结束后该栈被销毁所以返回后无法打印

user: user-4
content: 需要理解两点： 1.  char acStr[]="hello world"; 等同于 char acStr[12]="hello world"; 这种类型的字符串在栈区  2. 栈区与全局区的区别
user-0 提问: C语言，有个小小对计算机执行程序的基础问题。

回复:
user: user-1
content: 引用 4 楼 qq_33447655 的回复:[quote=引用 3 楼 u010165006 的回复:] explorer.exe是Windows程序管理器或者Windows资源管理器，它用于管理Windows图形壳，包括开始菜单、任务栏、桌面和文件管理。删除该程序会导致Windows图形界面无法使用。（360百科） 不用删除，直接打开任务管理器，然后结束任务把它结束掉。电脑桌面会消失，就剩一张桌面壁纸[/quote] 是的，这个explorer.exe有时会出现需要重启的。

user: user-1
content: explorer.exe是Windows程序管理器或者Windows资源管理器，它用于管理Windows图形壳，包括开始菜单、任务栏、桌面和文件管理。删除该程序会导致Windows图形界面无法使用。（360百科）

user: user-0
content: 引用 3 楼 u010165006 的回复:explorer.exe是Windows程序管理器或者Windows资源管理器，它用于管理Windows图形壳，包括开始菜单、任务栏、桌面和文件管理。删除该程序会导致Windows图形界面无法使用。（360百科） 不用删除，直接打开任务管理器，然后结束任务把它结束掉。电脑桌面会消失，就剩一张桌面壁纸

user: user-1
content: 因为以前Windows 3.1没有后来Windows 95才开始出现的【开始】菜单，没有任务栏，也没有苹果电脑MacOS那样的一个操作面板，所以操作电脑不是很方便，就出现了第三方的图形shell，那个Dashboard是类似苹果电脑的操作面板的，上面除了图标，还有菜单可以分组访问到安装的所有程序。

user: user-1
content: 你说的外壳英语是shell，因为一台电脑，最里面的是硬件裸机，外面一层是操作系统内核，再外面一层是API、系统调用等，最外面一层就是外壳shell。你说的没错，外壳就是人与电脑交互的接口（界面，interface），可以是命令行接口（如DOS、Linux，Linux里面就有几种shell程序），也可以是图形用户界面接口（如Linux的XWindow（KDE、GNome都是），如Windows系统的Explorer，甚至可以用第三方的图形shell代替Windows自带的，如以前Windows 3.1下的Dashboard这样的软件）
user-0 提问: 小白最近遇到的#include中一些函数无法使用的问题，求指教

回复:
user: user-1
content: 谢邀，但很抱歉自己不会，  同苦也，最近年前还有想法用开源的2D图形库画一个行星运行图，但一直都没有增加到eclipse里去。。。

user: user-2
content: 【C/C++程序设计学习与实验系统】，设置里面把编译器设为TC。软件自带DOSBox，可以运行TC编译出来的DOS程序。

user: user-3
content: 这个，dos是直接写屏的，现在要做这个就麻烦得多了，windows最简单就是用gdi绘图了，3d的话directx或者opengl，这个就不是一本书可以得了，要看很多书的

user: user-0
content: 引用 3 楼 ynsenyu的回复:换本新的书吧，要算法还可以借鉴，这系统相关的东西，这都是dos时代的程序了 求推荐→_→要有库在里面的

user: user-3
content: 换本新的书吧，要算法还可以借鉴，这系统相关的东西，这都是dos时代的程序了

user: user-4
content: 换本书吧 ...

user: user-5
content: console屏幕处理例子程序。终端窗口屏幕处理相关API使用例子。来自MSVC20\SAMPLES\win32\console\ http://download.csdn.net/detail/zhao4zhong1/3461309
user-0 提问: 关于栈这个东西。我想问问!它是由操作系统在内存中固定划分的一块区域码？

回复:
user: user-1
content: 理解和讨论之前请先学会如何观察！  VMMap 是进程虚拟和物理内存分析实用工具。http://technet.microsoft.com/zh-cn/sysinternals/dd535533

user: user-2
content: 栈，DOS下，分两种情况， 一种是操作系统设置的（tiny模式，small也是）， 一种是程序设置的(只需要设置段地址到SS寄存器) 现代操作系统中，往往直接加载就可以了，栈不用设置了； 栈的大小。可以在编译时候设置，不设置的话,编译器采用操作系统默认值。 另外，多线程程序，每个线程一个栈。 操作系统本身，有它自己的内核栈  数据区，和代码区 DOS下，是应用程序可以设置的。 高级语言中，一般都是编译器设置的， 有些是操作系统确定的， 有些是编译器安排，程序运行时确定的。  现代操作系统中。高级语言里面， 是编译器设置内容大小，操作系统加载确定的。

user: user-3
content: 引用 楼主 qq_33447655 的回复:编译器把上面的程序翻译成二进制之后。传给CPU？  经过编译、链接之后将生成EXE文件，里面存储了各二进制信息。当启动这个程序，进程会将文件加载到内存，作好各种准备工作，比如映射需要的DLL等，之后开始执行程序代码  引用 楼主 qq_33447655 的回复:首先#include <stdio.h> 这一句，系统会找到stdio.h这个文件并把里面的内容复制到内存中，复制到内存哪里呢  这些都是编译器、链接器的事，编译后是生成文件，在文件被调用时，才被操作系统加载到内存

user: user-4
content: 看一下《深入理解计算机系统》或者《程序员的自我修养》，或者找些关于编译、链接的资料看一看。

user: user-5
content: 1) 栈是系统划分的, 编译时可以设置大小 2) EXE中已经不存在什么头文件, int a=0之内, 没有变量名, 也就没有什么变量表, 一切都是地址,那是编译器操心的事

user: user-6
content: 对 C 语言来说，编译 与 运行是两个完全独立的过程。  你现在把两个过程掺在一起了。
user-0 提问: qt弹出窗口，在关机的时候

回复:
user: user-0
content: ::MessageBoxA(NULL,"msg","title",MB_OK); 或 ::MessageBoxW(NULL,L"msg",L"title",MB_OK);

user: user-0
content: 报错了，怎么解决？

user: user-0
content: C:\Users\APPLE\Desktop\guanji\widget.cpp:135: error: '_T' was not declared in this scope          ::MessageBox(NULL,_T("msg"),_T("title"),MB_OK);//澶х璇寸殑锛屽湪鍏虫満鐣岄潰鏄剧ず鎻愮ず妗�                                    ^

user: user-1
content: ::MessageBox(NULL,_T("msg"),_T("title"),MB_OK);
user-0 提问: linux网络协议栈阅读理解--带详尽注释及相关函数流程调用注释，附github注释后源码

回复:
user: user-0
content: 不好意思，前面地址发错了，应该是这个 https://github.com/y123456yz/Reading-and-comprehense-linux-Kernel-network-protocol-stack

user: user-1
content: 沙发，接分。
user-0 提问: C语言小白指针求解惑

回复:
user: user-1
content: 第二个for中你的b已经溢出数组了

user: user-1
content: b++是会改变b的值而b+i则不会

user: user-0
content: 引用 3 楼 weixin_33887675 的回复:你把第一个for中的语句改为*(b+I)=I+1;   试一试 确实行了，请问原因

user: user-0
content: 引用 2 楼 weixin_33887675的回复:楼主你输出的不是地址而是一个乱值，因为再第一个for  b已经被改变了，而第二个for你以为b的地址还是a数组第一个元素的地址，建议设两个指针一个用于给数组赋值，一个用于打印，而且*b++也有问题，他导致从不 a[1]开始赋值 请问第二个for b是指向a[1]是吗？

user: user-1
content: 楼主你输出的不是地址而是一个乱值，因为再第一个for  b已经被改变了，而第二个for你以为b的地址还是a数组第一个元素的地址，建议设两个指针一个用于给数组赋值，一个用于打印，而且*b++也有问题，他导致从不 a[1]开始赋值

user: user-1
content: 你把第一个for中的语句改为*(b+I)=I+1;   试一试

user: user-2
content: b是指向数组的指针 *b 是数组

user: user-3
content: *b++  ;  会改变指针值
user-0 提问: 指向数组的指针变量

回复:
user: user-1
content: 引用 7 楼 qq_33447655 的回复:[quote=引用 1 楼 user-3 的回复:] 1 这是编译器的工作, pa是局部变量, 也就是占用栈空间, A也是一样.由于你定义A的内容是int, 要连续占用4个字节,就是你说的12345-12348 存放的是1, pa只存放A的地址,没有放其它的操作  2 简单一点就是pa[i][j][k] 指针就是间接寻址, 明白什么叫间接寻址就行了 看了下赵四老师的 在结合版主的 我明白了。 3级指针 。[/quote] 嗯，楼主还算是心有灵犀的。

user: user-0
content: 引用 1 楼 user-3 的回复:1 这是编译器的工作, pa是局部变量, 也就是占用栈空间, A也是一样.由于你定义A的内容是int, 要连续占用4个字节,就是你说的12345-12348 存放的是1, pa只存放A的地址,没有放其它的操作  2 简单一点就是pa[i][j][k] 指针就是间接寻址, 明白什么叫间接寻址就行了 或者这么说 :你能说了一下 printf("%d ",*(*(*(pA+i)+j)+k)); 这个3级指针式怎么运算的？就是里面三个*  这部分！

user: user-0
content: 引用 1 楼 user-3 的回复:1 这是编译器的工作, pa是局部变量, 也就是占用栈空间, A也是一样.由于你定义A的内容是int, 要连续占用4个字节,就是你说的12345-12348 存放的是1, pa只存放A的地址,没有放其它的操作  2 简单一点就是pa[i][j][k] 指针就是间接寻址, 明白什么叫间接寻址就行了 看了下赵四老师的 在结合版主的 我明白了。 3级指针 。

user: user-1
content: 仅供参考：//char (*(*x[3])())[5];//x是什么类型的变量? // //分析C语言声明，关键是搞清楚这个变量是个什么东西（函数、指针、数组）， //是函数那么剩下的就是他的参数和返回值， //是指针那剩下部分是说明他指向什么， //是数组剩下的部分就是说明数组的成员是什么类型。 //解析C语言声明规则： //从左侧第一个标识符开始，按照优先级进行结合。*表示是..的指针，const表示只读的，volatile表示可变的，[]表示是数组，()表示是函数。 // //x和[3]结合说明是一个大小为3的数组，该数组的每个元素为一类指针，该类指针指向一类函数，该类函数无参数，返回一类指针，该类指针指向一个大小为5的char型数组 #include <stdio.h> #include <typeinfo.h> char num[5]; char (*x00())[5] {     return # } int main() {     char (*(*x[3])())[5];//是个数组，大小为3     char (*(*x0  )())[5];//数组的元素，是个函数指针     char (*( x00 )())[5];//函数原型，参数为空，返回值为指针     char (*  x000   )[5];//返回值      x0 = x00;     x[0] = x0;     x[1] = x0;     x[2] = x0;     printf("typeid(x).name() is %s\n",typeid(x).name());     return 0; } //typeid(x).name() is char (* (__cdecl**)(void))[5]

user: user-2
content: 为pa指针赋值  pa是指向int[3][4]二维数组的指针  赋值后将指向你的A[2][3][4]数组的头部，也就是A[0]这个int[3][4]类型

user: user-1
content: 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！ 不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！）  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对应的汇编并单步执行观察相应内存和寄存器变化。）

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

user: user-3
content: 1 这是编译器的工作, pa是局部变量, 也就是占用栈空间, A也是一样.由于你定义A的内容是int, 要连续占用4个字节,就是你说的12345-12348 存放的是1, pa只存放A的地址,没有放其它的操作  2 简单一点就是pa[i][j][k] 指针就是间接寻址, 明白什么叫间接寻址就行了
user-0 提问: 动态二维数组创建，问题出在哪里？高手HELP

回复:
user: user-1
content: int row = 8; int column = 8; int i = 0;   int **array = (int **)malloc(sizeof(int*)*row);  for(i=0;i<row;i++) { 	 array[i] = (int*)malloc(sizeof(int)*column); }  大致就是这样

user: user-2
content: int(*p)[]; 	p = (int(*)[])malloc(sizeof(int)*row*line);

user: user-0
content: 我也是参考这个写法的 http://zhidao.baidu.com/question/112765442.html?fr=iks&word=%B6%AF%CC%AC%B6%FE%CE%AC%CA%FD%D7%E9&ie=gbk  第一种写法启发的 HELP +QQ ， 楼上的写法精湛，以后学习指导我一下，THANKS   +我QQ:64990997

user: user-3
content: 思考一下为什么不把整个互联网内容当作函数参数传来传去呢？

user: user-3
content: 没有对二维数组“一次性申请内存空间”，且还能按照arr[y][x]这样的格式读写这一说。 楼主试试发明一个让我学习一下。

user: user-0
content: 先申请行指针，再申请列指针。。。这个我早会了。。我需要的是一次性申请内存空间  利用 int (*p)[row] //row为列数 p=(int(*)[row])malloc(sizeof(int)*row*line);// line为行数  利用这种写法，HELP

user: user-3
content: 仅供参考：#include <stdio.h> #include <stdlib.h> #include <malloc.h> int **newarr2d(int rows,int cols) {     int **p,i;      p=(int **)malloc(rows*sizeof(int *));     if (NULL==p) exit(1);     for (i=0;i<rows;i++) {         p[i]=(int *)malloc(cols*sizeof(int));         if (NULL==p[i]) exit(1);     }     return p; } void deletearr2d(int **p,int rows) {     int i;      for (i=0;i<rows;i++) {         free(p[i]);     }     free(p); } int main() {     int **arr2d,i,j,r,c;      r=4;     c=5;     //在堆中开辟一个4×5的二维int数组     arr2d=newarr2d(r,c);     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             arr2d[i][j]=i*c+j;         }     }     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             printf(" %2d",arr2d[i][j]);         }         printf("\n");     }     deletearr2d(arr2d,r);      r=6;     c=3;     //在堆中开辟一个6×3的二维int数组     arr2d=newarr2d(r,c);     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             arr2d[i][j]=i*c+j;         }     }     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             printf(" %2d",arr2d[i][j]);         }         printf("\n");     }     deletearr2d(arr2d,r);      return 0; } //  0  1  2  3  4 //  5  6  7  8  9 // 10 11 12 13 14 // 15 16 17 18 19 //  0  1  2 //  3  4  5 //  6  7  8 //  9 10 11 // 12 13 14 // 15 16 17 //

user: user-3
content: 6楼的写法VC6编译通不过。

user: user-3
content: 引用 2 楼 lgs6715 的回复:先申请行指针，再申请列指针。。。这个我早会了。。我需要的是一次性申请内存空间  利用 int (*p)[row] //row为列数 p=(int(*)[row])malloc(sizeof(int)*row*line);// line为行数  利用这种写法，HELP 这种写法局限于row为编译期常量（VC6）。

user: user-3
content: 这种写法理解费劲，还更容易失败。（不都说吃不到的葡萄最酸吗？）
user-0 提问: sprintf 报错求助

回复:
user: user-1
content: //由char PhoneNumber[14] = "187-9999-9988";得到char* ExtractedCodes[] = {"187", "9999", "9988"}; #include <stdio.h> #include <string.h> char PhoneNumber[14] = "187-9999-9988"; char PhoneNumber1[14] = "187-9999-9988"; char* ExtractedCodes1[3]; char  ExtractedCodes2[3][5]; int main() {     strcpy(PhoneNumber1,PhoneNumber);     PhoneNumber1[3]=0;     PhoneNumber1[8]=0;     ExtractedCodes1[0]=&PhoneNumber1[0];     ExtractedCodes1[1]=&PhoneNumber1[4];     ExtractedCodes1[2]=&PhoneNumber1[9];     printf("[%s] [%s] [%s]\n",ExtractedCodes1[0],ExtractedCodes1[1],ExtractedCodes1[2]);      sprintf(ExtractedCodes2[0],"%.3s",PhoneNumber);     sprintf(ExtractedCodes2[1],"%.4s",PhoneNumber+4);     sprintf(ExtractedCodes2[2],"%.4s",PhoneNumber+9);     printf("[%s] [%s] [%s]\n",ExtractedCodes2[0],ExtractedCodes2[1],ExtractedCodes2[2]);     return 0; } //[187] [9999] [9988] //[187] [9999] [9988] //

user: user-2
content: PhoneNum[m]只是char类型  再另外ExtractedCodes这个数组只有1个元素，你sprintf那句访问已经越界了  可以自己单步调试运行看

user: user-3
content: 看了你的代码，我想说的是，哥们儿，基础还须多花点时间，感觉一两句话真解释不清。  char** ExtractCodesFromPhoneNumber(char *PhoneNum, char length, char separate) {     int i_seperate[] = {0};     int SeperateCnt = 0;       char* ExtractedCodes[] = {0};            // 这样声明，声明ExtractedCodes数组有char*元素个数为1噢，要存放3个字符指针明显不够；该指针也没有指向任何可写内存空间，后面的sprintf当然会报错。     for(int i = 0; i < length; ++i)     {         if(PhoneNum[i] == '-')         {             ++SeperateCnt;             i_seperate[SeperateCnt] = i;    //              for(int m = i_seperate[SeperateCnt - 1]; m < i_seperate[SeperateCnt]; ++i) // 0、1、2             {                 sprintf(ExtractedCodes[SeperateCnt], "%d", PhoneNum[m]);     //这里还是先弄清char和int之间的区别吧             }         }     } //    char* ExtractedCodes[] = {"187", "9999", "9988"};     char** p = ExtractedCodes;    //此处p也指向函数内部临时变量噢，函数结束后，p就成野指针了。。。调用者再使用它可能会访问违规的说       return p; }

user: user-0
content: 谢谢版主回复，我这个sprintf生成的是字符串， 我希望通过这句话由原来的char PhoneNumber[14] = "187-9999-9988";得到char* ExtractedCodes[] = {"187", "9999", "9988"}; 应该用%s,可是也不行。 指针使用有错吗？

user: user-0
content: 谢谢版主回复，我这个sprintf生成的是字符串， 我希望通过这句话由原来的char PhoneNumber[14] = "187-9999-9988";得到char* ExtractedCodes[] = {"187", "9999", "9988"}; 应该用%s,可是也不行。 指针使用有错吗？

user: user-2
content: %d是整型，你提供的确不是一个整型变量

user: user-0
content: 顶一下。。。。。。
user-0 提问: 还是C语言基础问题，别嫌烦，我觉得我的基本功根本就不扎实。

回复:
user: user-1
content: printf returned 1是指printf输出了一个字符，然后printf函数返回了这个值.      int x = 500;     printf("%d\n", printf("abcdef%d\n", x));  打印结果为10，abcdef500再加一个换行符，一共10个字符。 函数返回值是一个自定义的量，并不一定是0就指成功，非0就是失败。 对于0是成功，非0是失败是一种编程习惯，因为非零值有很多，如果函数某一步出错，就可以返回一个非零值代表这种出错结果。 例如  char c; if(c == 'a')     return 0; if(c == 'b')     return 1; if(c == 'c')     return 2;

user: user-2
content: 同样，scanf()如果成功了，也返回1，只不过一般我们都没有去使用这个返回值。

user: user-3
content: printf 返回自己打印的字符数。  main 一般返回 0 表示正常结束，非零表示异常结束。不过这个要你自己写在你的程序文档里的。没有强制规定。

user: user-4
content: printf是一个函数，它成功打印后返回1，不信楼主把%d改成%s再看看printf返回值是什么
user-0 提问: 函数调用问题-参数

回复:
user: user-1
content: 好奇地问一下，你这个函数名里的是 mms  是制造报文规约吗？ 是不是IEC-61850里的东西？ 电力自动化方面的动态链接库？

user: user-0
content: 非常感谢二位，主要我是调用动态链接库，可能是调用是出问题了，还以为是未初始化导致的段错误。

user: user-1
content: 引用 1 楼 user-2 的回复: 	char* server = "xxx"; 	char (*domain)[MAX_NAME_LEN]; 	int num = 3; 	mms_fetch_domain_name_list(server, &domain, &num);   我的理解： 1、第二个和第三个参数都是输出参数，所以不需要初始化。如果一定要赋初值，直接为NULL或0就可以了。 2、这个函数的功能，就是要取得一组domain_name。一个domain_name用一个指向一个字符数组的指针表示，也就是 char (*p)[MAX_NAME_LEN]。一组domain_name就是由一组这样的指针表示。这组指针在函数中又组成了一个数组。 但是从参数上看不出来。因为只要第一个指针就够了，你可以通过依次找下一个指针来找到所有的指针。所以， char (*domain)[MAX_NAME_LEN]这样的定义是正确的。执行完函数之后，domain就已经是第一个指针了。但是还有一个问题，就是你要找多少个下一个指针才算完？这就是第三个参数的作用了。它表示指针的个数。 总之，第二个参数和第三个参数都是输出参数。

user: user-2
content: char* server = "xxx"; 	char (*domain)[MAX_NAME_LEN]; 	int num = 3; 	mms_fetch_domain_name_list(server, &domain, &num);
user-0 提问: 关于double和float打印问题，求大神啊

回复:
user: user-1
content: 参考float.h: ... #define DBL_DIG         15                      /* # of decimal digits of precision */ #define DBL_EPSILON     2.2204460492503131e-016 /* smallest such that 1.0+DBL_EPSILON != 1.0 */ #define DBL_MANT_DIG    53                      /* # of bits in mantissa */ #define DBL_MAX         1.7976931348623158e+308 /* max value */ #define DBL_MAX_10_EXP  308                     /* max decimal exponent */ #define DBL_MAX_EXP     1024                    /* max binary exponent */ #define DBL_MIN         2.2250738585072014e-308 /* min positive value */ #define DBL_MIN_10_EXP  (-307)                  /* min decimal exponent */ #define DBL_MIN_EXP     (-1021)                 /* min binary exponent */ #define _DBL_RADIX      2                       /* exponent radix */ #define _DBL_ROUNDS     1                       /* addition rounding: near */  #define FLT_DIG         6                       /* # of decimal digits of precision */ #define FLT_EPSILON     1.192092896e-07F        /* smallest such that 1.0+FLT_EPSILON != 1.0 */ #define FLT_GUARD       0 #define FLT_MANT_DIG    24                      /* # of bits in mantissa */ #define FLT_MAX         3.402823466e+38F        /* max value */ #define FLT_MAX_10_EXP  38                      /* max decimal exponent */ #define FLT_MAX_EXP     128                     /* max binary exponent */ #define FLT_MIN         1.175494351e-38F        /* min positive value */ #define FLT_MIN_10_EXP  (-37)                   /* min decimal exponent */ #define FLT_MIN_EXP     (-125)                  /* min binary exponent */ #define FLT_NORMALIZE   0 #define FLT_RADIX       2                       /* exponent radix */ #define FLT_ROUNDS      1                       /* addition rounding: near */ ... 浮点数格式 http://bbs.csdn.net/topics/390676437

user: user-1
content: 楼主为什么不 double a = 555.1234567890123456123456789012345612345678901234561234567890123456; float b = 555.1234567890123456123456789012345612345678901234561234567890123456f; 呢？

user: user-0
content: 原因出在，浮点型数据存储的时候，取转换成1.x的小数点后22位进行存储，再转换过来的时候数据就发生改变了，谢谢大家的回复！

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

user: user-1
content: #define DBL_DIG         15                      /* # of decimal digits of precision */

user: user-1
content: 楼主为什么不   printf("%.888f %.16666lf  \n",b,a); 呢？

user: user-0
content: Input a float point number:555.1234567890 f=555.123474 hex=44 0A C7 E7 bin= 1000100000010101100011111100111 bin=  10001000   00010101100011111100111     - 136 -127 0.00010101100011111100111     - 9        0.00010101100011111100111

user: user-1
content: #define FLT_DIG         6                       /* # of decimal digits of precision */

user: user-2
content: float最多能用7位有效数字  http://blog.csdn.net/dxy612/article/details/5518477

user: user-0
content: 而且后边的小数部分为什么会打印出错，好像不是随机出现的，是不是数据存储的时候进行覆盖了

user: user-0
content: 还是没有搞懂，你给的例子只不过是吧浮点型的数据进行拆分，555是超出了float整数部分的，但是超出的部分是怎么存储的。
user-0 提问: c 字符替换问题把表达式如： 1+-*/2  过滤成 1+2

回复:
user: user-1
content: 参考《编译原理》中的词法分析和有限状态自动机。  再供参考：//有字符串 //1_22_333,,4444__55555,_666666 //需要解析为 //1 //22 //333 //_ //4444 //55555 //666666 #include <stdio.h> char s[]="1_22_333,,4444__55555,_666666"; char c,*p,*p1; int st; void main() {     st=0;     p=s;     while (1) {         c=*p;         if (0==c) {             switch (st) {             case 1:printf("_\n");    break;             case 2:printf("%s\n",p1);break;             }             break;//         }         switch (st) {         case 0:                  if ('_'==c) {                            st=0;}             else if (','==c) {                            st=1;}             else             {p1=p;                       st=2;}         break;         case 1:                  if ('_'==c) {                            st=1;}             else if (','==c) {printf("_\n");              st=1;}             else             {p1=p;                       st=2;}         break;         case 2:                  if ('_'==c) {*p=0;printf("%s\n",p1);*p=c;st=0;}             else if (','==c) {*p=0;printf("%s\n",p1);*p=c;st=1;}             else             {                            st=2;}         break;         }         p++;     } } //1 //22 //333 //_ //4444 //55555 //666666

user: user-0
content: 感谢大家 ！手机不太好打字 不知道是我手机太次 还是csdn的app有问题页面闪烁的厉害

user: user-2
content: 不知道楼主的真是意思是什么，仅仅只是过滤掉第二个*-+/符号么？  #include <stdlib.h> #include <stdio.h>  int main() {     int lim = 10;     char s[20];     int c,i,last,b = 0;     last = 'a';     for(i = 0; i < lim-1 && (c=getchar()) != EOF && c!='\n'; )     {         if(isspace(c))             continue;         if(b == 0 && (c == '+' || c== '-' || c == '*' || c == '/'))         {             b = 1;             s[i ++] = c;         }         if(isdigit(c))         {             s[i ++] = c;         }         last = c;     }     s[i] ='\0';     printf("%s\n", s);     return i; }  [root@cobe ~]# ./trstc  2+-*/3 2+3 [root@cobe ~]# ./trstc  33+*2345 33+2345 [root@cobe ~]# ./trstc  33 +- * / 2323 33+2323

user: user-3
content: 想了下，算法可以这么写，遇到加减乘除任一一个时，记录它并忽略后面所有的字符，直到数字的出现

user: user-3
content: 把你的代码，我增加了一段试运行后，与你的结果不一致，我这边输入1+-*/2，输出还是为1+-*/2的，  不知道我这边增加的代码是否有问题？  建议你换一个算法看看，  我这边的运行结果   我运行时的代码如下：  #include <stdio.h> int main() { 	int getline(char s[],int lim); 	char s[10]; 	int lim=10; 	 	getline(s,lim); 	 	printf("%s",s);	 }  int getline(char s[],int lim) {     int c,i,last,b;     last = 'a';     for(i = 0; i < lim-1 && (c=getchar()) != EOF && c!='\n'; )     {                 if(isspace(c))             continue;         if((isdigit(c) || c !='.' || last !='.' ) )            if( c != '+' || last != '+')             if(c != '-' || last != '-')               if(c != '*' || last != '*')                 if(c != '/' || last != '/')                      s[i++] = c;         last = c;     }     s[i] ='\0';     return i; }
user-0 提问: 根据有序链表生成huffman树，为什遍历不出来啦，新人帮看看代码如下

回复:
user: user-1
content: 引用 3 楼 yuhuangkong818 的回复:[quote=引用 1 楼 anshiny的回复:]creathuffman函数从逻辑上讲是错的。 why给点建议啊～～～卡这蛮久[/quote] #include<stdio.h> #include<stdlib.h>  typedef struct data { 	int  weight;//权重  	char ch; //字符  	struct data *lchild, *rchild, *next; } dlink; typedef dlink *linkdata;  linkdata creat() {//输入字符权重  	linkdata head = NULL, s; 	int x; 	char str; 	printf("请输入权重与字符以 0,0结尾  权重在前字符在后 例如:11,a\n"); 	scanf("%d,%c", &x, &str); 	while(x != 0 && str != '0') { 		s = (linkdata)malloc(sizeof(dlink)); 		s->lchild = s->rchild = s->next = NULL; 		s->weight = x; 		s->ch = str; 		if(head) { 			s->next = head; 		} 		head = s; 		scanf("%d,%c", &x, &str);    }    return head;	 }   void print(linkdata head) {//打印 	linkdata p = head; 	int i = 0; 	while(p) { 		printf("%4c---%d", p->ch, p->weight); 		p = p->next; 		i++; 		if(i % 5 == 0) 			printf("\n"); 	} 	printf("\n"); 	return; }  void  sort(linkdata head) { 	linkdata p, q, k; 	dlink t; 	for(p=head; p!=NULL; p=p->next) { 		k = p; 		for(q=k->next; q!=NULL; q=q->next) { 			if(q->weight < k->weight) { 				k = q; 			} 		} 		if(k != p) { 			t.weight = p->weight; 			t.ch = p->ch; 			t.lchild = p->lchild; 			t.rchild = p->rchild;  			p->weight = k->weight; 			p->ch = k->ch; 			p->lchild = k->lchild; 			p->rchild = k->rchild;  			k->weight = t.weight; 			k->ch = t.ch; 			k->lchild = t.lchild; 			k->rchild = t.rchild; 		} 	} }   linkdata insert(linkdata root, linkdata s) { 	linkdata p1, p2; 	if(root == NULL) { 		root = s; 		return root; 	}    	p1 = NULL;    	p2 = root;    	while(p2 && p2->weight<s->weight) {    		p1 = p2;    		p2 = p2->next;    	}    	s->next = p2;    	if(p1 == NULL) { 		root = s; 	} else { 		p1->next = s; 	} 	return root; }  linkdata del(linkdata root, linkdata s) { 	linkdata p1, p2; 	if(root == NULL) { 		return NULL; 	}    	p1 = NULL;    	p2 = root;    	while(p2 && p2!=s) {    		p1 = p2;    		p2 = p2->next;    	} 	if(p2 == NULL) return root;    	if(p1 == NULL) { 		root = s->next; 		return root; 	} 	p1->next = p2->next; 	return root; }   linkdata creathuffman(linkdata root) { 	linkdata s, r1, r2; 	sort(root); 	while(root && root->next) { 		r1 = root; 		r2 = root->next; 		s = (linkdata)malloc(sizeof(dlink)); 		s->next = NULL; 		s->weight = r1->weight + r2->weight; 		s->ch = '#', 		s->lchild = r1; 		s->rchild = r2;		 		root = del(root, r2); 		root = del(root, r1); 		root = insert(root, s); 		r1->next = r2->next = NULL; 	} 	return root; }  void preorder(linkdata t) { 	if(t) { 		printf("(%c)%d ", t->ch, t->weight); 		preorder(t->lchild); 		preorder(t->rchild); 	} }

user: user-2
content: https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=0&rsv_idx=1&tn=baidu&wd=根据有序链表生成huffman树

user: user-0
content: 引用 2 楼 user-3的回复:为什么看起来creathuffman应该是编译不过的 给点意见呗～～～～～

user: user-0
content: 引用 1 楼 anshiny的回复:creathuffman函数从逻辑上讲是错的。 why给点建议啊～～～卡这蛮久

user: user-3
content: 为什么看起来creathuffman应该是编译不过的

user: user-1
content: creathuffman函数从逻辑上讲是错的。
user-0 提问: acm水题

回复:
user: user-0
content: 谢谢大家，我今天又试了下没有return 0；也a了，可能那天杭电bug

user: user-0
content: 引用 1 楼 user-3 的回复:真的是return 0的问题吗？  输入是a=0结束？ 是的，没有这句a不了，加了就能a

user: user-0
content: 引用 2 楼 u010165006 的回复:int main() 需要返回一个int值，main()也是函数。 其他题不要return 0；也能ac，这题不行。我也不知道为什么

user: user-1
content: int main（）{ } 中的int指函数的类型，也就是这个函数结束之后会返回一个什么样的值。

user: user-2
content: int main() 需要返回一个int值，main()也是函数。

user: user-3
content: 真的是return 0的问题吗？  输入是a=0结束？
user-0 提问: C语言三维数组，我直接给出三个下标居然不能输出？

回复:
user: user-1
content: 引用 4 楼 qq_33447655 的回复:[quote=引用 3 楼 paschen 的回复:] A[0][0][3] 类型是int， 不是int*  你需要在前面加上&取地址后则是int* 或者A[i][j] 这种形式也是int* 版主，我最后一部分的理解对不？ 我觉得我一段程序，一个函数。我不能只是知道他的语法我想要的是理解！而不是知其然不知其所以然！否则这等于没学！[/quote]  T* a 加1移动的是sizeof(T) T** a加1移动的是sizeof(T*) T[x][y] 加1移动的是sizeof(T[x]) 以此类推

user: user-0
content: 引用 3 楼 paschen 的回复:A[0][0][3] 类型是int， 不是int*  你需要在前面加上&取地址后则是int* 或者A[i][j] 这种形式也是int* 版主，我最后一部分的理解对不？ 我觉得我一段程序，一个函数。我不能只是知道他的语法我想要的是理解！而不是知其然不知其所以然！否则这等于没学！

user: user-2
content: 数组你可以理解为一个指针： 例如int a[2][3]，这时a就是一个指针。 而当你使用a[1][2]时，这就已经相当于将指针指向了这个数据。就已经是一个int了。这时你要把a[1][2]赋值给int *p当然就要取地址。  当你定义三维数组int a[2][3][4]，最终把int *pa = a[1][2];是正确的原理跟上面一样，a[1][2]还未指定到某一个数字，因此它是指针，可以进行赋值操作。  对于pa ++，是相当于将指针移动四个字节的位置。

user: user-1
content: A[0][0][3] 类型是int， 不是int*  你需要在前面加上&取地址后则是int* 或者A[i][j] 这种形式也是int*

user: user-3
content: 同意楼上的……

user: user-4
content: int *pa=&A[0][0][3];
user-0 提问: 我想用循环去做，但是完全没有思路昂

回复:
user: user-1
content: 看看啦。。。。

user: user-2
content: 同一天是指同一个星期几吗? 如果是应该找7的倍数

user: user-3
content: #include <stdlib.h> #include <stdio.h>  int m[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};  int week(int year, int month, int day) {     int i = 0;     int w = (year + (year - 1)/4 - (year - 1)/100 + (year - 1)/400)%7;     for(i = 1; i < month; i ++){         if(i == 2 && ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0))         {             day ++;         }         day += m[i];     }     w = (w += (day % 7 - 1))%7;     return w; }  int main() {     int year = 0;     int month = 0;     int day = 0;     int i = 0, j = 0;     int w = 0;     int is_r = 0;     printf("输入生日，年月日空格分隔\n");     scanf("%d", &year);     scanf("%d", &month);     scanf("%d", &day);     is_r = year;      w = week(year, month, day);      printf("%d-%d-%d 星期:%d\n", year, month, day, w);     while(1)     {         if(w == week(++year, month, day))         {             printf("最近的相同年为:%d,相差:%d\n",year, year - is_r);             break;         }     } }

user: user-4
content: 阳历比较好算，注意下闰年就可以了。阴历还分大进和小进（有没有30那天） 逻辑理清楚了，实现就很简单了

user: user-5
content: 仅供参考：#include <afxdisp.h> #include <stdio.h> #include <stdlib.h> int main(int argc, TCHAR* argv[]) {     COleDateTime t;     COleDateTimeSpan ts;     CString s,fmt;     int nYear;     int nMonth;     int nDay;     int nHour;     int nMin;     int nSec;     int lDays;     int nHours;     int nMins;     int nSecs;     int i,N;     // initialize MFC and print and error on failure     if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)) {         printf("Fatal Error: MFC initialization failed\n");         return 1;     }     if (argc<13) {         printf("Usage:%s sYYYY sMM sDD shh smm sss pDD phh pmm pss n {SQL|YYYY|YY}\n",argv[0]);         return 2;     }     if (stricmp(argv[12],"SQL")==0) fmt="%Y-%m-%d %H:%M:%S";     else if (stricmp(argv[12],"YYYY")==0) fmt="%Y%m%d %H%M%S";     else if (stricmp(argv[12],"YY")==0) fmt="%y%m%d %H%M%S";     else {         printf("Usage:%s sYYYY sMM sDD shh smm sss pDD phh pmm pss n {SQL|YYYY|YY}\n",argv[0]);         return 3;     }     nYear =atoi(argv[ 1]);     nMonth=atoi(argv[ 2]);     nDay  =atoi(argv[ 3]);     nHour =atoi(argv[ 4]);     nMin  =atoi(argv[ 5]);     nSec  =atoi(argv[ 6]);     lDays =atoi(argv[ 7]);     nHours=atoi(argv[ 8]);     nMins =atoi(argv[ 9]);     nSecs =atoi(argv[10]);     N     =atoi(argv[11]);     if (N<=0) {         printf("Usage:%s sYYYY sMM sDD shh smm sss pDD phh pmm pss n {SQL|YYYY|YY}\n",argv[0]);         return 4;     }     t=COleDateTime( nYear, nMonth, nDay, nHour, nMin, nSec);     ts=COleDateTimeSpan( lDays, nHours, nMins, nSecs );     for (i=1;i<=N;i++) {         s=t.Format(fmt);         printf("%08d %s\n",i,s);         t=t+ts;     }     return 0; }
user-0 提问: 不需要返回值可以用void，可是这个明明需要返回值啊？？

回复:
user: user-1
content: 局部变量内存已经释放了，给分吧

user: user-2
content: 那就结贴吧

user: user-3

user: user-0
content: 我懂了
user-0 提问: 用vs2013，做C程序出现的问题，bool”类型的实参与“const char*”类型的形参不兼容

回复:
user: user-1
content: 括号问题，你代码先比较str[j]>0 得到的bool值才作为参数  改成：  if(strcmp(str[k],str[j])>0)k=j;

user: user-2
content: if( strcmp( str[k], str[j] ) > 0 ) k=j; 看清楚括号配对
user-0 提问: 开机自动启动

回复:
user: user-1
content: 在C:\AUTOEXEC.BAT里面加一句： start /D "你的exe文件所在目录" "你的exe文件文件名.exe"

user: user-2
content: 编译于VS2013，其他编译器未测试：  #define STRICT #include <windows.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <objbase.h> #include <shlobj.h> static HRESULT CreateShortCut() { 	HRESULT       hRes;                  /* Returned COM result code */ 	IShellLink*   pShellLink = NULL;            /* IShellLink object pointer */ 	IPersistFile* pPersistFile = NULL;          /* IPersistFile object pointer */ 	WCHAR          wszLinkfile[MAX_PATH]; /* pszLinkfile as Unicode string */ 	int           iWideCharsWritten;     /* Number of wide characters written */ 		hRes = ::CoInitialize(NULL); 		if (hRes != S_OK) 		{ 			printf("初始化COM库失败"); 		} 		hRes = CoCreateInstance(CLSID_ShellLink,     /* pre-defined CLSID of the IShellLink object */ 			NULL,                 /* pointer to parent interface if part of aggregate */ 			CLSCTX_INPROC_SERVER, /* caller and called code are in same process */ 			IID_IShellLink,      /* pre-defined interface of the IShellLink object */ 			(void**)&pShellLink);         /* Returns a pointer to the IShellLink object */ 		if (hRes != S_OK) 		{ 			printf("创建IShellLink实例失败"); 		} 		else 		{ 			hRes = pShellLink->QueryInterface(IID_IPersistFile, (void**) & pPersistFile); 			if (hRes != S_OK) 			{ 				printf("获取IPersistFile接口失败"); 			} 			else 			{ 				//设置快捷方式中的程序路径 				pShellLink->SetPath(L"D:\\Program Files (x86)\\Beyond Compare 3.3.5.15075 Portable.exe"); 				pShellLink->SetWorkingDirectory(L"C:\\"); 				//确保快捷方式路径由ANSI字符串组成 				MultiByteToWideChar( 					CP_ACP, 					0, 					"C:\\Users\\admin\\Desktop\\xcode.lnk", 					-1, 					wszLinkfile, 					MAX_PATH); 				//保存快捷方式 				pPersistFile->Save(wszLinkfile, TRUE); 			} 		} 		pPersistFile->Release(); 		pShellLink->Release(); 		::CoUninitialize(); 	return (hRes); }  int main(int n, char **argv) { 	HRESULT   hRes;                      /* result of calling COM functions */ 	hRes = CoInitialize(NULL); 	if (SUCCEEDED(hRes)) 	{ 		hRes = CreateShortCut();   /* Index of icon in the file */ 	} 	/* call CoUninitialize() and exit the program. */ 	CoUninitialize(); 	return 0; }

user: user-0
content: 那有没有代码可以实现喃

user: user-2
content: 目测楼主是指Windows下开机启动， 其实Windows下可以通过修改注册表的方式添加开机自动启。 还有一个方式就是在Windows自带的启动文件夹下，添加link文件。 就是这个文件夹C:\Users\admin\AppData\Roaming\Microsoft\Windows\Start Menu\Programs下 添加快捷方式，这个可以搜索“c 快捷方式”

user: user-3
content: 可以在开机启动的ini文件中加入要运行的程序

user: user-1
content: 得先把杀毒软件关掉。

user: user-4
content: windows一般都是通过修改注册表，linux不知道...

user: user-5
content: 可以写到注册表相关位置  http://blog.csdn.net/wchoclate/article/details/17390733

user: user-6
content: 写到注册表里，  或者做成一个服务
user-0 提问: 【求助】关于Fibonacci数列

回复:
user: user-1
content: 1s内运行完毕思路：费波纳茨数列除10007后的余数也满足费波纳茨数列的特点，这样就可以满足题目要求，并且可计算范围远超题目要求！！！！（要源代码可以找我）

user: user-2
content: 我觉得这里对10007求余的好处仅是为了能将结果保存到数组中. 因为Fn很快会比int大，导致溢出，结果错误。 ans[i]=(ans[i-1]+ans[i-2])%mod; 而且每次循环求余不会对影响结果。

user: user-0
content: 我自己的程序，样例输入为10时结果正确，样例输入为22时就错误。谁知道原因是什么：#include<stdio.h> int main() { 	int n,i,s; 	scanf("%d",&n); 	int a[n]; 	a[0]=a[1]=a[2]=1; 	for(i=3;i<=n;i++) 	{ 		a[i]=a[i-1]+a[i-2]; 	} 	 s=a[n]%1007; 	 printf("%d",s); 	return 0; }

user: user-0
content: 参考答案。为什么要“ ans[i]=(ans[i-1]+ans[i-2])%mod;”：#include<cstdio> const int mod=10007; const int MAXN=1000000+10; int ans[MAXN]; int main() {     ans[1]=ans[2]=1;     int n;     scanf("%d",&n);     for(int i=3;i<=n;i++)         ans[i]=(ans[i-1]+ans[i-2])%mod;     printf("%d\n",ans[n]);     return 0; }

user: user-3
content: 参考@user-4 的思想，  试着编写着代码发现1,000,000范围内的运行在3秒内运行完成（包括手动输入n值的时间）  试着输入16位的数字，运行时间为36s，自己觉得此方法不错，  #include <stdio.h> int main() { 	//Fn=Fn-1+Fn-2 ==> Rn=Rn-1+Rn+2    	unsigned long mod=10007; 	int n; 	int Rn1=1; 	int Rn2=1; 	int Ans,i,tmp;  	printf("input n:\n"); 	scanf("%d",&n);  	for(i=0;i<n;i++) 	{ 		if(i==0) 			Ans=Rn1; 		else if(i==1) 			Ans=Rn2; 		else if(i==2) 			Ans=Rn1+Rn2; 		else 		{ 			tmp=Rn1; 			Rn1=Ans%mod; 			Rn2=tmp%mod; 			Ans=(Rn1+Rn2)%mod; 		} 	}  	printf("input n is:%d\n",n); 	printf("remainder is:%d\n",Ans); 	 	return 0; }

user: user-4
content: 因为有 (a + b) % c == (a % c + b % c) % c 所以，每次加法运算后取模与最终取模等价，但是有不溢出的好处
user-0 提问: 顺序表里面'ListInsert_Sq' : cannot convert parameter 3 from 'int' to 'int *'

回复:
user: user-0
content: 引用 7 楼 yjxkyjxk 的回复:把完整的代码贴上来，我们试着调试看看? 找到错误的根源了，我太马虎了。 最开始函数声明的时候，第三个参数写成指针了，实现的时候却用的是变量，然后就各种报错过不去---

user: user-1
content: 把完整的代码贴上来，我们试着调试看看?

user: user-0
content: 引用 5 楼 user-2 的回复:查一查下面的xxx是什么 typedef xxx ElemType;  typedef int Status; typedef int ElemType; typedef struct SqList{ 	ElemType *elem; 	int length; 	int listsize; }SqList;

user: user-2
content: 查一查下面的xxx是什么 typedef xxx ElemType;

user: user-0
content: 引用 3 楼 yjxkyjxk 的回复:[quote=引用 2 楼 qq_17049875 的回复:] typedef int Status; 预定义的Status语句是这个  不太清楚编译器是否自己会对深层次的数据类型进行检查，不过看报错信息，目测不会。  从规避我们不了解的深层次的部分、还是维护代码的可读性，建议还是在第一层传入参数时，其数据类型与函数定义时一致。[/quote] int i; 	ElemType t = 0; 	for(i = 0;i < 5;i++) 	{ 		ListInsert_Sq(&L, i , t); 		t ++; 	} 依然还是刚才的错误！cannot convert parameter 3 from 'int' to 'int *'

user: user-1
content: 引用 2 楼 qq_17049875 的回复:typedef int Status; 预定义的Status语句是这个  不太清楚编译器是否自己会对深层次的数据类型进行检查，不过看报错信息，目测不会。  从规避我们不了解的深层次的部分、还是维护代码的可读性，建议还是在第一层传入参数时，其数据类型与函数定义时一致。

user: user-0
content: typedef int Status; 预定义的Status语句是这个

user: user-1
content: 调用 ListInsert_Sq(&L, i , i);时，其函数定义为  Status ListInsert_Sq(SqList *L,int i ,ElemType e)  而i的定义在代码中为 int ,  与原函数定义 ElemType 不一致
user-0 提问: 求助Winsock和多线程的问题

回复:
user: user-1
content: 表达的不清楚！！！  什么时候判断html网页传输完毕，  http服务器响应客户端： http/1.1 200 OK\r\n Content-Length:   感觉长度判断，满意不
user-0 提问: c语言的问题 其运行结果我看不懂

回复:
user: user-1
content: 引用 4 楼 qq_33869330 的回复:其中“a%cb%c\tc%c\tabc\n”是什么来的， 我见过%d\n和%f的  没见过这样的a%cb%c\tc%c\tabc\n  能说说  大神们    我把你的代码大概这样子隔开看得比较清楚，具体的我也不是很知道，因为我也是刚学，大概就是ASCII码一些字符之间的转换。每一个对应一个字母的输出这样子。。不是很懂 例如第一条输出是输出c1 c2 c3，就是分别对应的，你看图片。

user: user-2
content: %c 是对应一个char型。%d 是对应一个int型。%f 是对应一个float型。%s 是对应一个char *型。 \t \n 等为转义字符。 详细内容可以baidu c 转义字符 格式化符

user: user-0
content: 其中“a%cb%c\tc%c\tabc\n”是什么来的， 我见过%d\n和%f的  没见过这样的a%cb%c\tc%c\tabc\n  能说说  大神们

user: user-3
content: 引用 2 楼 qq_33869330 的回复:结果上面的aabb  cc  abc   B a什么的是什么来的  与代码有什么关系？ 你对应的看这条输出语句：  printf("a%cb%c\tc%c\tabc\n",c1,c2,c3);

user: user-0
content: 结果上面的aabb  cc  abc   B a什么的是什么来的  与代码有什么关系？

user: user-3
content: 都是一些ASCII码与字符的对应转换，没什么难的。
user-0 提问: 请各位帮我看看这段C源码那里不对。

回复:
user: user-1
content: #include<stdio.h> #include<math.h> int main() {   void max(int a,int b,int c);     void min(int a,int b,int c);     void f();    double a4;    int a1,a2,a3;    scanf("%d%d%d",&a1,&a2,&a3);    a4=a2*a2-4*a1*a3;     if(a4>0) 	{      max(a1,a2,a3); 	}      else if(a4==0) 	{      min(a1,a2,a3); 	}     else     f();     return 0; } void max(int a,int b,int c)  {     int i,j,x1,x2;     i=(-b)/2*a;     j=sqrt(b*b-4*a*c);     x1=i+j;x2=i-j;     printf("%d %d\n",x1,x2);  } void min(int a,int b,int c) {    int i;    i=(-b)/2*a;    printf("%d\n",i);  } void f() { printf("无解\n");  }

user: user-0
content: 好的，谢谢，成功解决问题。

user: user-0
content: 引用 1 楼 zhangxiangDavaid 的回复:至少需要修改成这样：  #include<stdio.h> #include<stdio.h> #include<math.h> //函数名如果不能见名知义，但也不能让人产生误解 int compute1(int a, int b, int c); int compute2(int a, int b, int c); void f(); int main() { 	double a4; 	int a1, a2, a3; 	scanf("%d%d%d", &a1, &a2, &a3); 	a4 = a2*a2 - 4 * a1*a3; 	if (a4>0) 	{ 		max(a1, a2, a3); 	} 	else if (a4 == 0)  	{ 		min(a1, a2, a3); 	} 	else 		f(); 	return 0; } int compute1(int a, int b, int c) { 	int i, j, x1, x2; 	i = (-b) / 2 * a; 	j = sqrt(b*b - 4 * a*c); 	x1 = i + j; x2 = i - j; 	printf("%d %d\n", x1, x2);  } int compute2(int a, int b, int c) { 	int i; 	i = (-b) / 2 * a; 	printf("%d\n", i); } void f() { 	printf("无解\n"); }   大大，我在请问下，我刚才我在试了下你的代码，可是还是有错误，请问是什么原因呢？你可以试试你的电脑？

user: user-0
content: 引用 1 楼 zhangxiangDavaid 的回复:至少需要修改成这样：  #include<stdio.h> #include<stdio.h> #include<math.h> //函数名如果不能见名知义，但也不能让人产生误解 int compute1(int a, int b, int c); int compute2(int a, int b, int c); void f(); int main() { 	double a4; 	int a1, a2, a3; 	scanf("%d%d%d", &a1, &a2, &a3); 	a4 = a2*a2 - 4 * a1*a3; 	if (a4>0) 	{ 		max(a1, a2, a3); 	} 	else if (a4 == 0)  	{ 		min(a1, a2, a3); 	} 	else 		f(); 	return 0; } int compute1(int a, int b, int c) { 	int i, j, x1, x2; 	i = (-b) / 2 * a; 	j = sqrt(b*b - 4 * a*c); 	x1 = i + j; x2 = i - j; 	printf("%d %d\n", x1, x2);  } int compute2(int a, int b, int c) { 	int i; 	i = (-b) / 2 * a; 	printf("%d\n", i); } void f() { 	printf("无解\n"); }   好的，谢谢。

user: user-2
content: 至少需要修改成这样：  #include<stdio.h> #include<stdio.h> #include<math.h> //函数名如果不能见名知义，但也不能让人产生误解 int compute1(int a, int b, int c); int compute2(int a, int b, int c); void f(); int main() { 	double a4; 	int a1, a2, a3; 	scanf("%d%d%d", &a1, &a2, &a3); 	a4 = a2*a2 - 4 * a1*a3; 	if (a4>0) 	{ 		max(a1, a2, a3); 	} 	else if (a4 == 0)  	{ 		min(a1, a2, a3); 	} 	else 		f(); 	return 0; } int compute1(int a, int b, int c) { 	int i, j, x1, x2; 	i = (-b) / 2 * a; 	j = sqrt(b*b - 4 * a*c); 	x1 = i + j; x2 = i - j; 	printf("%d %d\n", x1, x2);  } int compute2(int a, int b, int c) { 	int i; 	i = (-b) / 2 * a; 	printf("%d\n", i); } void f() { 	printf("无解\n"); }
user-0 提问: 为什么普通数组传到函数里面sizeof返回就不正确了

回复:
user: user-1
content: C/C++ 里的根本没办法把数组类型作为参数传入函数，传到函数内的已经退化成了指针，sizeof得到的是指针的大小

user: user-1
content: 另外字符数组应该也一样，如果是字符串可以用strlen得到大小，其他数组你需要自己把数组大小传入函数内

user: user-2
content: 形式参数是变量 传进来后，数组名作为一个地址，赋值给了一个指针变量，sizeof的结果是指针的大小 字符串数组，是字符串，还是指针数组？如果是字符串，sizeof结果也是指针，strlen才是长度；如果是指针数组，仍然得到指针大小