Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 多维数组指针的问题。

回复:
user: user-1
content: 对于一维数组,  a是第一维指针  即 int[]    a+n == a[n] 对于二给数组.  a是第一维指针 int[]    a+n == a[n]       a[x]即第二维指针.  a[x] +n == a[x][n] 其它类似.

user: user-0
content: 引用 3 楼 user-2 的回复:对于后面两个不明白的，a+1并不是元素4的地址，或者说a+1并不是指向元素4；而是说a+1是int[3]的地址，或者说a+1指向的是{4, 5, 6}，能想通这一点，就明白了。 "*p或者p[0]都算是解引用" 还有 “a+1指向的是{4, 5, 6}”   解释的很透彻， 非常感谢，明白了！

user: user-2
content: 对于后面两个不明白的，a+1并不是元素4的地址，或者说a+1并不是指向元素4；而是说a+1是int[3]的地址，或者说a+1指向的是{4, 5, 6}，能想通这一点，就明白了。

user: user-2
content: 要理解这个，得有一定的抽象思考的能力。 首先第一点，没有多维数组，只有一维数组；所谓的多维，不过是一维的递归定义。 其次对于一维数组，其数组名是指向第0个元素的指针（在不够准确的上下文中），对其解引用（*p或者p[0]都算是解引用）得到第0个元素。  理解了上述两点之后，再来看： int a[2][3]={1,2,3,4,5,6}; 这里的a是一个一维数组，该数组有2个元素，元素类型为int[3]； 第0个int[3]是个一维数组，有3个元素，元素类型为int，值分别是1，2，3； 同理，第1个int[3]也是一个一维数组，值分别是4，5，6。  a[1][1] a[1]，取a的第1个元素，即第1个int[3]（记得它又是个数组）； a[1][1]，取a[1]的第1个元素，即5。  *(a[1]+1) 同上，对于一维数组，*p和p[0]是一回事，*(p + 1)和p[1]是一回事。  **（a+1） a指向数组的第0个元素，那么a + 1则指向数组的第1个元素，即第一个int[3]； *(a + 1)即对其解引用，得到第1个int[3]，它是个数组； **(a + 1)对第1个int[3]解引用，即得到第1个int[3]的第0个元素，即4。  (*(a+1))[1] 同上*(a + 1)得到第1个int[3]，然后[1]取该int[3]的第1个元素，即5。

user: user-0
content: 还是没想明白。。求解答
user-0 提问: 新手麻煩大家幫我看一下問題出在哪? 謝謝

回复:
user: user-0
content: 引用 4 楼 ForestDB 的回复:int sum, n; while (scanf("%d", &n) == 1)     sum += n; 我的功能是想要按下Enter後計算出總和。 請問要谮麼做?

user: user-1
content: int sum, n; while (scanf("%d", &n) == 1)     sum += n;

user: user-1
content: int sum, n; while (scanf("%d") == 1)     sum += n;

user: user-0
content: 引用 1 楼 ForestDB 的回复:while((c=getchar())!='\n') 进入循环的时候第一个字符被取走了 如果LZ输入 11 2 3 4 我猜会输出10  如果我的猜测是对的，说明LZ对于输入流的概念很模糊。 請問大神要如何解決此問題?

user: user-0
content: 引用 6 楼 pengzongjy 的回复:1#说的对，进入循环的时候第一个字符被取走了，计算是从T[1]开始的。所以改为这样就可以满足你的要求。#include <stdio.h>  void main() { 	int T[200] = {0}; 	int i = 0; 	int sum = 0; 	char c; 	 	printf("請輸入一連串整數可以包含空格\n"); 	do  	{ 		scanf("%d", &T[i]);  		if(T[i] != ' ') 		sum = sum + T[i];  		 		//if(c=='\n')    break; 	}while((c=getchar())!='\n'); 	printf("Sum = %d\n", sum);  }  感恩豁然開朗了

user: user-2
content: 1#说的对，进入循环的时候第一个字符被取走了，计算是从T[1]开始的。所以改为这样就可以满足你的要求。#include <stdio.h>  void main() { 	int T[200] = {0}; 	int i = 0; 	int sum = 0; 	char c; 	 	printf("請輸入一連串整數可以包含空格\n"); 	do  	{ 		scanf("%d", &T[i]);  		if(T[i] != ' ') 		sum = sum + T[i];  		 		//if(c=='\n')    break; 	}while((c=getchar())!='\n'); 	printf("Sum = %d\n", sum);  }

user: user-1
content: while((c=getchar())!='\n') 进入循环的时候第一个字符被取走了 如果LZ输入 11 2 3 4 我猜会输出10  如果我的猜测是对的，说明LZ对于输入流的概念很模糊。
user-0 提问: JAVA调用SO文件报UnsatisfiedLinkError

回复:
user: user-0
content: 引用 7 楼 ForestDB 的回复:http://wenku.baidu.com/link?url=iZW31aQI7Zr5lc9Hs5VYBf50lAP9ZKHGx6IUj_qXoQWaDXey_6Xv9_cCiMlJc5W_ubpuETYZmaX_n4ZLMsqmJADgzkQlvMF6l-OdYj43SVu  随便搜的。  https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/jniTOC.html  感谢ForestDB，已经搞定了，原因有两点： 1、JAVA和android的虚拟环境不一样 2、Linux和android的系统库文件不一样  这样导致了在Linux下通过JNI标准命名方式编译的SO文件，在android是调用失败的，原因是Linux和android的系统库不一样，而生产的SO跟生产环境库文件有依赖关系  然后搭建了NDK和Cywin环境，然后生产的SO可以被android调用，参考地址： http://zctya.blog.163.com/blog/static/1209178201181074018603/

user: user-1
content: http://wenku.baidu.com/link?url=iZW31aQI7Zr5lc9Hs5VYBf50lAP9ZKHGx6IUj_qXoQWaDXey_6Xv9_cCiMlJc5W_ubpuETYZmaX_n4ZLMsqmJADgzkQlvMF6l-OdYj43SVu  随便搜的。  https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/jniTOC.html

user: user-0
content: 引用 5 楼 ForestDB 的回复:应该不可以，搜个靠谱的吧  一个类的完整名称（包括包名），会影响到生成的native code的函数签名，而linker也是靠名字来的。 JNI的方法名命名规则是JNI通过包名，找类名，再找到方法名，然后加载运行，而你说的没有包名就找不到类名，或者不认识包名？然后就无法link，是这个意思吗？  你是否有好的文章推荐

user: user-1
content: 应该不可以，搜个靠谱的吧  一个类的完整名称（包括包名），会影响到生成的native code的函数签名，而linker也是靠名字来的。

user: user-0
content: 引用 3 楼 ForestDB 的回复:LZ贴的代码不全吧？ 没有package 为何生成的函数签名有包的样子？  你说Comm.java吗？这个我是从根据网上的操作流程自己copy上去的，因为是JAVA调用，没用包名，这个应该可以吧，不然该如何修改？

user: user-1
content: LZ贴的代码不全吧？ 没有package 为何生成的函数签名有包的样子？

user: user-0
content: @u013163178，呃，C这块也有涉及吧

user: user-2
content: java怎么发到c论坛了，是不是邀请错人啦，我不会啊
user-0 提问: 我在cmd运行wmic process get CommandLine 命令后报错

回复:
user: user-1
content: 微软的命令几乎都带/? Linux的命令几乎都带--help

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:C:\>wmic wmic:root\cli>process get CommandLine /?  属性                                    类型                    操作 ========                                ====                    ========= CommandLine                             N/A                     N/A  可用下列 GET 开关:  /VALUE                       - 返回值 /ALL(默认)                   - 返回属性的数据和元数据 /TRANSLATE:<table name>      - 通过从 <table name> 值转换输出。 /EVERY:<interval> [/REPEAT:<repeat count>] - 每(X 间隔)秒返回值，如果指定了 /REPEAT，命令会执行 <repeat count> 次数。 /FORMAT:<format specifier>   - 处理此 XML 结果的关键字/XSL 文件名。  注意: /TRANSLATE 和 /FORMAT 开关的顺序会影响输出的外观。 第一种情况: 如果 /TRANSLATE 在 /FORMAT 的前面，编排格式会跟在结果转换后面。 第二种情况: 如果 /TRANSLATE 在 /FORMAT 的后面，会直接转换格式已经编排的结果。  wmic:root\cli>exit 多谢呀

