Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 关于排序的一个小问题，求指导

回复:
user: user-1
content: 只考虑基于比较的排序，不限制比较排序的方法，关于5个数排序的最少比较次数应该是7次，这个在 D.E.Knuth 的著作 《计算机程序设计艺术》  第三卷(排序和查找) 的<5.3.1 极少比较排序>中可以找到详细的解释。

user: user-2
content: 找一个排序算法，对于最多比较几次，最少比较几次。这个跟排序的时间复杂度有关的，时间复杂度约低的比较次数应该越小，相反越多。 对于最多和最少，5个数据记录，那么若是从大到校排序，原数据本身是从小到大的顺序，时间复杂度是最大的，相反应该是最小的吧（比如冒泡排序，选择排序）

user: user-2
content: ”则至少需要比较——次，至多需要比较——次“ 你这句话是需求呢，还是问题？

user: user-0
content: 第一次发帖，真的没有人回一下吗？
user-0 提问: 头文件不存在

回复:
user: user-1
content: 也许是没放在同一目录下吧。

user: user-2
content: 引用 6 楼 yechuan710 的回复:[quote=引用 5 楼 shihengzhen101 的回复:] [quote=引用 3 楼 yechuan710 的回复:] 我用的是vc，那些解决问题的都是vs 这和环境没什么关系，你还是在工程下或者整个电脑中搜索一下到底有没有这个文件，如果有的话调整一下目录，如果没有那肯定会报错了，找找是不是少安装什么东西了，或者工程缺失了部分文件[/quote] 找不到，这个好像不是头文件，怎么找[/quote] http://blog.csdn.net/anobodykey/article/details/34126291 这个里边有解释，仔细看一下，文章中搜索winapifamily.h

user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:[quote=引用 3 楼 yechuan710 的回复:] 我用的是vc，那些解决问题的都是vs vc不是vs的一部分吗？[/quote] 没用过vs

user: user-0
content: 引用 5 楼 shihengzhen101 的回复:[quote=引用 3 楼 yechuan710 的回复:] 我用的是vc，那些解决问题的都是vs 这和环境没什么关系，你还是在工程下或者整个电脑中搜索一下到底有没有这个文件，如果有的话调整一下目录，如果没有那肯定会报错了，找找是不是少安装什么东西了，或者工程缺失了部分文件[/quote] 找不到，这个好像不是头文件，怎么找

user: user-2
content: 引用 3 楼 yechuan710 的回复:我用的是vc，那些解决问题的都是vs 这和环境没什么关系，你还是在工程下或者整个电脑中搜索一下到底有没有这个文件，如果有的话调整一下目录，如果没有那肯定会报错了，找找是不是少安装什么东西了，或者工程缺失了部分文件

user: user-3
content: 引用 3 楼 yechuan710 的回复:我用的是vc，那些解决问题的都是vs vc不是vs的一部分吗？

user: user-0
content: 我用的是vc，那些解决问题的都是vs

user: user-4
content: 这个是自定义的头文件，或者你在引用别人的库函数时需要加入别人函数的声明或者部分数据结构的使用。建议找一下库里头文件。  这些朋友的解决方法，可以借鉴一下： http://blog.csdn.net/andux1/article/details/52152564 还有 http://www.cnblogs.com/duguxue/p/4666967.html  遇到问题，建议先去网上搜索一下，看看别人有没有遇到相同或类似的问题。

user: user-5
content: 参考：http://www.cnblogs.com/duguxue/p/4666967.html 参考：http://blog.csdn.net/anobodykey/article/details/34126291
user-0 提问: C语言结构体函数

回复:
user: user-0
content: 哦哦哦，好的，已经解决了   谢谢

user: user-1
content: 引用 5 楼 xiaohuh421 的回复:上面错了 修改成 int binsearch(char *word, struct key *tab, int n) 这两种方法编译器都能正常识别（[], *)，主要是bsearch所在的源文件里找不到struct key的声明吧

user: user-2
content: 上面错了 修改成 int binsearch(char *word, struct key *tab, int n)

user: user-2
content: int binsearch(char *word, struct key tab[ ], int n)  修改成 int binsearch(char *word, struct key tab*, int n)

user: user-1
content: #include<stdio.h> #include<ctype.h> #include<string.h>  struct key{     char *word;     int count; }; struct key keytab[] = {     {"auto", 0},     {"break", 0},     {"case", 0},     {"char", 0},     {"const", 0} };  #define NKEYS (sizeof keytab / sizeof(struct key)) #define MAXWORD 100  int getword(char *, int); int binsearch(char *, struct key *, int);  int main() {     int i;     char word[MAXWORD];      //while(getword(word, MAXWORD) != EOF)     while(fgets(word, MAXWORD, stdin) != NULL) {         word[strlen(word) - 1] = 0;         if(isalpha(word[0]))             if((i = binsearch(word, keytab, NKEYS)) >= 0)                 keytab[i].count++;     }     for(i = 0; i < NKEYS; i++)         if(keytab[i].count > 0)             printf("%4d %s\n", keytab[i].count, keytab[i].word);     return 0; }  int binsearch(char *word, struct key tab[ ], int n) {     int cond;     int low, high, mid;      low = 0;     high = n - 1;     while(low <= high) {         mid = (low+high) / 2;         if((cond = strcmp(word, tab[mid].word)) < 0)             high = mid - 1;         else if(cond > 0)             low = mid + 1;         else             return mid;     }     return -1; } 这个方法是都写到一个源文件里，如果是多个源文件同时存在，建议添加一个头文件，将结构体的声明放在头文件里，然后多个源文件include该头文件

user: user-1
content: bsearch是在另一个文件里，这个文件找不到struct key数据结构，所以会提示这个错误。解决办法是：两个方法。 1. 把bsearch放在main同源文件里。 2. 将struct key单独放在一个头文件里，在两个源文件里都引用该头文件。 两种方法都可以。

user: user-3
content: #include<stdio.h> #include<ctype.h> #include<string.h> #define NKEYS (sizeof keytab / sizeof(struct key)) #define MAXWORD 100   struct key{     char word[10];     int count; }; key keytab[] = {     //关键字列表必须按升序存储在keytab中     {"auto", 0},     {"break", 0},     {"case", 0},     {"char", 0},     {"const", 0}  };   int getword(char *, int); int binsearch(char *, struct key *, int);   //统计输入中C语言关键字的个数 int main() {     int n;     char word[MAXWORD];       while(getword(word, MAXWORD) != EOF)         if(isalpha(word[0]))    //isalpha判断字符是否为英文字母，yes，return 非0；No，return 0；             if((n = binsearch(word, keytab, NKEYS)) >= 0)                 keytab[n].count++;     for(n=0; n<NKEYS; n++)         if(keytab[n].count > 0)             printf("%4d %s\n", keytab[n].count, keytab[n].word);     return 0; }
user-0 提问: 请问栈溢出该怎么解决，我希望数组能大一点，因为我要读的文件挺长的

回复:
user: user-1
content: 三种方法 1、一块一块读 2、用new、malloc等动态分配内存，但是不能超过2g左右 3、用内存映射

user: user-2
content: 声明成static最容易

user: user-3
content: 建议这种情况使用malloc和realloc，malloc是申请初始大小，realloc可以增加申请的空间的大小，也可以逐步增加。

user: user-4
content: 容量大小从小到大：栈≤全局数据≤堆≤文件≤硬盘≤磁盘阵列≤云存储 当程序需要使用比如2GB～1TB左右的存储时，最简单的办法恐怕得是用文件读写模拟内存读写了吧。windows参考_fseeki64函数，linux参考fseeko64函数。 FILE *fA;fA=fopen("A","rb+");_fseeki64(fA,10000000000i64*sizeof(int),SEEK_SET);fputc(fA,0);//int A[10000000000]; int B; _fseeki64(fA,9999999999i64*sizeof(int),SEEK_SET);fread(&B,1,sizeof(int),fA);//B=A[9999999999]; _fseeki64(fA,9999999999i64*sizeof(int),SEEK_SET);fwrite(&B,1,sizeof(int),fA);//A[9999999999]=B; fclose(fA);

user: user-4
content: 在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。

user: user-5
content: 对于很大的缓冲区, 请使用new 当然, new也不能无限制申请.  对于文件的处理, 不是整个全部读取到内存中, 而是读取一部分, 处理一部分. 这样就不需很大的缓冲区了
user-0 提问: 新人求纠错基于Hamilton回路算法的C语言程序

回复:
user: user-1

user: user-1

user: user-1

user: user-2
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。
user-0 提问: 请问有没有什么办法可以往程序里自动加一小段代码？

回复:
user: user-1
content: 开源性能分析项目难道就找不到吗？！