user: user-1
content: C:\>wmic wmic:root\cli>process get CommandLine /?  属性                                    类型                    操作 ========                                ====                    ========= CommandLine                             N/A                     N/A  可用下列 GET 开关:  /VALUE                       - 返回值 /ALL(默认)                   - 返回属性的数据和元数据 /TRANSLATE:<table name>      - 通过从 <table name> 值转换输出。 /EVERY:<interval> [/REPEAT:<repeat count>] - 每(X 间隔)秒返回值，如果指定了 /REPEAT，命令会执行 <repeat count> 次数。 /FORMAT:<format specifier>   - 处理此 XML 结果的关键字/XSL 文件名。  注意: /TRANSLATE 和 /FORMAT 开关的顺序会影响输出的外观。 第一种情况: 如果 /TRANSLATE 在 /FORMAT 的前面，编排格式会跟在结果转换后面。 第二种情况: 如果 /TRANSLATE 在 /FORMAT 的后面，会直接转换格式已经编排的结果。  wmic:root\cli>exit

user: user-0
content: 引用 1 楼 turingo 的回复:直接运行 wmic process get 呢？ 直接运行这个命令时可以的

user: user-2
content: 直接运行 wmic process get 呢？
user-0 提问: c语言文件格式转换问题

回复:
user: user-1
content: 引用 2 楼 huangbiao11 的回复:[quote=引用 1 楼 bjym1987 的回复:] 你都存到t2结构体里面去了，遍历还能有什么问题？  最大的问题是，不知道怎么遍历t2 这样的结构体。  struct t2 {     char user[128];     char cn[128];     char modules[128];     char pd[128];     char desc[128]; };  另一个问题是，存到t2里面的只有值，读取出来也只有值，比如文件2第一行第一节数据user=ceshi1，存到t2里面只有ceshi1这个部分，但是放到t1 里面的格式要为 n:ceshi1，不知道怎么弄。[/quote] fprintf(f,"{n:%s,p:%s,t:%s,g:1,m:->>%s}\n",t2.user,t2.pd,t2.modules,t2.cn);

user: user-1
content: {n:ceshi1,p:269,t:t2,g:1,m:->>zzz} {n:ceshi2,p:8,t:t2,g:1,m:->>bbb} {n:hehe,p:60713,t:t2,g:1,m:->>ttt} 才对吧。

user: user-2
content: 比如这里文件2转换为文件1为   这里看不出有何映射关系。

user: user-3
content: 有点想json解析的内容

user: user-0
content: 引用 1 楼 bjym1987 的回复:你都存到t2结构体里面去了，遍历还能有什么问题？  最大的问题是，不知道怎么遍历t2 这样的结构体。  struct t2 {     char user[128];     char cn[128];     char modules[128];     char pd[128];     char desc[128]; };  另一个问题是，存到t2里面的只有值，读取出来也只有值，比如文件2第一行第一节数据user=ceshi1，存到t2里面只有ceshi1这个部分，但是放到t1 里面的格式要为 n:ceshi1，不知道怎么弄。

user: user-4
content: 你都存到t2结构体里面去了，遍历还能有什么问题？
user-0 提问: 关于fopen的使用

回复:
user: user-1
content: FILE *fopen（const char *path,const char *mode); path是文件的路径加名字，mode是打开文件的模式

user: user-2
content: 跟你重新温习基础： 定义函数 FILE * fopen(const char * path,const char * mode); 函数说明 参数path字符串包含欲打开的文件路径及文件名，参数mode字符串则代表着流形态。         "1.txt" 是文件名   字符‘r’  打开只读文件，该文件必须存在

user: user-3
content: 1.txt是个文件名， 其路径是当前文件夹。  r是打开方式
user-0 提问: C语言字符串比较问题：

回复:
user: user-1
content: #include <stdio.h> #include<string.h> #define N 60 void main() { char a[N],b[N]; memset(a,'\0',N); memset(b,'\0',N); printf("请输入第一个字符串：\n"); gets(a); printf("请输入第二个字符串：\n"); gets(b); int i=0; while(a[i]==b[i]) { i++; } int n=a[i]-b[i]; printf("%d\n",n); }  你最好不要输入一样的值，不然你想打印多少，你打印的时候最好也把i的值打印出来，这样你才理解为什么输出是这样。

user: user-2

user: user-3
content: 感觉这判定条件有问题, 如果后面都是'\0' ,还是会向下进行的啊,   #include <stdio.h> #include<string.h> #define N 60 int main() {     char a[N],b[N];     memset(a,'\0',N);     memset(b,'\0',N);     printf("请输入第一个字符串：\n");     scanf("%s", a);     printf("请输入第二个字符串：\n");     scanf("%s", b);     int i = 0;     while(a[i] != '\0' && b[i] != '\0')     {         if (a[i] != b[i]) {             break;         }         i++;     }     int n=a[i]-b[i];     printf("%d\n",n);     return 0; }

user: user-4
content: #include <stdio.h> #define N 60 void main() { 	char a[N],b[N]; 	printf("请输入第一个字符串：\n"); 	gets(a); 	printf("请输入第二个字符串：\n"); 	gets(b); 	int i=0; 	while(a[i]==b[i]) 	{ 		i++; 	} 	int n=a[i]-b[i]; 	printf("a = %c  %d b = %c %d  %d\n",a[i],a[i],b[i],b[i],n); }

user: user-4
content: 输出 a[i]  b[i]
user-0 提问: 内存超限问题-数据结构多项式相加

回复:
user: user-1
content: 只有malloc，没有free。

user: user-2
content: 引用 3 楼 u013632069 的回复:[quote=引用 2 楼 hhhhhhhhhhkkkkkkkkkk 的回复:] 把你scanf里的"%d%d"改成%d,%d吧，不然你输入数字的时候会搞乱的。 谢谢提醒，但是我的题目里规定 样例输入 2 3 1 2 1 1 2 2 1 1 2 0 样例输出  3 2 2 1 2 0[/quote] 不好意思没注意到你的两个%符间已经有空格了。

user: user-3
content: 引用 4 楼 u013632069 的回复:[quote=引用 1 楼 u012061345 的回复:] 用数组试试。 或者用Java。 谢谢^-^ 很遗憾 我还没学过Java 数组的话我担心内存更大[/quote]  哪个OJ？

user: user-4
content: 引用 4 楼 u013632069 的回复:谢谢^-^ 很遗憾 我还没学过Java 数组的话我担心内存更大用汇编吧，内存损耗最小

user: user-0
content: 引用 1 楼 u012061345 的回复:用数组试试。 或者用Java。 谢谢^-^ 很遗憾 我还没学过Java 数组的话我担心内存更大

user: user-0
content: 引用 2 楼 hhhhhhhhhhkkkkkkkkkk 的回复:把你scanf里的"%d%d"改成%d,%d吧，不然你输入数字的时候会搞乱的。 谢谢提醒，但是我的题目里规定 样例输入 2 3 1 2 1 1 2 2 1 1 2 0 样例输出  3 2 2 1 2 0

user: user-3
content: 用数组试试。 或者用Java。

user: user-2
content: 把你scanf里的"%d%d"改成%d,%d吧，不然你输入数字的时候会搞乱的。
user-0 提问: epoll epollout

回复:
user: user-0
content: 引用 5 楼 mujiok2003 的回复:举两个TCP的例子   1. 有拥塞控制， 对方一直读数据， 导致接收窗口越来越小， 因此内核只能为你缓存包，当缓存耗尽， 再send就会阻塞了。  2.  网络异常， 一直没有ACK， 但是没有检测连接已经断开， 这是内核也会缓存已经发送过的数据。。。        自己晕乎了，和顺序是没关系的，因为read是被动的，但是写是主动的。所以啥时候写自己能控制。     但是在epollin中直接send 不行吗，why啥非要epoll_mod_ctrl 到epollout在写呢。     如果直接写，会有问题，why啥select ，poll这么做没问题呢，如果有问题它们怎么处理，epoll怎么处理呗，     总之，没必要加epollout啊

user: user-0
content: 期待大牛给个解释

user: user-1
content: epoll是开源的吧。

user: user-0
content: 感谢大家的回帖，大家回答了不少send的问题，不知道是我没看懂，还是没说清楚题目。 我的concern是当 sockfd在epollin 的时候会接收数据，然后epoll_mod_ctl改成epollout，这表示这个sockfd，不在是监听有无数据来了吗？ 而是作为写的socket了。 如果是这样，这不是破坏了，接收--接收--接收--发送的顺序了吗。 比如说client 发三次 send 1 发送"12345" send 1 发送"abc" send 1 发送"#\n"  server在收到\n后才反应，即server 3次recieve后才send。 如果在第一次就将epollin改为epollout，岂不是send 早了吗

user: user-2
content: 举两个TCP的例子   1. 有拥塞控制， 对方一直读数据， 导致接收窗口越来越小， 因此内核只能为你缓存包，当缓存耗尽， 再send就会阻塞了。  2.  网络异常， 一直没有ACK， 但是没有检测连接已经断开， 这是内核也会缓存已经发送过的数据。。。

user: user-1
content: 不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊！ http://bbs.csdn.net/topics/380167545

user: user-3
content: 这个跟“顺序”没有关系。 只是表示“可以无阻塞的执行写操作”，至于写操作为何会阻塞，原因相当多。

user: user-0
content: 我主要的意思是 如果顺序不是 接收--发送---接收--发送这种 而是 接收--接收---接收---发送 怎么办。 切换到epollout但是仍然是接收，怎么办。  send 失败，可以用<0，异常判断，和我这个问题，没关系吧

user: user-4
content: 假如这个socket的缓冲一直是满的，因为某些原因，这个socket的数据一直无法发送出去，所以它不能清空自己的缓冲。这个时候你直接send会有什么后果？只能是使得这个send阻塞了。这里epollout就有用了。它可以避免你乱来。  为什么你觉得服务器端send操作就一定可以成功？
user-0 提问: 为什么执行这个程序的时候会出错

回复:
user: user-1
content: 引用 7 楼 qq_21327741 的回复:我只是想问为什么换了逻辑与程序就不出错了 逻辑与会短路求值。  A && B，当A为false时， 不再执行B

user: user-2
content: 引用 7 楼 qq_21327741 的回复:我只是想问为什么换了逻辑与程序就不出错了 逻辑&&运算，是采用短路运算的方法。与运算要两个同时为真时结果才为真，当有第一个为假时，结果肯定是假，所以就不会再计算第二个。这种方法叫短路运算。

user: user-3
content: 引用 7 楼 qq_21327741 的回复:我只是想问为什么换了逻辑与程序就不出错了 if(a && b){} a如果是false，直接跳过if语句，不会执行b。  flag=((a!=0)&&(5/a==1)); a!=0 这句返回false，&&之后的(5/a==1)就不会执行了，所以程序没问题。  ((a!=0)&(5/a==1)) 按位与运算，执行完a!=0后再执行5/a==1，执行5/a 时CPU就引发除0硬件异常。

user: user-0
content: 我只是想问为什么换了逻辑与程序就不出错了

user: user-4
content: 先把 5/0 改正了再说吧 & 是按位与的意思。&&是 关系运算中的与

user: user-5
content: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  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-0
content: &在逻辑运算中有按位与的意思，并不一定是引用啊

user: user-6
content: 5/a 除数不能为零

user: user-7
content: 据我理解，&&代表的是与运算。而&代表是引用。具体引用的概念 直接百度就可以了解了

user: user-8
content: 你理解了&和&&的区别么？
user-0 提问: 我该怎么学习C语言，希望大家给我帮帮我！

回复:
user: user-1
content: primer 牛掰烘烘的啊

user: user-1
content: 貌似楼主想学的是C，不是C++吧

user: user-2
content: http://blog.csdn.net/u012421456/article/details/40681247 剋以先看看别人的方法等，要善于利用搜索

user: user-3
content: 先下载Win-TC，然后参考C:\Win-TC\tcstudy.chm

user: user-3
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-4
content: 其实对于初学者，读经典还是有点难度的，虽然谭浩强的C不是很好，但是入门足够了。

user: user-5
content: 多学少问，多搜索，少发提问，当网上没有的时候再问。百度，Google是你的好帮手。加油吧，我们一起努力，我也是初学者。

user: user-6
content: 引用3 楼 u013163178 的回复+1

user: user-6
content: 引用三楼,,+1

user: user-7
content: c语言程序设计 （k&R）->C和指针 平台：Linux gcc/gdb/vim             Win     vs2012

user: user-8
content: 引用 3 楼 u013163178 的回复:c primer plus吧，我觉得这本书不错啊+1

user: user-9
content: 慢慢来不激动

user: user-10
content: c primer plus吧，我觉得这本书不错啊

user: user-11
content: 边看书，边写程序（不会写时，先对照教材敲，然后看懂，然后自己关上课本再写）。

user: user-1
content: 先学完课本或者看完一本书再说吧
user-0 提问: 一个关于指针、struct结构体的问题，下面的程序为什么是这样的输出

回复:
user: user-1
content: 引用 楼主 twlhxy02 的回复:#include "stdafx.h" #include <stdio.h>   typedef struct sData {     static const char* text;     static int  val_a;     static int  val_b; } sData, *Self_Ptr;   typedef struct  {     char* text;     int val_a;     int val_b; }* Other_Ptr;     const char* sData::text = "this is a test string\0"; int   sData::val_b = 200; int   sData::val_a = 100;   int main(int argc, char* argv[]) {     Self_Ptr p_self = (Self_Ptr)&(sData::text);     Other_Ptr p_other = (Other_Ptr)&(sData::text);     printf("%d\n", sizeof(sData));                          //----1, static成员不计入sizeof ///==================================================这里想不通为什么是这样     printf("val_a: %d-%d\n", p_self->val_a, sData::val_a);  //----val_a: 100-100     printf("val_b: %d-%d\n", p_self->val_b, sData::val_b);  //----val_b: 200-200     printf("val_a: %d-%d\n", p_self->val_a, p_other->val_a);//----val_a: 100-200     printf("val_b: %d-%d\n", p_self->val_b, p_other->val_b);//----val_b: 200-100 ///===================================================     return 0; } 在一些编译器，比如gcc、vc，static变量跟初始化顺序有关，你先初始化sData::text，再初始化sData::val_b，最后初始化sData::val_a，导致内存布局是先text，再val_b，最后val_a；你再用Other_Ptr内存布局去解析它，Other_Ptr的val_a、val_b和sData的val_a、val_b正好相反。你把sData::val_b和sData::val_a的顺序换一下输出就对了。

user: user-2
content: 理由是   p_self和p_other都是指向sData::text的地址

user: user-0
content: 能不能截个图，我在devc++中编译的结果是 1 val_a: 100-100 val_b: 200-200 val_a: 100-200 val_b: 200-100 请按任意键继续. . .

user: user-2
content: 我的     结果是 100-100 200-200 100-100 200-200

user: user-3
content: 这是一个c++程序，：：是作用域运算符
user-0 提问: 数据结构题，求思路

回复:
user: user-1
content: 题目说两个栈是相同的吗？如果相同 A全部出栈，顺序入栈B，交换头指针

user: user-2
content: 估计题目不太严密。

user: user-3
content: 是可以的，你可以交换两个栈顶 的值啊

user: user-0
content: 引用 3 楼 FENGQIYUNRAN 的回复:在将数据从栈A弹出，压到栈B中时，对A 中的数据+3，+1，-1，-3操作可以吗 题目：这些数据也是在原来的栈A中

user: user-4
content: 在将数据从栈A弹出，压到栈B中时，对A 中的数据+3，+1，-1，-3操作可以吗

user: user-0
content: 引用 1 楼 user-5 的回复:你把栈和队列性质搞反了  栈是先进后出，队列先进先出不是吗？ 求这道题思路

user: user-5
content: 你把栈和队列性质搞反了
user-0 提问: 【关于整数转化为二进制问题求解】

回复:
user: user-1
content: 把0 到2^N-1的数的二进制 打印出来就好了了吧 每个数的打印， 可以 用位移1<<n取到该bit的数字，然后打印出来 比如 x && (1<<m)  就可以取到第m个bit

user: user-2
content: /*************************************************************************     > File Name: print_bit.c     > Author: Jukay     > Mail: hellojukay@gmail.com      > Created Time: 2014年11月08日 星期六 13时40分49秒  ************************************************************************/  #include<stdio.h> void print_bit(unsigned int a) { 	if(a >> 1) 		print_bit( a>>1); 	printf("%d",a&1); }  int main() { 	unsigned int a; 	scanf("%u",&a); 	print_bit(a); 	return 0; }
user-0 提问: 急。求高人指教错在哪里（指针）

回复:
user: user-1
content: 楼主可以搜函数指针

user: user-1
content: #include <stdio.h> #include <stdlib.h>  double fac(int n) { 	double p = 1; 	int m; 	for(m = 1;m <=n;m++ ) 	{ 		p = p * m; 	} 	 	return p; }  int main()//什么情况？  { 	double n,(*p)(),(*pn)(int); //	p = fac;  //参数不匹配  	pn = fac;  	n = fac(5); 	 	printf("%g\n",n); //	printf("%g\n",p(6)); 	printf("%g\n",pn(7)); 	system("pause"); 	return 0; }