user: user-2
content: 引用 8 楼 zhu339111520 的回复:  然后根据分析结果，可以看到每个函数执行时间，独占时间意思是函数本身运行时间(不包括函数里调用的其它函数运行实现)， 非独占就是包括函数里调用的其它函数执行时间咯，从我这简单的测试截图可以看到，创建文件还是比较耗时的。   教授要我做个小程序 类似于VS这种功能的。。。。

user: user-3
content: 用调试 API 监控它运行啊，  WaitForDebugEvent  ptrace 啥的，  修改要监控的函数入口点代码， 跳到自己计时的代码转一圈就是了， 不麻烦... 如果别人程序检查自身完整性就只能用几个 DR 寄存器， 监控几个函数还行， 如果人还反调试就洗洗睡了。

user: user-4
content: 然后根据分析结果，可以看到每个函数执行时间，独占时间意思是函数本身运行时间(不包括函数里调用的其它函数运行实现)， 非独占就是包括函数里调用的其它函数执行时间咯，从我这简单的测试截图可以看到，创建文件还是比较耗时的。

user: user-1
content: 无profiler不要谈效率！！尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代！

user: user-5
content: 程序自动加，如果是已经编译好的程序，恐怕是很难做到的。把事先做好的函数放到里面，然后通过某个接口来调用是可行的。

user: user-6
content: 参考：http://cookiebear.info/archives/351

user: user-7
content: 基本不可能，但是查看特定线程的cpu占用还是能做到的。

user: user-5
content: 引用 4 楼 weixin_38194305 的回复:[quote=引用 2 楼 cfjtaishan 的回复:] 程序自动加，如果是已经编译好的程序，恐怕是很难做到的。把事先做好的函数放到里面，然后通过某个接口来调用是可行的。  程序没有编译 只想另外写个程序往被测试的程序里加代码[/quote] 很难做到，不建议继续走着条路了。

user: user-2
content: 引用 2 楼 cfjtaishan 的回复:程序自动加，如果是已经编译好的程序，恐怕是很难做到的。把事先做好的函数放到里面，然后通过某个接口来调用是可行的。  程序没有编译 只想另外写个程序往被测试的程序里加代码
user-0 提问: 为什么要将char*重新赋值

回复:
user: user-1
content: src完全可以不用重新赋值，并没有锦上添花，而是画蛇添足，跟const也毫无关系。

user: user-2
content: 引用 4 楼 u010647109 的回复:[quote=引用 1 楼 starytx 的回复:] dest指向的目标字符串，如果不重新定义一个指针的话，这个会在循环中移动到末尾，return 就有问题了。所以需要保留目标字符串首地址 src呢？为什么也要重新赋值，它并不return啊[/quote] 这个可以不做重新赋值，但是也是考虑不改变src的内容和位置。以便于调用之后不改变实参src

user: user-3
content: 引用 4 楼 u010647109 的回复:[quote=引用 1 楼 starytx 的回复:] dest指向的目标字符串，如果不重新定义一个指针的话，这个会在循环中移动到末尾，return 就有问题了。所以需要保留目标字符串首地址 src呢？为什么也要重新赋值，它并不return啊[/quote]直接使用形参也可以的，没有必要性

user: user-4
content: 既然dest知道我就不解释了，src请注意前面你的 const修饰符，意在使其成为const指针，避免对其内容做出修改。 锦上添花，在较长函数或代码串中较有优势，不加也不影响，就是使用过程中要更加小心。

user: user-2
content: 引用 12 楼 u010647109 的回复:[quote=引用 10 楼 cfjtaishan 的回复:] [quote=引用 4 楼 u010647109 的回复:] [quote=引用 1 楼 starytx 的回复:] dest指向的目标字符串，如果不重新定义一个指针的话，这个会在循环中移动到末尾，return 就有问题了。所以需要保留目标字符串首地址 src呢？为什么也要重新赋值，它并不return啊[/quote] 这个可以不做重新赋值，但是也是考虑不改变src的内容和位置。以便于调用之后不改变实参src[/quote]   src定义的也是const char *src，不过看大家都认为它重定义可有可无，那好吧。[/quote] const修饰的是src指向的数据，即字符串。const修饰之后字符串的内容不可以修改，而不是指针指向的地址值不可以修改

user: user-0
content: 引用 10 楼 cfjtaishan 的回复:[quote=引用 4 楼 u010647109 的回复:] [quote=引用 1 楼 starytx 的回复:] dest指向的目标字符串，如果不重新定义一个指针的话，这个会在循环中移动到末尾，return 就有问题了。所以需要保留目标字符串首地址 src呢？为什么也要重新赋值，它并不return啊[/quote] 这个可以不做重新赋值，但是也是考虑不改变src的内容和位置。以便于调用之后不改变实参src[/quote]   src定义的也是const char *src，不过看大家都认为它重定义可有可无，那好吧。

user: user-0
content: 引用 8 楼 u010808402 的回复:既然dest知道我就不解释了，src请注意前面你的 const修饰符，意在使其成为const指针，避免对其内容做出修改。 锦上添花，在较长函数或代码串中较有优势，不加也不影响，就是使用过程中要更加小心。  src定义的也是const char *src，不过看大家都认为它重定义可有可无，那好吧。

user: user-0
content: 引用 2 楼 cfjtaishan 的回复:在循环过程中，修改的是pdest和psrc，这样src和dest都还指向两个串的首地址，所以return和dest得到的都是新串的首地址，否则用dest和src做循环，返回的就是目标串的某位。 最后一个小问题，最后一个*pdest = '';需要改一下，改成如下才对。 *pdest = 0; /* 0 is equal '\0' */   其实dest我知道，但是src这个一直没想明白，也许是一直编程习惯，但是既然是好的编程习惯那肯定是有原因的

user: user-0
content: 引用 5 楼 SXJIAKE 的回复:没说一定要，这代码自己应该看的懂，也应该自己会改。比如改成这样：char *my_strcpy(char *dest, const char *src) {     char *ret = dest;     while (*src != '\0')     {         *dest++ = *src++;     }     *dest = '\0';     return ret; }   其实dest我知道，但是src这个一直没想明白，也许是一直编程习惯，但是既然是好的编程习惯那肯定是有原因的

user: user-5
content: 没说一定要，这代码自己应该看的懂，也应该自己会改。比如改成这样：char *my_strcpy(char *dest, const char *src) {     char *ret = dest;     while (*src != '\0')     {         *dest++ = *src++;     }     *dest = '\0';     return ret; }

user: user-0
content: 引用 1 楼 starytx 的回复:dest指向的目标字符串，如果不重新定义一个指针的话，这个会在循环中移动到末尾，return 就有问题了。所以需要保留目标字符串首地址 src呢？为什么也要重新赋值，它并不return啊

user: user-6
content: 楼上版主说的对，如果不需要返回地址的话可以不重新赋值

user: user-2
content: 在循环过程中，修改的是pdest和psrc，这样src和dest都还指向两个串的首地址，所以return和dest得到的都是新串的首地址，否则用dest和src做循环，返回的就是目标串的某位。 最后一个小问题，最后一个*pdest = '';需要改一下，改成如下才对。 *pdest = 0; /* 0 is equal '\0' */

user: user-3
content: dest指向的目标字符串，如果不重新定义一个指针的话，这个会在循环中移动到末尾，return 就有问题了。所以需要保留目标字符串首地址
user-0 提问: DHT11温湿度测量送LCD1602显示，从STC89C51移植到STC12C5A60S2就用不起了怎么解决？

回复:
user: user-0
content: 我是个小白，对我来说，太难了

user: user-1
content: 引用 1 楼 user-4 的回复:这两个速度有差异吧，跟延时有关的地方需要调整一下 对啊 89C是12T的51 12C5A60是1T的。 楼主，检查一下和指令执行时间有关的代码