user: user-2
content: 别急着找错。先把代码组织好，注释、问题都写好再问吧
user-0 提问: 哪位大神能帮小弟解释解释指针吗？感激不尽

回复:
user: user-0
content: 谢谢，又理解了一点，我多看看多理解理解吧

user: user-1
content: 看有帮助没——http://blog.csdn.net/u012421456/article/details/20296865

user: user-2
content: 我也是初学。个人理解：指针本质上是一个无符号整型变量。最大值和系统寻址空间相当。变量用于保存一个逻辑地址。这个地址与某个类型的对象的地址相同。指针用于保存某个类型的对象的地址，并可间接访问该对象。
user-0 提问: 将8位的灰阶jpg图像转换为灰度图

回复:
user: user-1
content: http://www.baidu.com/s?wd=rgb%E8%BD%AC%E7%81%B0%E5%BA%A6%E5%85%AC%E5%BC%8F&rsv_spt=1&issp=1&f=3&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_sug3=2&rsv_sug=0&rsv_sug1=2&rsv_sug4=46&oq=%E7%81%B0%E5%BA%A6%E5%85%AC%E5%BC%8F&rsp=0&rsv_sug2=1&rsv_sug5=0&inputT=7282

user: user-2
content: 没听说过JPG可以存成8位的，bmp 有1位，8位，16位，24位，32位。  一般JPG解码出来 可以是RGB，或者是YUV，就算是灰度图保存成JPG，出来的颜色还是会有RGB或者YUV的通道的。  对于本来就是保存成JPG的灰度图，要重新转回来，简单的说就是解码成RGB, 再取R 或者G或者B通道即可，或者重新用19595, 38469, 7472 这个比例来合成灰度图。

user: user-3
content: 以24位图像为例，遍历每个像素点： gray = (red + green + blue) / 3; red = gray; green = gray; blue = gray;

user: user-4
content: opencv

user: user-5
content: 既然大家都说是opencv，那我回个opencv

user: user-6
content: opencv

user: user-0
content: 引用 1 楼 u012061345 的回复:opencv 好的 我去找找看

user: user-0
content: 引用 2 楼 turingo 的回复:以24位图像为例，遍历每个像素点： gray = (red + green + blue) / 3; red = gray; green = gray; blue = gray; 8位的JPG哪来的RGB数据呀？
user-0 提问: 关于c primer plus中二维数组的一个问题..

回复:
user: user-1
content: 数组名本来就是指针,是你没有理解清楚 zippo是int[4][2]的指针,也就是zippo的元素的长度为2*sizeof(int),数组长度为4 zippo[0]是int[2]的指针,同理元素长度为sizeof(int),数组长度为2 指针运算 pointer p ; int k ; p[k]等效于*(p+k)等效于*(pointer) ((int)p+k*sizeof(pointer)) 也就是说 设zippo = 1的话 则zippo + 1 = 9 typedef int name[2] ; 那么zippo[0] = *(name) ((int) zippo + 0 * sizeof(name)) 因为name是个数组所以*(name)求的是第一个元素的地址,所以zippo[0]=1 zippo[0] + 1 = 5 因此编译器在意的指针的类型其实就是指针指向对象的长度 因为在编译之后数组的长度是不进行检查的,也就是使用时会丢失长度的信息 所以int[4][2]才会被看成int**,但是这的确是两种不同的指针 int[4][2]元素长度为2*sizeof(int) int**元素长度为sizeof(int *)

user: user-0
content: 引用 1 楼 yuzhoufengjiu 的回复:取得首地址没变，步长变了 引用 2 楼 shenangell 的回复:[quote=引用 楼主 ikuovbs 的回复:] 我明白zippo=&zippo[0],并且zippo[0]存放的是&zippo[0][0]的地址..... 我不明白的也是这里....为什么zippo(&zippo[0])的地址会跟&zippo[0][0]的地址相同.. 按道理来说..zippo(&zippo[0])的地址不应该是0x0064fd38 而zippo[0]的值才是0x0064fd38的吗? 数组名是第一行的地址，也是第一行第一个元素的地址 zippo==&zippo[0]==&zippo[0][0] 第二行的地址等于第二行第一个元素的地址    &zippo[1]==&zippo[1][0]  一个数组占用一块连续的内存单元，包含若干元素，每个数组元素都在内存中占用存储单元，他们都有相应的地址，每个数组元素按其类型不同占有几个连续的内存单元，一个数组元素的地址就是它所占的内存单元的首地址。 错勿骂，对勿赞。[/quote]  你说得很对~~..昨晚我也尝试了一个代码就是.. int a[3]...这个数组中的a的地址与&a的地址是相同的.. 所以可以得出 zippo==&zippo==&zippo[0]==&zippo[0][0],其中把zippo[0]看成是一个数组名,所以前面加还是没加地址运算符&都是一样,都是代表数组中第一个元素的地址..最后可以得出zippo[0]=&zippo[0](其中得把zippo[0]看成是一个数组名..),最后可以得出 &zippo[0]==&zippo[0][0.. 我把数组名跟指针变量混淆了..我以为数组名会跟指针变量一样...分配一个另外的内存地址来存储其数组中第一个元素的地址...

user: user-2
content: zippo+1==&zippo[0]+1 zippo[0]+1==&zippo[0][0]+1

user: user-2
content: 引用 楼主 ikuovbs 的回复:我明白zippo=&zippo[0],并且zippo[0]存放的是&zippo[0][0]的地址..... 我不明白的也是这里....为什么zippo(&zippo[0])的地址会跟&zippo[0][0]的地址相同.. 按道理来说..zippo(&zippo[0])的地址不应该是0x0064fd38 而zippo[0]的值才是0x0064fd38的吗? 数组名是第一行的地址，也是第一行第一个元素的地址 zippo==&zippo[0]==&zippo[0][0] 第二行的地址等于第二行第一个元素的地址    &zippo[1]==&zippo[1][0]  一个数组占用一块连续的内存单元，包含若干元素，每个数组元素都在内存中占用存储单元，他们都有相应的地址，每个数组元素按其类型不同占有几个连续的内存单元，一个数组元素的地址就是它所占的内存单元的首地址。 错勿骂，对勿赞。

user: user-3
content: 取得首地址没变，步长变了
user-0 提问: LINUX下C的编程

回复:
user: user-1
content: 只有这个，肯定不是封装。 粗陋的说：Linux是以C语言写成的，而C语言在语法上并不直接支持面向对象中的“封装”。 所以在C语言中，单一的语法现象很难说成是为了封装。

user: user-2
content: 不用指针，用个毛线C哦

user: user-3
content: C只有指针这种高级货色。

user: user-4
content: lz, 你最好for example

user: user-5
content: 表示没看明白。哎，大概我太菜了吧

user: user-0
content: 参数为指针，那传递的就是函数入口啊（当被调用的是函数的时候，不过在L下这样的情况很多嘛）。传递地址，直接调用函数，这体现的是不是封装的思想嘛，我就是问这个额。

user: user-6
content: 不太明白你说的，指针做参数有多种好处，最大的好处就是减少复制，提高效率
user-0 提问: Linux semop函数报错

回复:
user: user-0
content: 引用 2 楼 user-1 的回复:blog.csdn.net/guoping16/article/details/6584058好好看看把。  你给的这个链接，给我看什么？我的问题semop错误，链接说的是共享内存的函数。

user: user-1
content: blog.csdn.net/guoping16/article/details/6584058好好看看把。

user: user-0
content: 二了，还没有把代码复制上去就回车了！  #include <string.h> #include <stdio.h> #include <sys/types.h> #include <sys/ipc.h> #include <errno.h> #include <sys/sem.h> #include <sys/shm.h> #include <unistd.h> #include <stdlib.h>  #define SHM_SIZE 1024  union semun { 	int val; 	struct semid *buf; 	unsigned short *array; };  int wait_sem(int semId, int Index);   int main(void) { 	int semId, shmId; 	char *shmaddr; 	char write_str[SHM_SIZE] = {0}; 	key_t shkey, semkey; 	union semun semopts; 	struct sembuf serSemBuf = {0, -1, IPC_NOWAIT};  	if ((shkey = ftok(".", 'm')) == -1) { 		perror("write sh ftok failed!\n");  		return -1; 	}  	if ((shmId = shmget(shkey, SHM_SIZE, IPC_CREAT | 			0666)) == -1) { 		perror("write shmget failed!\n");  		return -1; 	}  	if ((shmaddr = shmat(shmId, (char *)0, 0)) ==  			(char *)-1) { 		perror("write shmat failed!\n");  		return -1; 	} 	 	if ((semkey = ftok(".", 's')) == -1 ) { 		perror("write sem ftok failed!\n");  		return -1; 	} 	 	if ((semId = semget(semkey, 1, IPC_CREAT | 0666)) == -1) { 		perror("write semget failed!\n");  		return -1; 	} 	 	semopts.val = 1; 	if (semctl(semId, 0, SETVAL, semopts) == -1) { 		perror("write semctl failed!\n");  		return -1; 	}  	while (1) { 		wait_sem(semId, 0); 		serSemBuf.sem_num = 0;		 		serSemBuf.sem_op = -1; 		serSemBuf.sem_flg = IPC_NOWAIT; 		if (semop(semId, &serSemBuf, 1) == -1) { 			perror("write semop_p failed!\n");  			return -1; 		} 		 		printf("write : "); 		fgets(write_str, SHM_SIZE, stdin); 		write_str[SHM_SIZE] = 0; 		strcpy(shmaddr, write_str); 		sleep(3);  		 		serSemBuf.sem_num = 0; 		serSemBuf.sem_op = 1; 		serSemBuf.sem_flg = IPC_NOWAIT; 		 		if (semop(semId, &serSemBuf, 1) == -1) { 			perror("Write semop_v failed!\n");  			return -1; 		} 		 		sleep(3); 	}  	return 0; }   int wait_sem(int semId, int Index)  { 	while (semctl(semId, Index, GETVAL, 0) == 0) { 		sleep(1); 	}  	return 1; }
user-0 提问: 求助T_T

回复:
user: user-1
content: 看看你的code::blocks里面带了编译器没有，我曾经遇到没带编译器的。

user: user-0
content: 是codeblocks不能用，程序写上后点编译没反应，按网上说的，我把mingw下下来了啊，呜呜呜，怎么回事

user: user-2
content: CodeBlocks使用简略教程
user-0 提问: C语言

回复:
user: user-1
content: C Character Constants  A “character constant” is formed by enclosing a single character from the representable character set within single quotation marks (' '). Character constants are used to represent characters in the execution character set.  Syntax  character-constant :  'c-char-sequence' L'c-char-sequence'  c-char-sequence :  c-char c-char-sequence c-char  c-char :  Any member of the source character set except the single quotation mark ('), backslash (\), or newline character  escape-sequence  escape-sequence :  simple-escape-sequence octal-escape-sequence hexadecimal-escape-sequence  simple-escape-sequence : one of  \a  \b  \f  \n  \r  \t  \v \'  \"  \\  \?   octal-escape-sequence :  \ octal-digit \ octal-digit octal-digit \ octal-digit octal-digit octal-digit  hexadecimal-escape-sequence :  \x hexadecimal-digit hexadecimal-escape-sequence hexadecimal-digit

user: user-2
content: 表示空值，一般作用字符串的结束标记。

user: user-3
content: 一般是修改一段字符之后或者组建字符，然后在末尾+个\0来表示字符串已经结束。

user: user-4
content: 将第i个元素置0。

user: user-5
content: 字符串结束符号，等价与 char  ch=0

user: user-6
content: 字符串结束符

user: user-7
content: 字符串结尾~

user: user-8
content: 引用 2 楼 luotuo44 的回复:在C语言里面，有字符数组和字符串两个概念。 在一个字符数组里面，假如有一个元素的值为'\0'，我们就认为该字符数组存储的是一个字符串。一般地，我们把 以'\0'结束的多个字符称为字符串，比如"abcdefg\0"就是一个字符串 +1  引用 3 楼 u012421456 的回复:C语言中字符串结尾 http://blog.csdn.net/u012421456/article/details/38645335 +2

user: user-9
content: C语言中字符串结尾 http://blog.csdn.net/u012421456/article/details/38645335

user: user-10
content: 在C语言里面，有字符数组和字符串两个概念。 在一个字符数组里面，假如有一个元素的值为'\0'，我们就认为该字符数组存储的是一个字符串。一般地，我们把 以'\0'结束的多个字符称为字符串，比如"abcdefg\0"就是一个字符串

user: user-11
content: 字符串结束符
user-0 提问: C语言反斜杠转义字符问题

回复:
user: user-1
content: C Character Constants  A “character constant” is formed by enclosing a single character from the representable character set within single quotation marks (' '). Character constants are used to represent characters in the execution character set.  Syntax  character-constant :  'c-char-sequence' L'c-char-sequence'  c-char-sequence :  c-char c-char-sequence c-char  c-char :  Any member of the source character set except the single quotation mark ('), backslash (\), or newline character  escape-sequence  escape-sequence :  simple-escape-sequence octal-escape-sequence hexadecimal-escape-sequence  simple-escape-sequence : one of  \a  \b  \f  \n  \r  \t  \v \'  \"  \\  \?   octal-escape-sequence :  \ octal-digit \ octal-digit octal-digit \ octal-digit octal-digit octal-digit  hexadecimal-escape-sequence :  \x hexadecimal-digit hexadecimal-escape-sequence hexadecimal-digit

user: user-2
content: 或者另外编一个程序，读取这个源代码进行修改； 或者用文本编辑器，查找替换。

user: user-2
content: 如果路径名是通过系统调用获取的，根本不存在这个问题。 路径名里只有单'\'，肯定是从键盘敲进去的。所以想改的话，从键盘改。

user: user-3
content: 读取的不会有问题，手动敲你就敲“\\”不就可以了

user: user-4
content: 源码当中的这种字符串常量，在编译的时候就已经按照语法格式转换掉了，无法还原。  除非你是从键盘输入或者从文件读入，那时候寻找 \替换成 \\就行了。

user: user-5
content: a[100]="C:\abc\def\ge.txt" 这样写会有警告的 会找不到 \a   \d  \g 自动忽略  \  而不会存储到数组里。
user-0 提问: 为何数组名的地址和给数组名求地址得到的地址结果是一样的啊

回复:
user: user-1
content: 樓上又複製粘貼混分

user: user-2
content: 引用 10 楼 SXJIAKE 的回复:樓上又複製粘貼混分 闲着也是闲着，活动活动手指。

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

user: user-3
content: a的首地址，a指针的地址。表示的字节数不一样，操作的时候操作的字节数也不一样

user: user-4
content: a和&a在数值上都一样，但表示的意义不一样。a表示的是首元素地址，而&a表示的这片内存区域首地址。两者的区别之一是a+1和&a+1的结果不一样（计算时的步长不一样）。

user: user-5
content: 地址内容一样，指向的含义不同。  a指向的是其第0个元素，即a[0]。 而&a指向的是a，即int[2]。

user: user-6
content: 《c专家编程》

user: user-7
content: 那就是语义上的差别，不是值上的差别了。 《C和指针》 8章专门讲了数组和指针的各种关系，一定要认真读。

user: user-8
content: 引用 1 楼 u013163178 的回复:数值一样而已，含义不一眼，各自+1再比较你几知道有什么区别了。 ++

user: user-9
content: 坐等赵老师回复

user: user-6
content: 数值一样而已，含义不一眼，各自+1再比较你几知道有什么区别了。
user-0 提问: 关于scanf 输入问题

回复:
user: user-1
content: 引用 4 楼 yuzhoufengjiu 的回复:[quote=引用 2 楼 u013163178 的回复:] 搞错了  if(state == 32) 改成  if(tmp == 32) 这貌似没有用呀..我在最后输入的23后面加了几个空格，敲了回车，结果没有结束输入.... .[/quote] 最多按两次空格

user: user-2
content: 在输入的最后加空格，getchar()读的是空格，因此不能结束。 从你的输入看，无法区别结尾的空格与输入之间的空格，你这个方法行不通。

user: user-0
content: 引用 2 楼 u013163178 的回复:搞错了  if(state == 32) 改成  if(tmp == 32) 这貌似没有用呀..我在最后输入的23后面加了几个空格，敲了回车，结果没有结束输入.... .

user: user-3
content: 引用 1 楼 u013163178 的回复:/*************************************************************************     > File Name: b.c     > Author: Jukay     > Mail: hellojukay@gmail.com      > Created Time: 2014年11月08日 星期六 17时36分06秒  ************************************************************************/ #include<stdio.h> int main() { 	int state =  1; 	int tmp; 	int i; 	while(state) 	{ 		scanf("%d",&tmp); 		--state; 		tmp = getchar(); 		if(state == 32) 			++state; 	} 	return 0; }用32代替 '  ' 真的好吗，这是一个好习惯吗？你确定别人一眼就能看懂？

user: user-1
content: 搞错了  if(state == 32) 改成  if(tmp == 32)

user: user-1
content: /*************************************************************************     > File Name: b.c     > Author: Jukay     > Mail: hellojukay@gmail.com      > Created Time: 2014年11月08日 星期六 17时36分06秒  ************************************************************************/ #include<stdio.h> int main() { 	int state =  1; 	int tmp; 	int i; 	while(state) 	{ 		scanf("%d",&tmp); 		--state; 		tmp = getchar(); 		if(state == 32) 			++state; 	} 	return 0; }
user-0 提问: 程序调试正常，但运行会出错，评分系统评测为段错误，求解问题何在

回复:
user: user-1
content: Windows：崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。  Linux：进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’ 使用命令 gdb 运行程序名 core或core.数字 进入gdb然后使用bt命令 可以查看进程意外退出前函数调用的堆栈，内容为从上到下列出对应从里层到外层的函数调用历史。 如果进程意外退出不产生core文件，参考“ulimit -c core文件最大块大小”命令

user: user-2
content: 段错误基本就是访问了不该访问的内存。 从这方面去查查先。

user: user-3
content: 一大段代码, 可能大家都没多少时间却仔细看. 我学得最快的解决办法还是下断点去调试你的程序.
user-0 提问: C语言的指针类型

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

user: user-2
content: P+1不同啊

user: user-3
content: 指针指向的对象类型，方便你取数据的时候取的字节数，例如你的指针指向的是int 类型，操作数据的话，系统知道是按照（4字节或2字节）根据不同编译器来操作。

user: user-4
content: 指针的类型，可以指定所指向数据的字节数，也就是，内存中该指针地址所占的位数

user: user-5
content: 指针太灵活了，光想是没用的，多看看其他优秀代码，自己写代码

user: user-6
content: 如果p是个指针，那么它所指对象类型决定了p + 1指向哪个地方。

user: user-7
content: 建议去看看 《C与指针》 这本书中所讲的指针和数据类型这章。

user: user-8

user: user-0
content: 诶，是我提问没说清楚，我是说，指针的类型和指针本身的地址有任何关系没，如果没有，那指定指针的类型除了指出所指对象的类型外，还有啥用?

user: user-9
content: 不知从何说起了  怎么会没有关系呢。 它保存的数值  是它指向的对象的地址啊。

user: user-10
content: int*  =   ( int* ) void*
user-0 提问: 散分了，新手的简单问题

回复:
user: user-1
content: 引用 4 楼 husion01 的回复:大虾，能否解释下。特別是p的值是怎么算的？谢谢 这里的TEST_VALUE和str是一样的字符串，所以strlen(TEST_VALUE)就是str的长度。str+strlen(TEST_VALUE)得到str的结束符'\0'所在的位置，再加1就到了str之外的未知区域了。 最好是自己调试一下，单步运行，看看各个变量的值及其变化。或者像这样把他们都打出来看看。         const char* str = "abcd_abcdefg_abcde"; p = (char*)(str+strlen(TEST_VALUE)+1); printf("%p\n", str); printf("%p\n", p); printf("%d\n", strlen(TEST_VALUE));  // 字符串的长度 printf("%d\n", p - str); // 字符串长度+1 printf("%d", *(p-1)); // 0 printf("%d", *p); // 这个是什么就不一定了

user: user-0
content: 大虾，能否解释下。特別是p的值是怎么算的？谢谢

user: user-1
content: p被指到了str后面紧跟着的位置，没人知道编译器在这里保存了什么东西，所以nVa和result_value的内容都是不确定的。 比如：        #define TEST_VALUE  "abcd_abcdefg_abcde" int main() { char nVa[8],*p; signed int result_value ;         const char* str = "abcd_abcdefg_abcde"; p = (char*)(str+strlen(TEST_VALUE)+1); memset(nVa,0,8); strncpy(nVa,p,4); p+=5; result_value = atoi(nVa); printf("123456789 = %d\n", result_value); return 0; } 我运行的结果是输出：123456789 = 1234 换个编译器也许就是不同的结果。把printf里面字符串的内容改一下也可以得到不同的结果。

user: user-2
content: 没错，就是0 #include<stdio.h> #include<string.h> #define TEST_VALUE  "abcd_abcdefg_abcde" int main(){   char nVa[8],*p;   signed int result_value ;    const char* str = "abcd_abcdefg_abcde";   p = (char*)(str+strlen(TEST_VALUE)+1);   memset(nVa,0,8);   strncpy(nVa,p,4);    p+=5;   result_value = atoi(nVa);   printf("%d",result);   return 0; }

user: user-3
content: 0
user-0 提问: 把一般的条件表达式转成逻辑或者位运算表达式

回复:
user: user-1
content: 搜“卡诺图”

user: user-2
content: 有个技术叫真值表  还有个技术，在设计数字电路时会用，用来简化逻辑或者等价转化逻辑

user: user-0
content: 谢谢各位，我只是想知道这些表达式是如何用位运算实现的，麻烦一楼能否说下思路呢？

user: user-3
content: 1、这样转换没有任何好处，典型的弃明投暗； 2、qq=(*line=="")?1:0的用法是错误，字符串比较应该用strcmp函数。  引用 楼主 zhengfengzhengfeng 的回复:如题，比如说： flag=flag？0：1 可以转换为flag=（！flag）&& 1  然后下面的几个式子怎么转呢： len=（len>BUFSIZE）?len:BUFSIZE  qq=(*line=="")?1:0

user: user-2
content: qq=(*line=="")?1:0 // “”用错了吧？ 这里的?:是多余的 qq = (*line == '')即可

user: user-2
content: 有这必要么？ :?不是很清晰么？

user: user-4
content: 第一个unsigned int tmp; tmp = ((len - BUFSIZE)>>(sizeof(int) - 1))&1; len = (tmp - 1)*len + tmp *BUFSIZE; 第二个 qq= (*line=="")^(*line=="");
user-0 提问: 关于mex.h文件

回复:
user: user-0
content: 两个ip之间 用网线连接

user: user-0
content: 就是，mex格式是固定的  #include "mex.h" void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {  /*问题在这里：比如给定两个0.0.0.0和0.0.0.1ip地址，怎么通过函数让他们实现连接。*/ }

user: user-1
content: 楼主的问题好抽象啊！
user-0 提问: 关于LINUX下C编程思想的问题

回复:
user: user-1
content: 1W C 熟悉Linux平台的化，没什么问题的

user: user-2
content: 可以看看linux下的源码。偶也觉得有困难，看看别人写的就有个方向

user: user-0
content: 敲了4个列子，看了一整天的书，感觉开始来了。感谢各位的热心帮助。

user: user-3
content: 如何用C来设计，来组织代码，看一下比较好的大型开源项目就会有点感觉了，linux源代码和Gnome等等

user: user-4
content: 多写代码，写多了就会有感觉。

user: user-0
content: 我感觉在WIN下C的编程主要思考的是过程。而现在在L下编程，似乎一下子就没了方向感

user: user-5
content: 解决相同的问题，在 windows 和 Linux 下思路应该基本相同吧，代码不同

user: user-6
content: 那说明你仍然不会使用api编程，建议开发点实用工具练手

user: user-7
content: LZ对于windows下的编程有何感觉？

user: user-8
content: 你就当成是windows下，思路没有区别。只不过一开始你不适应。 慢慢的你就发现他们对c编程基本没有什么影响
user-0 提问: 面试被鄙视了。面试题共享

回复:
user: user-1
content: 第一题转2进制我认为是一个int就用4个字节，把它的二进制copy过去就是了，不过要注意区分字节序，可能要在前面增加一个字节来表示自己封装的字节序。  第二题，，，，需要转换吗？ascII的字符在所有编码下都是一样的。。。

user: user-2
content: 20分钟好有压力

user: user-0
content: 引用 5 楼 ForestDB 的回复:int readInt(int * data,char*buffer) *data = ntohl(*((int *)buffer));  int writeInt(int data,char*buffer) data = htonl(data); memcpy(buffer, &data, sizeof (int));  int readIntText(int * data,char*buffer) *data = atoi(buffer);  int writeIntText(int data,char*buffer) sprintf(buffer, "%d", data);  int版本的主要看大／小端，text版本的无所谓大小端。  第二题用iconv库。 一看到题就想自己动手，原来还可以这样简单

user: user-0
content: 引用 3 楼 mujiok2003 的回复:引用实现两个字节字符串（unicode）与一个字节字符串（Ascii）互相转换。  怀疑是ansi， 不是Ascii.  应该是的，当时一看题紧张了，后面记错了吧

user: user-3
content: int readInt(int * data,char*buffer) *data = ntohl(*((int *)buffer));  int writeInt(int data,char*buffer) data = htonl(data); memcpy(buffer, &data, sizeof (int));  int readIntText(int * data,char*buffer) *data = atoi(buffer);  int writeIntText(int data,char*buffer) sprintf(buffer, "%d", data);  int版本的主要看大／小端，text版本的无所谓大小端。  第二题用iconv库。

user: user-4
content: 不建议面试的时候测试 这样的，实际没有多大的意义。

user: user-5
content: 引用实现两个字节字符串（unicode）与一个字节字符串（Ascii）互相转换。  怀疑是ansi， 不是Ascii.

user: user-5
content: 趁着有时间写了第一题  #include <stdio.h> #include <time.h> #include <stdlib.h>  int readInt(int& data, char*buffer) { 	int cnt = 0; 	while(*buffer){ 		 ++cnt; 		 ++buffer; 	} 	int x = ++cnt; 	data = 0; 	for(--buffer,--cnt; cnt; --buffer, --cnt) 	{ 		(unsigned int&)data <<= 8; 		(unsigned int&)data |= (unsigned char)*buffer; 	} 	return x; }  int writeInt(int data,char*buffer) {    int cnt = 0;    while(data){    	 *buffer++ = (unsigned int&)data & 0xff;    	(unsigned int&) data >>= 8;    	 ++cnt;    }    *buffer = 0;    return ++cnt; }  int readIntText(int data,char*buffer) { 	int cnt = 0; 	while(*buffer){ 		 ++cnt; 		 ++buffer; 	} 	int x = ++cnt; 	data = 0; 	for(--buffer,--cnt; cnt; --buffer, --cnt) 	{ 		(unsigned int&)data <<= 8; 		(unsigned int&)data |= *buffer - '0'; 	} 	return x; } int writeIntText(int data,char*buffer) {    int cnt = 0;    while(data){    	 *buffer++ = (unsigned int&)data & 0xff - '0';    	(unsigned int&) data >>= 8;    	 ++cnt;    }    *buffer = 0;    return ++cnt; }  int main() { 	char buf[128]; 	srand((unsigned)time(0)); 	int x = rand(), y = rand(), z = rand(); 	printf("%x %x %x\n", x, y, z); 	int off = writeInt(x, buf);     off += writeInt(y, buf+off);     off += writeInt(z, buf+off); 	off = readInt(x, buf); 	off += readInt(y, buf + off); 	off += readInt(z, buf + off); 	printf("%x %x %x\n", x, y,z); 	 	off = writeIntText(x, buf);     off += writeIntText(y, buf+off);     off += writeIntText(z, buf+off); 	off = readIntText(x, buf); 	off += readIntText(y, buf + off); 	off += readIntText(z, buf + off); 	printf("%x %x %x\n", x, y,z); 	return 0; }

user: user-6
content: 第一题显然考的是字节序问题，整数的传输是需要考虑字节序的，字符串的传输则不用考虑。写入时先转换为网络字节序，然后memcpy即可；读取时先memcpy，然后转换为本地字节序即可。 第二题，题目没看懂。
user-0 提问: c 中main()的参数问题

回复:
user: user-0
content: 引用 8 楼 wangzuxi 的回复:[quote=引用 6 楼 leohouzizero 的回复:] #include <stdio.h> int main(int argc,char *agrv[]) { 	int count;  	printf("The commmand line has %d arguments: \n", argc-1);  	for(count=1;count < argc; count++) 		printf("%d: %s\n",count, argv[count]); 	printf("\n");  	return 0;  }  这是一个书上的例子，关于命令行什么的，不太懂 在VC++6.0 中，编译就出错了 你好好看看agrv和argv是一样吗[/quote]   谢谢，粗心了 最近在看关于C中 文件输入与输出方面的东西，初学，头晕，不太懂啊

user: user-1
content: 引用 6 楼 leohouzizero 的回复:#include <stdio.h> int main(int argc,char *agrv[]) { 	int count;  	printf("The commmand line has %d arguments: \n", argc-1);  	for(count=1;count < argc; count++) 		printf("%d: %s\n",count, argv[count]); 	printf("\n");  	return 0;  }  这是一个书上的例子，关于命令行什么的，不太懂 在VC++6.0 中，编译就出错了 你好好看看agrv和argv是一样吗

user: user-2
content: 把编译器提示的错误拿出来看看.  程序代码看以没有什么错的.    还有就是VC6.0这个IDE也是可能有问题的, 你没有安装正版的话.

user: user-0
content: #include <stdio.h> int main(int argc,char *agrv[]) { 	int count;  	printf("The commmand line has %d arguments: \n", argc-1);  	for(count=1;count < argc; count++) 		printf("%d: %s\n",count, argv[count]); 	printf("\n");  	return 0;  }  这是一个书上的例子，关于命令行什么的，不太懂 在VC++6.0 中，编译就出错了

user: user-0
content: 我的就是   int main（int argc, char *argv[ ]） 然后就提示错误

user: user-3
content: int main(nt argc, char *argv[], char *envp[])

user: user-4
content: int main(int argc, char *argv[]) //or int main(int argc, char **argv)

user: user-5
content: int main(int argc,char ** argv)

user: user-6
content: 未定义的标识符，把你的代码发上来。估计是你拼错了。
user-0 提问: 高人求解！！

回复:
user: user-1
content: [a]$ cat a #define DefC(element) EBOOL element##_Present DefC(abc) [a]$ cpp a # 1 "a" # 1 "<built-in>" # 1 "<command-line>" # 1 "a"  EBOOL abc##_Present

user: user-2
content: ##是连接拼接符号，其他自己理解

user: user-3
content: 宏定义  例如 DefC(girl)； 预处理之后就是 EBOOL girl_Present;
user-0 提问: 高人求解！！

回复:
user: user-1
content: #define中##用来连接字符串的

user: user-2
content: 自己展开看一下就知道了呀！  /home/user-2$ cat a.c  #define DefC(element) EBOOL element##_Present DefC(ipv4); DefC(ipv6);   /home/user-2$ gcc -E a.c  # 1 "a.c" # 1 "<built-in>" # 1 "<command-line>" # 1 "a.c"   EBOOL ipv4_Present; EBOOL ipv6_Present;
user-0 提问: 高人求解！！

回复:
user: user-1
content: 和#运算符一样，##运算符可以用于类函数宏的替换部分。另外，##还可以用于类对象宏的替换部分。这个运算符把两个语言符号组成当个语言符号。例如，可以定义如下宏： #define XNAME (n) x ## n 这样，下面调用: XNAME (4) 会展开成下列形式: x4 写个程序熟悉下 #include<stdio.h> #define XNAME (n) x ##n #define PRINT_XN (n) printf("x" #n " = %d\n",x ## n); int main() {   int XNAME (1) = 14;   int XNAME (2) = 20;   PRINT_XN (1);   PRINT_XN (2);   return 0; }  综上所述，楼上正解。

user: user-2
content: defc（1）；等于 ebool 1_present；

user: user-3
content: LZ你狠，相同的问题发了三遍（可能有以上）。
user-0 提问: 一道ACM题，老是超时，不知道该如何优化算法了。

回复:
user: user-1
content: while(getchar() != '\n'); 对于acm来说，这句属于多余。

user: user-0
content: 引用 7 楼 FancyMouse 的回复:while(getchar() != '\n'); 估计测试数据最后一行没有\n，然后你程序死循环了我用c++重写了，但是提示wrong answer。 题目要求最后一组数据后无空行，在IDE里面debug的时候最后一组输出后面无空行，但是我在dos下重定向输出到一个文本中，最后一组后面却有两个空行=。=肿么办。 代码如下： #include <iostream>  using namespace std;  int main() {     int i = 1;     int a, b;      cin >> a >> b;     while(1)     {         if(0 != a && 0 != b)         {             int temp1 = a, temp2 = b, gcd, lcm;             if(temp1 < temp2)             {                 gcd = temp1;                 temp1 = temp2;                 temp2 = gcd;             }             int t;             while(0 != temp1 % temp2)             {                 t = temp1 % temp2;                 temp1 = temp2;                 temp2 = t;             }             lcm = a * b / temp2;             cout << "Case " << i << ":" << endl;             cout << "GCD(" << a << "," << b << ")" << " = "<< temp2 << endl;             cout << "LCM(" << a << "," << b << ")" << " = "<< lcm;             if(cin >> a >> b)                 cout << endl << endl;             else                 break;         }         else if(0 == a && b != 0)         {             cout << "Case " << i << ":" << endl;             cout << "GCD(" << a << "," << b << ")" << " = " << b << endl;             cout << "no LCM";             if(cin >> a >> b)                 cout << endl << endl;             else                 break;         }         else if(0 == b && a != 0)         {             cout << "Case " << i << ":" << endl;             cout << "GCD(" << a << "," << b << ")" << " = " << a << endl;             cout << "no LCM";             if(cin >> a >> b)                 cout << endl << endl;             else                 break;         }         else         {             cout << "Case " << i << ":" << endl;             cout << "no GCD\n";             cout << "no LCM";             if(cin >> a >> b)                 cout << endl << endl;             else                 break;         }          i++;     }     return 0; }

user: user-2
content: while(getchar() != '\n'); 估计测试数据最后一行没有\n，然后你程序死循环了

user: user-3
content: 辗转相除法比更项减损法要好

user: user-4
content: 蛮力干——辗转相除——《高等代数》

user: user-5
content: 辗转相除法，看2楼

user: user-0
content: 引用 1 楼 user-7 的回复:晕, 这还递归..不递归也会超时啊。

user: user-6
content: 给你代码，自己再改改  int gcd(int a, int b) {   int t;   while (0 != a % b)   {     t = b;     b = a % b;     a = t;   }    return b; }  int lcm(int a, int b) {   return a / gcd(a,b) * b; }

user: user-7
content: 晕, 这还递归..
user-0 提问: 这代码哪里有问题

回复:
user: user-1
content: if(x>=10 && x<20);  //这里的分号

user: user-2
content: 引用 3 楼 u012421456 的回复:[quote=引用 2 楼 x000000xd 的回复:] 如果要使用system("pause");的话，前面还得加上  #include<stdlib.h> 这个头文件吧 有的编译器是自带了，所以不需要[/quote] 不需要不是因为自带，是因为system可能被包含在了其他的头文件中

user: user-3
content: 引用 2 楼 x000000xd 的回复:如果要使用system("pause");的话，前面还得加上  #include<stdlib.h> 这个头文件吧 有的编译器是自带了，所以不需要

user: user-4
content: 如果要使用system("pause");的话，前面还得加上  #include<stdlib.h> 这个头文件吧

user: user-5
content: if(x>=10 && x<20);  //这里的分号  输出结果最好用换行符或者一些说明区分开
user-0 提问: 用C语言怎么加超大整数？？？

回复:
user: user-1
content: #include <stdio.h> #include <string.h> #define MAXLEN 1000 char a1[MAXLEN]; char a2[MAXLEN]; static int v1[MAXLEN]; static int v2[MAXLEN]; static int v3[MAXLEN]; int i,j,n,L,z; void main(void) {     scanf("%d",&n);     for (j=0;j<n;j++) {         scanf("%s%s",a1,a2);          L=strlen(a1);         for (i=0;i<L;i++) v1[i]=a1[L-1-i]-'0';          L=strlen(a2);         for (i=0;i<L;i++) v2[i]=a2[L-1-i]-'0';          for (i=0;i<MAXLEN;i++) v3[i]=v1[i]+v2[i];          for (i=0;i<MAXLEN;i++) {             if (v3[i]>=10) {                 v3[i+1]+=v3[i]/10;                 v3[i]=v3[i]%10;             }         }          printf("Case %d:\n", j+1);         printf("%s + %s = ", a1, a2);          z=0;         for (i=MAXLEN-1;i>=0;i--) {             if (z==0) {                 if (v3[i]!=0) {                     printf("%d",v3[i]);                     z=1;                 }             } else {                 printf("%d",v3[i]);             }         }         if (z==0) printf("0");          printf("\n");     } } //Sample Input //3 //0 0 //1 2 //112233445566778899 998877665544332211 // //Sample Output //Case 1: //0 + 0 = 0 //Case 2: //1 + 2 = 3 //Case 3: //112233445566778899 + 998877665544332211 = 1111111111111111110
user-0 提问: 写入文件的数据为什么乱码？

回复:
user: user-1
content: fopen的参数的意义要好好理解

user: user-0
content: 好人啊，昨天晚上一晚上都没有做出来。结果看来基础还是没有打牢固

user: user-2
content: fwrite是以二进制的方式想写入文件的，你看到的当然是乱码了

user: user-3
content: 还有两处 小修改  #include<stdio.h> #include<stdlib.h>  #define N 2  int main(void ) {     FILE    *fp;     int     i, j;      struct student {         char        name[30];         float       score[3];     };      struct student  s1[N], s2[N];      for (j = 0; j < N; j++) {         printf("the %dth student name=", j + 1);          scanf("%s", &s1[j].name);          printf("input the three score=");          for (i = 0; i < 3; i++) {             /* 修改 */             scanf("%f", &s1[j].score[i]);          }     }      /* 修改 */     if ((fp = fopen("file.dat", "w+b")) == NULL) {         printf("file open error\n");         exit(0);     }     j = sizeof(struct student);      for (i = 0; i < N; i++) {          if (fwrite(&s1[i], j, 1, fp) != 1) {             printf("file write error\n");             exit(0);         }     }      fflush(fp);     printf("file successful\n");      rewind(fp);      printf("begin to read\n");      for (i = 0; i < N; i++) {         fread(&s2[i], j, 1, fp);          /* 修改 */         printf("%s,%f,%f,%f\n", s2[i].name, s2[i].score[0], s2[i].score[1], s2[i].score[2]);     }     fclose(fp);  }

user: user-3
content: 楼主在Windows下吗？ if((fp=fopen("file.dat","w"))==NULL)  改为 if((fp=fopen("file.dat","w+b"))==NULL)

user: user-4
content: 文件打开有文本和二进制两种模式

user: user-5
content: 不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,fread,fwrite,fgetc,fclose  //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……
user-0 提问: segmentation fault

回复:
user: user-1
content: char * str = "ABCDEF"; 因为你用的是  常量区 内存 不可以修改

user: user-2
content: p++; // 改成 p--     q++;

user: user-2
content: char * str = "ABCDEF";  // 这是常量字符串，它的内容不允许修改的 改成char str[] = "ABCDEF";

user: user-0
content: 果真是这样啊

user: user-3
content: 看看我这个 /*************************************************************************     > File Name: reverse.c     > Author: Jukay     > Mail: hellojukay@gmail.com      > Created Time: 2014年11月07日 星期五 08时38分20秒  ************************************************************************/  #include<stdio.h> #include<string.h>  void swap(char *, char *); void reverse(char *str) {     int i = 0, j = strlen(str) - 1;     for(; i <( j/2) ; ++i) 	swap(&str[i], &str[j-i]); }  void swap(char *a , char *b) {     char tmp;     tmp = *a;     *a = *b;     *b = tmp; }  int main() {     char str[] = "hello world";     reverse(str);     printf("%s",str);     return 0; }

user: user-3
content: 常量，不能修改，也就不能倒序
user-0 提问: 求二值图像中不规则图形的重心！

回复:
user: user-1
content: 你好，楼主问题有进展了吗？

user: user-2
content: http://blog.csdn.net/z397164725/article/details/8426109  求中心距。 平均的那种是中心，不一定是重心。

user: user-0
content: 引用 1 楼 user-3 的回复:首先得把图形挖出来， 大概方法 1. 取到第一个黑点， 然后把和它联通的区域都找出来  然后把这些点的坐标 加起来 取平均， 多谢 ，抠出来不是问题，我已经做好了，黑色点的像素坐标我也得到了，主要就是不知道怎么计算重心，直接相加求平均就可以么？

user: user-3
content: 首先得把图形挖出来， 大概方法 1. 取到第一个黑点， 然后把和它联通的区域都找出来  然后把这些点的坐标 加起来 取平均，
user-0 提问: 有大神能帮忙吗，老师让作的实验，关于线性表！！！！

回复:
user: user-1
content: 这个数据结构的教科书都有的，只是伪代码

user: user-2
content: 引用 1 楼 user-6 的回复:绝不向伸手党妥协！ 第一次听说有这个党

user: user-3
content: 这个还是自己想下, 这是最基本的动手能力, 大学一定要学这个, 不然以后肯定会后悔的

user: user-3
content: 我c语言学的很不好  感觉是定义两个数组,然后根据条件, 自己求出a交b a并b 和a-b(感觉用a- a交b号点)  我就能想到这么多

user: user-4
content: 这么简单的问题还用自己设计算法？STL有现成的： #include <algorithm> 将输入数据存到数组中 先将集合排序：sort(beg,end) 并集：set_union(beg1,end1,beg2,end2,destBeg) 交集：set_intersection(beg1,end1,beg2,end2,destBeg) 差集：set_difference(beg1,end1,beg2,end2,destBeg)

user: user-5
content: 百度一下，大题思路是说了没用

user: user-6
content: 绝不向伸手党妥协！