user: user-2
content: 用一个空闲管脚，使用示波器测量，修改函数中的循环值，  先把 Delay 和 Delay1 调准了  比如 sbit DbgP = P3^1;  while(1) {    DbgP = 0;   Delay(10);  //10ms    DbgP = 1;   Delay1(); //xxx ms }

user: user-3
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-0
content: 延时部分已做处理，还是没有用，不知道是不是ISP,IPA那部分的地址不对，因为原程序是用的STC89C52部分的ISP,IPA的地址。

user: user-4
content: 这两个速度有差异吧，跟延时有关的地方需要调整一下
user-0 提问: 求大神解决 no appropriate default constructor available

回复:
user: user-1
content: Readarg *RA=new Readarg[1]; 改成 Readarg *RA = (Readarg *)malloc(sizeof(Readarg) * 1); Writearg *WA=new Writearg[2]; 改成 Writearg *WA = (Writearg *)malloc(sizeof(Writearg) * 2);  或者，添加两个struct的构造函数
user-0 提问: c语言小白，一道作业题，不知道哪错了

回复:
user: user-1
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-2
content: 最后的max错了，if要{把三个赋值语句括起来}

user: user-3

user: user-4
content: 不知道怎么传参数，就简单点按照你的逻辑定义个全局变量，   float score[M][N];

user: user-5
content: #include <stdio.h>   #define M 2 #define N 5  void input(float (*score)[N]); void aver(float (*score)[N]); void class_aver(float (*score)[N]); void max(float (*score)[N]);  int  main() {     float score[M][N];     input(score);     aver(score);     class_aver(score);     max(score); }  void input(float (*score)[N]) {          int i,j;     printf("请输入成绩:\n");     for(i=0;i<M;i++)     {         for(j=0;j<N;j++)         {          scanf("%f", &score[i][j]);         }     } }  void aver(float (*score)[N]) {        float a[M];     int i,j;     float sum=0;     printf("学生平均成绩:\n");     for(i=0;i<M;i++)     {            for(j=0;j<N;j++)         {             sum=sum+score[M][N];                      }         a[i]=sum/M;         printf("学号:%d,平均成绩:%f\n",i+1,a[i]);     } }  void class_aver(float (*score)[N]) {        float b[N];     int i,j;     float sum = 0;     printf("每门课的平均成绩:\n");     for(j=0;j<N;j++)     {         for(i=0;i<M;i++)         {             sum=sum+score[M][N];                      }             b[j]=sum/N;             printf("学科号:%d,平均成绩:%f\n",j+1,b[j]);     } }  void max(float (*score)[N]) {     int i,j,g,h;     float max;     printf("最高分及对应的学生和科目:\n");     max=score[0][0];     {         for(i=0;i<M;i++)         for(j=0;j<N;j++)             if(max<score[i][j])              max=score[i][j];         g=i;         h=j;     }     printf("最高分:%f,学号:%d,学科号:%d\n",max,g+1,h+1); }  试一下这个代码；

user: user-6
content: 传参啊！否则数据穿不进去的

user: user-7
content: 这个是我写的一小段代码，你可以参考着改一下，因为你们还没有学到指针，所以我的代码里面也没有出现指针  这是运行结果截图：    这是代码：  #include<stdio.h>  float aver(float,float,float,float,float);//传入学生的5科成绩  int main() { 	float score[5]={0}; 	int i;  	printf("请输入该学生的5科成绩：\n"); 	for(i=0;i<5;i++)           scanf("%f",&score[i]);  	//传入5科成绩,并打印结果 	printf("平均成绩为：%f\n",aver(score[0],score[1],score[2],score[3],score[4]));  	return 0; }   float aver(float score1,float score2,float score3,float score4,float score5) { 	float avr=(score1+score2+score3+score4+score5)/5.0; 	return avr; }

user: user-7
content: 引用 3 楼 qq_38681484 的回复:[quote=引用 1 楼 user-7的回复:]定义的是局部变量，没用指针，也没有传值，其他函数是访问不到的 我们还没有学习指针，刚开始学调用函数[/quote]  你发的那个没有传数据进去

user: user-7
content: 引用 3 楼 qq_38681484 的回复:[quote=引用 1 楼 user-7的回复:]定义的是局部变量，没用指针，也没有传值，其他函数是访问不到的 我们还没有学习指针，刚开始学调用函数[/quote]  那你也要把数值传入到函数中，这样那个函数才可以对数据进行操作的

user: user-0
content: 引用 2 楼 user-7 的回复:把题目顺便发一下吧

user: user-0
content: 引用 1 楼 user-7的回复:定义的是局部变量，没用指针，也没有传值，其他函数是访问不到的 我们还没有学习指针，刚开始学调用函数

user: user-7
content: 把题目顺便发一下吧

user: user-7
content: 定义的是局部变量，没用指针，也没有传值，其他函数是访问不到的
user-0 提问: c语言小问题

回复:
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执行停在该断点处的时候。

user: user-2
content: 对于c语言的问题我也不是很懂，也在通过写博客的方式提高自己，欢迎你来参观https://www.cnblogs.com/zhanqingheng

user: user-3
content: 这个题存在隐式类型转换   当无符号与有符号相同类型比较时，会自动转换成无符号类型，  当不同类型进行比较时，会自动转换成较大字节的类型，防止内存数据丢失

user: user-4
content: 同意2楼，顺便关注了。哈哈

user: user-5
content: 这个题目主要考察数据类型的范围和类型转换。 a+b表达式的值计算，编译器首先将b的类型转换成unsigned int，这是隐饰类型转换，因为unsigned int  表示范围大于int所以，向较大范围的类型转换。自然将-10转换成unsigned int，值肯定是一个很大的值，再加上10，自然是大于0的

user: user-6
content: (a+b>0?printf("a+b=%d\n",a+b):printf("a=%d b=%d\n",a,b)); 相当于 if(a+b>0)printf("a+b=%d\n",a+b); else printf("a=%d b=%d\n",a,b);
user-0 提问: 求问C语言学习阅读开源项目时遇到的问题.

回复:
user: user-1
content: VS IDE中，在不明白的符号上点鼠标右键，选转到定义。

user: user-2
content: 本代码段是一些跨编译器的配置，结合 SourceInsight 工具能提高效率，然后就是多查多在纸上画。  引用 楼主 u013467105 的回复:因为工作需要,会阅读开源项目snort.一个IPS项目.很多时候会看到一些这样的代码:     有些跟本没办法去看懂.好多语法原来学习C语言时也没有学到过.我想问一下有没有专门介绍这种开源项目,当中括glibc特性,GCC编译器特性,一些C的高级用法的书籍呢?大家在碰到这种问题的时候一般是怎么去看懂这些代码的啊?

user: user-3
content: 大部分是宏，条件编译时会用到。这些C语言课程里也是有讲的，比如定义头文件。开头就需要判断文件宏是否已定义。 建议专门看一下宏，条件编译类似#ifdef #ifndef， #else #endif等等这些。 其他，比如__attribute__建议网上查一下，这个我们平时编程可能用的比较少，包括上面的宏，所以可以专门详细了解一下

user: user-4
content: 去网上搜下宏指令学习下，这没什么难的，不要一开始就被吓到
user-0 提问: c语言作业，程序总是向文件输出一堆烫，新手求解！！

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

user: user-2

user: user-2

user: user-3
content: 烫烫更健康！

user: user-4
content: 在使用之前进行初始化是个良好的编程习惯。

user: user-5
content: #include<stdio.h> #include<string.h> #include<stdlib.h> #include<conio.h> #include<windows.h>  struct Book {     int num; //图书编号     char aut[50]; //作者     float price; //图书价格     char pub[50]; //出版商     char name[50]; //书名     int kc; //库存 }; void jieshu();  //借阅 void jskc(Book b);  void jieshu() {     struct Book b;     int s;     int w;     char sr[50];     printf("请输入要借阅的书籍（格式：《-书名-》）：\n");     scanf("%s", sr); /* remove '&' */     FILE*fp;     fp=fopen("allbook.txt","r");     fscanf(fp,"%d%s%s%s%f%d",&b.num, b.name, b.aut, b.pub, &b.price,&b.kc);     if(strcmp(sr,b.name)==0&&b.kc!=0)     {         printf("是否借阅（1.YES \ 2.NO）");         scanf("%d", &s);         switch(s)         {             case 1:                 jskc(b);                 printf("借阅成功！\n");                 break;             case 2:                 ex();         }     }     else     {         printf("无法借阅！该图书可能不存在或库存不足！\n");         printf("是否需要查询？(1.yes \ 2.no)\n");         scanf("%d",&w);         switch(w)         {             case 1:                 findbook();             case 2:                 ex();         }     }     fclose(fp); } void jskc(Book b) {     FILE*fp;     Book c[1010];     int i,j;     i = 0;     fp=fopen("allbook.txt","r");     while(fscanf(fp,"%d%s%s%s%f%d", &c[i].num, c[i].name, c[i].aut, c[i].pub,&c[i].price,&c[i].kc)!=EOF)    /* remove '&' */         i++;     fclose(fp);     fp = fopen("allbook.txt","w");     for(j = 0;j<i;j++)     {         if(b.num ==c[i].num&&b.name == c[i].name&&b.aut == c[i].aut&&b.pub == c[i].pub&&b.price == c[i].price&&b.kc == c[i].kc)         {             fprintf(fp,"%d  %s  %s  %s  %f  %d\n",b.num,b.name,b.aut,b.pub,b.price,b.kc-1);         }         else             fprintf(fp,"%d  %s  %s  %s  %f  %d\n",c[i].num,c[i].name,c[i].aut,c[i].pub,c[i].price,c[i].kc);     }      fclose(fp); } 出现特殊字符，主要是字符串没有找到结束标记，注意你的输入是否导致了字符串越界。 scanf和fscanf有写输入不需要加&的，因为数组名本身就是地址。建议对比一下，那些是不需要&的。 最后，建议注意下代码风格：比如 fprintf(fp, "%d  %s  %s  %s  %f  %d\n", c[i].num, c[i].name, c[i].aut, c[i].pub, c[i].price, c[i].kc); 加空格，让代码读起来更方便。

user: user-6
content: 请仔细检查scanf，fscanf，sscanf函数的返回值！

user: user-7
content: 任何字符串或者结构在使用之前建议初始化,

user: user-8
content: 这种情况就是你的程序输出文件的时候要输出的字符串没有初始化过，但分配了内存。你自己看看哪里出了问题（注意所有字符串数组，调试一下看哪个字符串数组都是“烫”）

user: user-8
content: 每次基本上涉及到字符串指针的内容时，一般新手都容易有些错误（我也是）  【转】C++常识“屯”和“烫” VC++中，在Debug模式下，会把未初始化的栈内存全部填成0xCC（204）。会把未初始化的堆内存全部填成0xCD（205）。但是Release模式下不会有这种动作，原来那块内存里是什么就是什么（Debug模式下这样干是为了让程序员知道是否被初始化）。0xCC和0xCD都超过了ASCII码0-127这个范围，因此它就被系统当成了宽字符组成的字符串，即两个字节数据组成一个字符，而0xCCCC表示的宽字符正好是“烫”字。同理，0xCDCD就是“屯”字。  这下明白了吗？（我以前也很不解）如果你在VC中选择Release模式就不会出现这种情况了（但是如果操作这个栈内存或堆内存有可能会崩溃） 如果还不明白的话可以加我QQ3300469945
user-0 提问: 素数的求和方式

回复:
user: user-1
content: 第三种 在循环外面k＝sqrt（n） i＜＝k  应该对算法有点优化吧

user: user-2
content: Finding prime numbers - Kenneth Haugland  Different schemas for finding prime numbers explained with code http://www.codeproject.com/Articles/429694/Finding-prime-numbers

user: user-3
content: 引用 3 楼 cfjtaishan 的回复:[quote=引用 2 楼 cyfcsd 的回复:] 把最后那个的开方写到循环外面，不要每次都做开方运算，时间会更快一些 这个编译器会优化吧？！ [/quote] 我没做实验，但编译器对函数调用优化比较难吧，因为很难确定函数有没有改变其他内容，比如改变了n值或者i值

user: user-4
content: 引用 2 楼 cyfcsd 的回复:把最后那个的开方写到循环外面，不要每次都做开方运算，时间会更快一些 这个编译器会优化吧？！

user: user-3
content: 把最后那个的开方写到循环外面，不要每次都做开方运算，时间会更快一些

user: user-4
content: 从时间复杂度来讲三种方法的复杂度一次减少；所以第三种是判断素数的最优方法（3种方法里）
user-0 提问: c的平方函数,10的2次方为“99”是怎么回事

回复:
user: user-1
content: 666酱油党路过

user: user-2
content: 浮点数格式 http://bbs.csdn.net/topics/390676437

user: user-0
content: 引用 3楼宋寒松 的回复: pow() 函数用来求 x 的 y 次幂（次方），其原型为：     double pow(double x, double y);  pow()用来计算以x 为底的 y 次方值，然后将结果返回。设返回值为 ret，则 ret = xy。  可能导致错误的情况： 如果底数 x 为负数并且指数 y 不是整数，将会导致 domain error 错误。 如果底数 x 和指数 y 都是 0，可能会导致 domain error 错误，也可能没有；这跟库的实现有关。 如果底数 x 是 0，指数 y 是负数，可能会导致 domain error 或 pole error 错误，也可能没有；这跟库的实现有关。 如果返回值 ret 太大或者太小，将会导致 range error 错误。  错误代码： 如果发生 domain error 错误，那么全局变量 errno 将被设置为  EDOM； 如果发生 pole error 或 range error 错误，那么全局变量 errno 将被设置为 ERANGE。   浮点数有误差很正常的。  引用 楼主 a15615667061 的回复:恩 明白了 谢谢

user: user-3
content: pow() 函数用来求 x 的 y 次幂（次方），其原型为：     double pow(double x, double y);  pow()用来计算以x 为底的 y 次方值，然后将结果返回。设返回值为 ret，则 ret = xy。  可能导致错误的情况： 如果底数 x 为负数并且指数 y 不是整数，将会导致 domain error 错误。 如果底数 x 和指数 y 都是 0，可能会导致 domain error 错误，也可能没有；这跟库的实现有关。 如果底数 x 是 0，指数 y 是负数，可能会导致 domain error 或 pole error 错误，也可能没有；这跟库的实现有关。 如果返回值 ret 太大或者太小，将会导致 range error 错误。  错误代码： 如果发生 domain error 错误，那么全局变量 errno 将被设置为  EDOM； 如果发生 pole error 或 range error 错误，那么全局变量 errno 将被设置为 ERANGE。   浮点数有误差很正常的。  引用 楼主 a15615667061 的回复:

user: user-0
content: 引用 1楼幻夢之葉 的回复:pow 参数接收和返回的是浮点数？  b = pow(10, 2) + 1e-6;好吧 谢谢

user: user-4
content: pow 参数接收和返回的是浮点数？  b = pow(10, 2) + 1e-6;
user-0 提问: c语言程序小问题

回复:
user: user-1
content: printf函数参数的压栈顺序是从右向左压栈，那么最右边的参数表达式先计算，所以c = c * 2;并且将计算结果放入的c，所以c的值已经发生了改变。

user: user-2
content: #include〈stdio.h〉 int main（） 〔      int a=10，b=20，c=30；      c=c*2；       b=b*c；        a=a+b+c；          printf（“%d  %d＼n，b，c”）；           printf（“%d＼n”，a）；             return 0； 〕

user: user-3
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-4
content: 先算c=c*2 得到60，再算b=b*c得到1200 然后a+b+c=10+1200+60=1270,最后printf返回打印的字符个数“1270”是4个所以最后输出了4

user: user-0
content: 谢谢楼上！！没有什么想装一下啦，只是在做题的时候碰到了不能理解，感谢感谢

user: user-5
content: http://blog.csdn.net/fefe82/article/details/37833767

user: user-6
content: 参数从右开始往左计算，所以计算的步骤如下： c=c*2 b=b*c a+b+c  printf("%d\n",printf("%d",a+b+c)); 这一行先打打印a+b+c的值为1270，它的长度是4个字节，所以又打印出一个4，由于1270没有换行，所这个4和前面的1270连在一起  建议楼主在开始学习的时候不要弄这么"高深"的写法，最好是按照步骤拆开来写，步骤清晰，错误也好查。如果一开始就把精力放到所谓的“技巧”上面，就算弄清楚了，偶尔可以在他人面前装一下，也没有实际意义
user-0 提问: _read()函数的指针是怎么个情况？

回复:
user: user-1
content: fd是文件描述符，这个值是不变的，因为打开一个文件，就是给了一个文件描述符，跟其他文件的描述符不一样，这个是文件系统维护的一张表，fd可以看成标识这个文件的ID（详细的请查阅文件系统）。但是读文件是，对于文件的节点都会维护一个位置，即读取的位置，这个位置会随着读写过程中跟着变化。 buffer是读到的数据放到buffer里，buffer也不会跟着变化，它还是指向其首地址。

user: user-0
content: 就c语言啊 额x86  按字节读，那放入的时候怎么放入 ？填满了int再往下一int放（4个字节放入一个int中） 还是说一个字节放入到低位再补满（一个字节放入一个int中），

user: user-1
content: 引用 5 楼 a271256939 的回复:引用 4 楼 cfjtaishan 的回复:引用 3 楼 a271256939 的回复:如果说buffer是一个int 型(4个字节）指针，而read是按照一个字节一个字节读的那么在buffer里的存储是如何的/？这个要根据系统是大端还是小端了，比如一次存入4个字节00, 00, 00, 01（16进制），如果是小端系统，那么是该int值是0x10000000，如果是大端系统，那么是0x00000001我的意思是 读入四个字节放入int  还是读一个字节放入int，int其他位填充 再读下一个字节放入下一个int read应该是按字节读的吧，你这个函数在什么场景下使用？

user: user-0
content: 引用 4 楼 cfjtaishan 的回复:引用 3 楼 a271256939 的回复:如果说buffer是一个int 型(4个字节）指针，而read是按照一个字节一个字节读的那么在buffer里的存储是如何的/？这个要根据系统是大端还是小端了，比如一次存入4个字节00, 00, 00, 01（16进制），如果是小端系统，那么是该int值是0x10000000，如果是大端系统，那么是0x00000001我的意思是 读入四个字节放入int  还是读一个字节放入int，int其他位填充 再读下一个字节放入下一个int

user: user-1
content: 引用 3 楼 a271256939 的回复:如果说buffer是一个int 型(4个字节）指针，而read是按照一个字节一个字节读的那么在buffer里的存储是如何的/？这个要根据系统是大端还是小端了，比如一次存入4个字节00, 00, 00, 01（16进制），如果是小端系统，那么是该int值是0x10000000，如果是大端系统，那么是0x00000001

user: user-0
content: 如果说buffer是一个int 型(4个字节）指针，而read是按照一个字节一个字节读的那么在buffer里的存储是如何的/？

user: user-2
content: 函数参数都是传值，所以不变。变的是由内核维护的文件的偏移量
user-0 提问: C语言调用winsocket,WSAConnectByName和WSAConnectByList怎么使用？

回复:
user: user-1
content: 百度搜 “WSAConnectByName WSAConnectByList site:microsoft.com”

user: user-1
content: 引用 2 楼 u011311291 的回复:看了MSDN还是不会写 这些个网页上难道没有能用的例子代码？

user: user-0
content: 看了MSDN还是不会写
user-0 提问: PAT上1037题

回复:
user: user-0
content: 我想练习STL模版，用的#include <string>，这应该不存在问题，对于你的第二个问题，我觉得也不存在什么问题，毕竟答案摆在那里的，我觉得自己的错误应该是在忽略了某个细小的点，没把它编上去。 不过，多谢回帖了！

user: user-1
content: 两个问题, 1. 头文件是不是应该是. include <string.h> 2. a, b数组的类型，定义成int类型即可。两个整数的相加减不会出现浮点数。 另外，对输入的数据没有判断范围（严格上将这个扣分更多）
user-0 提问: PAT甲级题库1001. A+B Format 某个测试点出错

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: a , b = input().split(' ') s = int(a) + int(b) if s < 0:     s1=str(-s)     print('-',end='') else:     s1=str(s) for i in range(1,len(s1) + 1):     print(s1[i-1] ,',' if i%3==len(s1)%3 and i!=len(s1) else '', sep='', end='')   #9行搞定

user: user-3
content: #include <iostream> #include <cstdio> #include <cstdlib>   using namespace std;  int main() {     int a, b, sum, c;     sum = 0;      scanf("%d %d", &a,&b);     sum = a + b;      if(sum < 1000 && sum > -1000)         printf("%d\n",sum);     else if(sum < 1000000 && sum > -1000000)         printf("%d,%03d\n", sum/1000, abs(sum % 1000));     else {         c = sum % 1000000;         printf("%d,%03d,%03d\n", sum / 1000000, abs(c/1000), abs(c%1000));     }      return 0; } 20分代码

user: user-4
content: 第十六行  printf("%d,%03d,%03d",sum/1000000,abs(c/1000000),abs(c%1000));可能有点问题     999999+9999999=1，999，998

user: user-4
content: 同楼主，我是第十个测试点一直错

user: user-5
content: #include <stdio.h> #include <stdlib.h>  int main() {     int a, b, sum, c;     sum = 0;      scanf("%d %d", &a,&b);     sum = a + b;      if(sum < 1000 && sum > -1000)         printf("%d\n",sum);     else if(sum < 1000000 && sum > -1000000)         printf("%d, %03d\n", sum/1000, abs(sum % 1000));     else {         c = sum % 1000000;         printf("%d, %03d, %03d\n", sum / 1000000, abs(c/1000000), abs(c%1000));     }      return 0; } abs头文件是stdlib.h，不是math.h吧 我是在Linux下测试的
user-0 提问: C语言函数参数问题

回复:
user: user-1
content: 引用是足，画蛇添足的足。个人意见。

user: user-2
content: 学严蔚敏落下的毛病

user: user-3
content: C语言下没有引用，C++才有，所以要地址传递，可以用指针

user: user-4
content: #include<iostream.h> void Exchg3(int &x, int &y) {    int tmp = x;    x = y;    y = tmp;    cout<<"x = "<<x<<",y = "<<y<<endl; } main() {    int a = 4;    int b = 6;    Exchg3(a, b);    cout<<"a = "<<a<<",b = "<<b<<endl;    return(0); }

user: user-5
content: C语言没有引用，关于C语言的知识，可以参考一下这个http://blog.csdn.net/libing403?viewmode=contents

user: user-6
content: C里面没有引用的

user: user-5
content: 里面有关于c语言的资料，对你可能有用 http://blog.csdn.net/libing403?viewmode=contents

user: user-7
content: C语言没有引用，C++才有  C语言需要按指针传递来达到类似引用的效果

user: user-8
content: c要改参数值，只能用指针，传实参地址进去了

user: user-9
content: 引用是C++的特殊使用，C语言不支持。建议使用指针。 #include <stdio.h>  void Exchg3(int *x, int *y) {    int tmp = *x;    *x = *y;    *y = tmp;    printf("x = %d,y = %d\n", *x, *y); } int main() {    int a = 4;    int b = 6;     Exchg3(&a, &b);    printf("a = %d, b = %d\n", a, b);     return 0; }

user: user-10
content: 楼主说对了，c里面不能用引用

user: user-11
content: C语言里没有引用，只有指针，只能用int *p，或者如果不需要改变实参可以传值

user: user-0
content: 引用 1 楼 user-12的回复:C++才有引用，C只有指针 那在C里面，定义函数参数时，上面两种都不可以吗，只能int*p？

user: user-0
content: 明白了，感激各位大神

user: user-12
content: C++才有引用，C只有指针
user-0 提问: malloc怎么申请一个动态的空间

回复:
user: user-1
content: m没有初始化    malloc   申请空间时是要必须知道要申请的空间的大小(要申请空间的字节数)

user: user-2
content: 你的m没有值，编译器不知道要申请的空间大小 int m = 3;

user: user-0
content: 引用 6 楼 zhao4zhong1 的回复:int m=0; int *p; sum(a,&m);  //m需要在sum求出来 if (m>0) {  p=(int*)malloc(m*sizeof(int));  if (p==NULL) {   printf("Can not malloc %d bytes to p!",m*sizeof(int));   exit(1);  }  ...  free(p); } 谢谢！您的意思我懂了，先调用sum求出m,再malloc,再调用sum输出p，非常感谢！确实是我设计上的问题

user: user-3
content: int m=0; int *p; sum(a,&m);  //m需要在sum求出来 if (m>0) {  p=(int*)malloc(m*sizeof(int));  if (p==NULL) {   printf("Can not malloc %d bytes to p!",m*sizeof(int));   exit(1);  }  ...  free(p); }

user: user-2
content: 引用 4 楼 doubyZZ 的回复:[quote=引用 1 楼 starytx 的回复:] 你的m没有值，编译器不知道要申请的空间大小 int m = 3;因为申请的时候，空间大小我不知道，要在后面的函数中求出来。[/quote]那你这个就是死循环了，设计上有问题，m还没有求出来，却要在sum中对p进行输出。

user: user-0
content: 引用 1 楼 starytx 的回复:你的m没有值，编译器不知道要申请的空间大小 int m = 3;因为申请的时候，空间大小我不知道，要在后面的函数中求出来。

user: user-4
content: m未初始化，编译器给它的是一个随机值（这个随机值可能比较大），那么申请到的空间大小是不确定的（随机的）；
user-0 提问: 建立一个链表，每个结点包括学生的学号，姓名和学生的平均成绩；输入一个学生的名字，如果链表中有该学生，则删除该结点

回复:
user: user-1
content: p不为空就删除

user: user-2
content: 4. 还有字符串比较，要用字符串函数。

user: user-2
content: #include<stdio.h> #include<stdlib.h> #include<string.h>  typedef struct student {      char num[20];     char name[20];     int aver;     struct student *next; }STU;      STU *creat();     STU *del(STU *head,char name[20]);     void display(STU *);  int main() {     STU *head, *s;     char name[20];      head = creat();     printf("输入个数：");      display(head);     printf("要删除的名字：");     fgets(name, 20, stdin);     name[strlen(name) - 1] = 0;     head = del(head, name);//     display(head);      return 0; }  STU *creat() {     STU *head,*p,*s;     int key = 1, n;     char k[3],aver[3];      head = (STU *)malloc(sizeof(STU));     p = head;     while(key)     {         printf("输入：");         gets(k);         n=atoi(k);         if(n!=0)         {             s=(STU *)malloc(sizeof(STU));             printf("输入名字：");             gets(s->name);             printf("输入学号：");             gets(s->num);             printf("输入成绩：");             gets(aver);             s->aver=atoi(aver);             p->next = s;             p = s;         }         else             key=0;     }     p->next = NULL;     s = head;     head = head->next;     free(s);    /* need to free */     return(head); }   STU *del(STU *head,char name[20]) {     STU *p,*q;     if(head == NULL)         printf("error \n");      if(strcmp(head->name,name) == 0) {         p = head;         head = head->next;         free(p);     } else {         q = head;         p = head->next;         while (p) {             if (strncmp(p->name, name, 20) == 0) {                 q->next = p->next;                 free(p);                 break;             }             p = p->next;             q = q->next;         }         if (!p)             printf("Not found!\n"); /*         while(p && p->name != name)             if((p->name)!=name)             {                 q=p;                 p=p->next;                 printf("ok\n");             }         if(p!=NULL)         {             q->next=p->next;             free(p);             printf("ok\n");         }         else             printf("not found\n");             */     }     return head; }  void display(STU *head) {     STU *p;     p = head;       printf("chain is : \n");     while (p) {         printf("%s %s %d \n", p->name, p->num, p->aver);         p = p->next;     }     /*        printf("chain is : \n");        if(head!=NULL) {        do {        printf("%s %s %d \n", p->name, p->num, p->aver);        p=p->next;        } while(p!=NULL);        }        */ } 参考一下这个代码吧； 问题：1. fgets比gets安全，建议使用fgets，但是注意fgets可能将\n输入到缓存里，注意去掉； 2. 创建链表时，若想去掉岗哨节点，记着free掉其空间； 3. del删除一个节点时，注意要返回新的头节点，因为删除的有可能就是头节点。不论是通过返回值返回还是传入传出参数返回。

user: user-3
content: while(p!=NULL && (p->name)!=name)             if((p->name)!=name)  这里的比较用strcmp进行字符串的比较

user: user-3
content: 你具体的错是指哪里错或者怎么错，说清楚一点，要不然找错误得仔仔细细分析一遍你的代码。
user-0 提问: c语言中如何在不影响程序运行的情况下实现背景音乐循环

回复:
user: user-1
content: MCI ？

user: user-2
content: 开线程或者进程；多线程或者多进程都可以实现并发

user: user-3
content: 不影响运行，貌似就是开个线程，在里边循环播放了

user: user-4
content: 看你是用什么方式播放背景音的， 有些播放函数直接支持循环播放的

user: user-5
content: 加开一个线程去执行音乐播放
user-0 提问: 指针变量访问数组总是出现数组第一个元素！求大佬解惑！

回复:
user: user-1
content: 不用element这个变量，在输出时直接将element换成*（addr+i）

user: user-2
content: 就像上面各位说的，你的element的值一直都没有变，一直都是数组的第一个元素的值，应该把指针朝后移动一位才可以

user: user-3
content: element是一个int对象，值是不会变的，所以一直是第一个元素，换成addr++就可以了 printf("a[%d]=%d\n",i,addr++);

user: user-4
content: 指针偏移取值

user: user-5
content: 数组名是整个数组的的起始地址，也同时是数组第一个元素的地址。

user: user-6
content: #include<stdio.h>     int main() { 	int a[5] = { 1, 2, 3, 4, 5, }; 	int *addr; 	int i; 	  	addr = a; 	int *element = addr;  	for (i = 0; i<5; i++) 	{ 		printf("a[%d]=%d\n", i, *element++); 	} 	system("pause"); 	return 0; }

user: user-7
content: 引用 3 楼 岛是海的一块疤的回复:element   代表了数组首元素的地址， 你可以 在输出的时候 对  element++  然后就可以了 看错了，  变量 element是  数组首元素的值  你可以输出的时候把element   换为  * (add++)

user: user-7
content: element   代表了数组首元素的地址， 你可以 在输出的时候 对  element++  然后就可以了

user: user-8
content: 数组名是数组第一个元素的地址

user: user-9
content: #include <stdio.h>   int main() {     int a[5] = {1, 2, 3, 4, 5,};     int *addr;     int i;     int element;      addr = a;     element = *addr;      for(i=0;i<5;i++)         printf("a[%d]=%d\n", i, addr[i]);       return 0; } element是数组a的第一个元素的值，所以只输出第一个元素的值。 改成这样就可以了。 printf("a[%d]=%d\n", i, addr[i]);
user-0 提问: 求大神帮忙！练习程序出错了，但看不懂，求大神帮忙解释下

回复:
user: user-1
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-2
content: #include <stdio.h>  int main(void) {      int c, ni, nw, nc, inword = 1;     inword = 0;     ni = nw = nc=0;      while((c = getchar()) != EOF)     {         nc++;         if(c =='\n')             ni++;         if(c == ' ' || c == '\t' || c == '\n')             inword = 0;         else if(inword == 0) {             inword = 1;             nw++;         }     }     printf("line=%d word=%d character=%d\n", ni, nw, nc);      return 0; } 除了nl未定义，改成ni之外。 判断条件里c == ' '，应是空格。inword应该初始化。

user: user-3
content: 你定义了ni，却使用nl E:\C++\练习\main.c|12|error: 'nl' undeclared (first use in this function)|

user: user-4
content: 在main()前面加一个int，还有ni和nl好像搞混了，还有第二个if后面是c==' '（空格，不是空的）
user-0 提问: 霍夫曼编码

回复:
user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:百度搜相关关键字。  代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！ 别乱复制了，我连代码都没贴啊，代码不能一直靠自己一个人写吧，站在别人肩膀上快点， 我就只是想知道怎么算的，给我一个算式就行了，不是算法

user: user-1
content: 百度搜相关关键字。  代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！

user: user-1
content: https://www.baidu.com/s?wd=Huffman编码
user-0 提问: 关于变量自增自减的输出问题

回复:
user: user-1
content: 1、参数是从右向左压入栈中  2、后置++实现的时刻是未定义的，涉及到顺序点，可能是在整个语句执行之后才自加  3、关于C,C++表达式求值顺序  http://bbs.csdn.net/topics/370153775  4、return加表达式 返回的是表达式的运算结果

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

user: user-3
content: 不要研究这个了，只要知道 ++i返回自增后的结果，i++返回后自增就行了

user: user-4
content: return的返回值是数值还是字符串，跟函数的定义的返回值类型有关。

user: user-4
content: 从右想向，这是参数入参的顺序，即函数参数的压栈顺序是从右向左压栈，所以先计算printf最右边的表达式的值，将值压入栈。(这是你的编译器决定的压栈顺序） 但是自增和自减使用时有副作用，所以不建议这样传递函数参数。建议先计算再传参。 对于类似的的问题,建议减少或者不用（同一个变量的多个参数的）自增或自减作为函参。

user: user-5
content: 这个跟编译器的实现有关系，没必要太较真了，编译器的行为就是你看到的这样，记住就可以了 return加表达式就是返回表达式的值，它必须是一个数或者一个字符，其实字符也是一个数

user: user-6
content: 实质上可将++分情况扩展如下 i++ {     int temp = i;     i += 1;     return temp; }  ++i {     i += 1;     return i; }   回到你的问题： 1. 自右向左， ++i, i++ =>  4, 2 要特别说明的是，不同编译器，产生结果可能不同。为了避免依赖编译器产生结果，最好将可能发生歧义的地方分两行计算。 2. 返回字符、数值跟返回类型有关，如函数原型中返回类型为指针，则也可返回指针
user-0 提问: C语言枚举的一点疑问

回复:
user: user-1
content: ++  引用 1 楼 cfjtaishan 的回复:#include <stdio.h> #include <stdlib.h>  typedef struct NODE{     struct NODE *Prev;     struct NODE *Next;     char *value;     int type; }*Node;  int main(int argc, char const *argv[]) {     struct NODE L = { NULL, NULL, "l", 1};     printf("l1 success \n");     struct NODE L2 = {&L, NULL, "l2", 2};     L.Next = &L2;     printf("l2 success \n");      Node L3 = (Node) malloc(sizeof(struct NODE));     L2.Next = L3;     L3->value = "l3";     L3->type = 3;     L3->Prev = &L2;     printf("l3 success \n");      Node L4 = (Node) malloc(sizeof(struct NODE));     L3->Next = L4;     L4->value = "l4";     L4->type = 4;     L4->Prev = L3;     L4->Next = NULL;     printf("l4 success \n");     return 0; } 注意Node是指针，sizeof(Node)的长度是4（32位系统），不是sizeof(struct NODE)的长度。 代码请参考上面的。

user: user-2
content: #include <stdio.h> #include <stdlib.h>  typedef struct NODE{     struct NODE *Prev;     struct NODE *Next;     char *value;     int type; }*Node;  int main(int argc, char const *argv[]) {     struct NODE L = { NULL, NULL, "l", 1};     printf("l1 success \n");     struct NODE L2 = {&L, NULL, "l2", 2};     L.Next = &L2;     printf("l2 success \n");      Node L3 = (Node) malloc(sizeof(struct NODE));     L2.Next = L3;     L3->value = "l3";     L3->type = 3;     L3->Prev = &L2;     printf("l3 success \n");      Node L4 = (Node) malloc(sizeof(struct NODE));     L3->Next = L4;     L4->value = "l4";     L4->type = 4;     L4->Prev = L3;     L4->Next = NULL;     printf("l4 success \n");     return 0; } 注意Node是指针，sizeof(Node)的长度是4（32位系统），不是sizeof(struct NODE)的长度。 代码请参考上面的。
user-0 提问: 《C Primre Plus》看完了，下面该看什么书？

回复:
user: user-1
content: 这么早就开始学了

user: user-2
content: 推荐《C和指针》、《C专家编程》

user: user-3
content: 在不影响学习的基础上，要多实践敲代码，算法是灵魂

user: user-4
content: 还是自己尝试写点代码，然后可以上c语言三剑客了

user: user-5
content: 引用 5 楼 zhao4zhong1 的回复:高中生还是上好高中课程吧。 希望楼主不要犯类似 “早知道吃完第七个包子就饱了，我为什么还要吃前六个包子呢？！” 这种低级错误。 顶一个。

user: user-6
content: 现在的高中生好牛啊！！ 不过还是建议先学好高中课本，进一所好大学，这样眼界比较开阔     然后，你会发现还是干别的比当码农好…………

user: user-7
content: 《深度探索C++对象模型》

user: user-8
content: 可以看《C和指针》，专门用来学习指针的，对将来理解JAVA中的引用打下一个良好的基础

user: user-9
content: 楼主多长时间把primer plus看完了啊

user: user-10
content: 引用 5 楼 zhao4zhong1 的回复:高中生还是上好高中课程吧。 希望楼主不要犯类似 “早知道吃完第七个包子就饱了，我为什么还要吃前六个包子呢？！” 这种低级错误。  +1

user: user-11
content: 引用 5 楼 zhao4zhong1 的回复:高中生还是上好高中课程吧。 希望楼主不要犯类似 “早知道吃完第七个包子就饱了，我为什么还要吃前六个包子呢？！” 这种低级错误。 有道理～什么时间做什么事情还是比较好的。除非你比别人学的快，学得透彻。 就像建高楼一样，地基需要打好了才行呢

user: user-12
content: 高中生还是上好高中课程吧。 希望楼主不要犯类似 “早知道吃完第七个包子就饱了，我为什么还要吃前六个包子呢？！” 这种低级错误。

user: user-13
content: http://bbs.csdn.net/topics/390966354/

user: user-11
content: 做到基本都理解，还不能算是看完这本书。有没有把书上的小程序都敲进电脑测测？有没有改改这些程序。还有这本书后面的练习题有没有都做了。理解伦理知识还是不够的，主要的是要提高实践能力。

user: user-14
content: 《代码大全》，《代码大全》，《代码大全》

user: user-15
content: 想进一步夯实理论就《C++编程思想》； 想结合平台就《Windows核心技术》、《UNIX编程艺术》 想做GUI就看看Qt 等等。。。
user-0 提问: 代码出错问题： error C129: missing ';' before 'T0RH'

回复:
user: user-1
content: typedef byte uint8

user: user-2
content: uint8 不是C C++内置数据类型，需要包含的头文件或者用户代码中有定义  类似如下： typedef unsigned short uint8;

user: user-3
content: typedef unsigned char uint8;
user-0 提问: 求大神请教这是怎么回事！！

回复:
user: user-1
content: #include<stdio.h> int main(void) {     int lxjcj;     int i = 1;     int leiXin;      for (i = 1; i <= 1;)     {         scanf("%d", &leiXin);         switch (leiXin)         {             case 1:                 lxjcj = 1000;                 i = 2;                 printf("%d", lxjcj);    /*去掉&*/                 break;             default:                 i = 1;                 printf("输入有误，请重新");                 break;         }     } } printf若输出某个变量的值，不需要加&
user-0 提问: 为什么我照教材上打还会出错勒（明明一模一样的啊）

回复:
user: user-1
content: 两个问题： 1. max函数未定义； 2. max的声明建议不要放在main函数体内，建议放在函数之外；不论函数还是变量都要遵循先声明后使用的原则；

user: user-2
content: int main() {     int max(int x,int y); //只是声明     int a,b,c;     scanf("%d,%d",&a,&b);     c=max(a,b);     printf("max=%d\n",c);     return 0; }  int max(int x,int y) //函数的定义 {     return x > y ? x : y; }PS：函数声明请不要放在函数里面，这是很老式的风格和习惯，现如今会感觉很丑陋！
user-0 提问: 求助：C语言给结构体赋值的时候发生了莫名其妙的事情

回复:
user: user-1
content: 结构体初始化，建议一个一个的赋值，这样做可能较为繁琐，但是不会出现大的问题；即使有问题也好定位。

user: user-2
content: 微软的 C 编译器我就不吐槽了，也不知道哪年才开始支持这种指定成员初始化。 反正别家编译器好几年前都支持了，现在他才支持起来，居然还是个残废。

user: user-3
content: VS2013 Win7下没问题 可能跟编译器版本有关，或者抽风

user: user-4
content: 首先 你没有 .d 啊      union{         int a;         int b;         int c;         int d;     }; 是一个共用体类型 你没有定义共同体变量

user: user-5
content: C99的新特性，就不要在VS上试了 GCC表示毫无压力

user: user-0
content: #include<stdio.h> #include<stdlib.h> #include<string.h>  typedef struct _test { 	int id; 	char name[30]; 	int level; 	int stock; 	double price; 	char name2[39]; 	union{ 		int a; 		int b; 		int c; 		int d; 	};   }Test;    int main(void) {  	Test test = {  		.id=1 ,"abc",.level=  1,.stock=5,.d=10  		   	}; 	  	system("pause"); 	return 0; }    抱歉第一次登论坛，不懂规矩，这是我第一张图的代码，里面的char name2[39]只要一换位置就会出现我说的问题

user: user-6
content: 请贴代码，没代码谁知道你说什么
user-0 提问: 求帮忙看看程序哪出错了，迷宫求得的路径是错的

回复:
user: user-1
content: 建议你在必要位置设置断点，然后单步跟踪程序运行，看每一步变量变化情况是否与你期望的一致，很容易找到原因，别人不知你程序表示的意思，所以不好帮你找

user: user-2
content: int Initstack(stack *s) {     s->base = (selemtype *)malloc(STACK_INITSIZE * sizeof(selemtype));     if (!s->base)         exit(-1);     s->top = s->base;     s->stacksize = STACK_INITSIZE * sizeof(selemtype);      return 0; }  int push(stack *s, selemtype e) {     if ((s->top) - (s->base) > s->stacksize) {         s->base = (selemtype *)realloc(s->base, (STACK_INITSIZE + INCREMENT) * sizeof(selemtype));         if (!s->base)             exit(-1);         s->stacksize += INCREMENT * sizeof(selemtype);         //s->top = s->base + s->stacksize;     }     *s->top++ = e;      return 0; } 注意这两个地方也是有问题的。注意栈的长度

user: user-3
content: int pass(position p){ 	if (maze[p.x][p.y] == 0) 		return 1; 	return 0; } 写代码要稍微小心点，你这x，y大小一致所以没有引发奔溃，如果x>y。。。 给个建议，多断点调试下
user-0 提问: 堆排序写的是对的，为什么排序不正确，到底哪里错呢

回复:
user: user-1
content: 12行 a[i]=a[childmax]; -> a[p]=a[childmax];

user: user-2
content: 还没学到数据结构呢    你可以把数组改小一些  例如   int a[7] = {1,3,5,4,0,6,7};然后自己逐步调试一下，调出监视窗口验证一下
user-0 提问: 为什么我的哈夫曼的编码是这样的？

回复:
user: user-1
content: 楼上说的都很重要，但是这个程序问题并不处在返回值上，没有前缀的程序，有些编译器会默认为void，而这个程序子函数都没用到返回值，所以影响不大。我稍微看了下，暂且发现了你的输出code数组是字符型数组，用的却是%d，其他建树这方面我没太看，应该问题不大。引用引用一楼回答 1、在VS2010上调试，这三个函数都需要加void，声明该函数是没有返回值的，否则编译不过。 creat_huff(struct node Htree[]) code_huff(struct node Htree[]) main() 2、调试结果不符合预期，需要自己单步调试。单步跟总能跟到出问题点。

user: user-2
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-3
content: 引用 1 楼 adusuccessfully 的回复:1、在VS2010上调试，这三个函数都需要加void，声明该函数是没有返回值的，否则编译不过。 creat_huff(struct node Htree[]) code_huff(struct node Htree[]) main() 2、调试结果不符合预期，需要自己单步调试。单步跟总能跟到出问题点。

user: user-4
content: 1、在VS2010上调试，这三个函数都需要加void，声明该函数是没有返回值的，否则编译不过。 creat_huff(struct node Htree[]) code_huff(struct node Htree[]) main() 2、调试结果不符合预期，需要自己单步调试。单步跟总能跟到出问题点。
user-0 提问: 泊松分酒

回复:
user: user-1
content: 百度搜相关关键字。

user: user-2
content: 而且，为什么3009这个既符合三等分，也符合四等分，往后再走一步就行  你把输入的顺序修改一下看可以吗

user: user-2
content: 4等分的时候 你这个3009是正确结果啊，但是为什么出来的全是3009

user: user-3
content: 3009是什么意思？

user: user-4
content: 第二个图的程序是怎么实现的啊？

user: user-5
content: 怎么做到的呀?

user: user-0
user-0 提问: 求问c语言字符串问题

回复:
user: user-1
content: 空串的标识法不是这样的。“”这样才是表示空串；为什么要赋值"()"，还要看这个程序的功能是做什么的，跟括号是不是有关系

user: user-2
content: 首先它不是空字符串 其次它表示的就是 （） 这个字符串（里面包含一对括号）
user-0 提问: c语言

回复:
user: user-1
content: 各种排序算法动画演示http://www.webhek.com/misc/comparison-sort/  ＜1000个元素，冒泡排序 ＜100000个元素，qsort函数 ＜10000000个元素，放数据库中，建索引，（B+树排序） ≥10000000个元素，没用到过。

user: user-2
content: 第二个 用冒泡法就可以实现数组里面的排序问题了  你可以先存到数组里面再排序  发给你一个代码 你看看就知道冒泡怎么使用了 #include<stdio.h> #include<stdlib.h> void BubbleSort(int a[],int n) {  int i,j,power;  for(i=n-1;i>0;i--)  {   for(j=0;j<i;j++)   { 	if(a[j]>a[j+1]) 	{ 		power=a[j]; 		a[j]=a[j+1]; 		a[j+1]=power; 	}   }  } } int main(void) { 	int a[]={8,3,6,1,68,12}; 	int n=6; 	int i; 	for(i=0;i<n;i++) 	BubbleSort(a,n); 	printf("排序后:"); 	for(i=0;i<n;i++) 	printf("%d\t",a[i]); 	printf("\r\n"); 	system("PAUSE"); 	return 0; }

user: user-3
content: 第2个时快速排序法 第3个是递归实现。

user: user-4
content: http://blog.csdn.net/morewindows/article/details/6684558 可以参考一下
user-0 提问: dhcp 启动不了 

回复:
user: user-1
content: 把你的dhcp服务器的配置文件的地址段设置成跟正在使用的网卡地址段在一个网段内就通了，启动服务，立即生效，

user: user-2
content: 百度搜用半角双引号括住的对应错误信息。

user: user-0

user: user-0
content: 没有人帮帮忙么..........真不知道啊我

user: user-0
user-0 提问: typeof

回复:
user: user-1
content: typeof没见过，typedef倒是见过，就是起别名  相当于给node*类型起个名叫  ptrtonode(翻译成中文指向node的指针)  然后又给指向node的指针起了俩名字  list， position  为啥要起别名，是因为想增加代码可读性，虽然他们类型是一样的，但是可以起个别名写代码的时候好理解

user: user-2
content: typeof是什么？ typedef倒是有的。其实就是其别名，即struct node *别名分别是ptrtonode， list, position;  用list或ptrtonode或position定义变量时，和struct node *定义的变量类型都是一样的。
user-0 提问: 数据结构的堆栈，和内存空间的堆栈有什么区别和关系吗？？

回复:
user: user-1
content: 引用 1 楼 jianwen0529 的回复:数据结构分堆结构，栈结构。 内存区也分堆内存，栈内存。  它们除了名字一样没有什么必然的联系。就跟苹果一样，一个是水果一个是品牌。 前者是组织数据的一种手段（或者叫工具），后者只是指明数据存储在哪种内存区之上。 1 楼回答的那么形象，该结帖了。

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

user: user-3
content: 数据结构也有堆，和内存堆没啥关系。两个栈都是先进后出。 堆栈就是栈，不是堆和栈的合称。

user: user-4
content: 数据结构分堆结构，栈结构。 内存区也分堆内存，栈内存。  它们除了名字一样没有什么必然的联系。就跟苹果一样，一个是水果一个是品牌。 前者是组织数据的一种手段（或者叫工具），后者只是指明数据存储在哪种内存区之上。

user: user-5
content: 数据结构的堆栈是指两种不同的处理方式，内存的堆栈是不同的存储区域，这两者没有直接关系

user: user-6
content: 数据结构的堆栈，一般是一个意思即栈，遵循先进后出。 内存中的堆区和栈区，主要是针对不同的变量，函数的存放区域。比如堆上空间，是动态申请和动态释放的，需要开发者自己手动申请，并且手动释放，对于堆上的空间申请和释放有专门的函数比如malloc，free等。 对于栈上的空间，主要是存放函数，局部变量等等，但是这个栈内存也是遵循先进后出的使用原则。 所以，数据结构的堆栈和内存的堆栈（内存还分只读数据段，代码段，数据段等等）是不同的概念，对于栈都是遵循先进后出的原则。详细的概念说明，建议去网上搜一下
user-0 提问: 求帮忙看看我的代码，哪里出问题了。计算组合数

回复:
user: user-1
content: #include <stdio.h> #include <stdlib.h>  long jc(int x);  int main() {     int a,b,c,m,n;     long s;      printf("input m,n=");     scanf("%d,%d", &m, &n);     for(a = 1;a <= m; a++)         for(b = 1; b <= n; b++)             for(c = 1; c <= (m-n); c++)             {                 s = jc(a)/jc(b)/jc(c);                 printf("%ld\n",s);             }     //system("pause");     return 0; } long jc(int x) {     int i;     long p=1;     for(i = 1; i <= x; i++)         p = p*i;     return (p); } 问题： 1. 函数不能嵌套； 2. m !=0 n != 0是判断语句； 3. scanf需要加&

user: user-2
content: 仅供参考：  #include <stdio.h>  long jc(int x) {     if (x <= 1) return x;     return x * jc(x - 1); }  int main() {     int m = 0, n = 0;     long s;     printf("input m,n=");     scanf("%d,%d", &m, &n);     if (m <= 0 || n <= 0 || m < n)     {         printf("Input error.");         return 0;     }     s = jc(m) / jc(n) / jc(m - n);     printf("C（m,n）= %ld", s);     return 0; }

user: user-2
content: #include <stdio.h> #include <stdlib.h>  // 这不是求阶乘吧？ long jc(int x) {     int i; long p = 1;     for (i = 1; i <= x; i++) p = p*i;     return(p); }  int main() {     int a, b, c, m, n;     long s;     //m != 0; n != 0; //这是什么？     printf("input m,n=");     //scanf("%d,%d", m, n);     scanf("%d,%d", &m, &n);     //这么多循环？     for (a = 1; a <= m; a++)         for (b = 1; b <= n; b++)             for (c = 1; c <= (m - n); c++)             {                 s = jc(a) / jc(b) / jc(c);                 printf("%ld", s);             }     system("pause");     return 0; }
user-0 提问: C语言中利用0地址求结构体中的字段的偏移量时涉及的问题

回复:
user: user-1
content: struct xing *p = 0; 等同于 struct xing *p = NULL; size_t offset = (size_t) (&p->age); 这句是得到age的地址值，并没有读取或写p->age的值。

user: user-2
content: http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素

user: user-3
content: int main() {     // 字段地址就是单纯的 对象首地址 + 偏移字节，当对象首地址为0时，得出的等同于偏移地址     struct xing *p = (xing*)1000;      size_t offset = (size_t)(&p->age);     printf("age的偏移量为：%d\n", offset);     return 0; }

user: user-3
content: 是不能访问那里的数据，这里使用 & 来取结构体某成员的地址（0时得出的刚好是偏移地址）是可以的，因为这不涉及到读写操作。

user: user-4
content: 这里没有访问地址里的内容，只是用地址来计算位置