Question: 求解几道题数据结构

1.D A B 2.C C C 3.错 4.B 5.C 6.O（n） O（1） 7.c 8.52 9.2的i-1次方 （n+1）/2 （n-1）/2 10.D 11.N/2 12.O（n） O（log2（n）） O（n的0.5次方）

引用 5 楼 a156435646 的回复:第5题还会选A。。。。我选的是C看错了，A是线性链表，选C

谢谢楼上的。。我是由于大一没学习，现在大四补考。。特地从公司回去补考的。。。自己做的有些题目跟书上不一样。。。不知道还有木有童靴再提供一份自己做的呢？

全是数据结构的题 1,2目前都是行优先存储，没啥意思，不答！ 3，错，二叉树不是树的特殊形式。它倒是很像有序树^_^ 4.B 5.C,循环，非空单链表 6.O（n）,O(n),因为顺序表需要移动后面的数据，最好是删除最后一个元素O(1),最坏删除第一个元素，移动n-1个元素,O(n);同理链表需要查找第i个数据，最好是删除第一个O(1),最坏删除最后一个O(n)。所以二者故都是O(n) 7.D，要考虑f-r为负值的情况，所以需要+n进行正数调整 8.9个，这个要区分子串和子序列；子串是空串或者主串中连续的一段字符（至少一个）,子字符序列则不一定是主串中连续的字符。不知道题目什么目的。如果确切是求子串：则9个，分别是t, tu, tut, tuti, tutio, tution, ti, tio, tion，如果是子序列，则2^5(不用单独考虑第二t了) 9,2^(n-1),分别是1,2， 4， 8， 16.。。。 (n+1)/2个叶子，(n-1)/2个分支，注意是满二叉树。只有叶子和度2的结点。n0=n2+1;2n2+1=n即可推出 10.套公式，2000开平方，向上取整，45 11.树的深度log2N向上取整或者log2(n+1)向下取整 12，O(n), O(log2n),O(n开方)  over！

还是多听赵老师的，毕竟大牛啊

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

7.我觉得还是选c 9.叶子比非终端永远多一个（对于满二叉树），当然你写的相减也是对的，你可以试试我的应该也对。 11.个人觉得应该和9的第二问差不多，如果非要公式化 我偏向你的写法。

up。。先谢谢楼上几位的回答，不过，还想看下其他人的看法

第7题选C吗？我选的是D。。(r-f+n) mod n 第9题 10 11我的答案是

第5题还会选A。。。。我选的是C

4、B 5、A 其他的不知道，没学过数据结构，就学C语言时涉及链表的知识

UP，加分了，以表诚意，分虽少，但是希望大家可以把自己答案写上去。。

1，(1) D

UP,在线等。。。。  以上是 我在书本上做的跟参考答案不同的题目，希望大家做下，看下我的答案是否是跟大家一样


Question: 求证：输出字母位置

要使用逻辑连接词来连接。C语言不能直接识别你的数学表达。。 'a'<=m&&m<='z'

引用 4 楼 buyong 的回复:if('a'<=m<='z')  编译能通过么？ 'a'<=m<='z'是合法表达式？ 能,只是达不到目的而已; 该表达式本身是合法的. 值为     ('a' <= m  ) <= 'z'    ==> true==>1; 'a'<= m 非 0即1 0 <'z' 1<'z' 所以 ('a' <= m  ) <= 'z'   为1 所以'a'<=m<='z' 为1  C 用int 当作bool 使用. C++虽然有bool ,不过C的方式,依然可用.

if('a'<=m<='z')；显然这样写不行啊，得m>=a&&m<=z，这样写

不要用数学的区间不等式

if('a'<=m<='z')-----> if('a'<=m&&m<='z')


Question: [swu ]求解啊！输入25竟然是yes!!!!!!!!!!!!!!!!!!!!!!

错误的根源在于第15行的break

多看看这代码，你必须要知道你自己写代码的真正的含义，自己用拿笔在纸上执行一次试试看

不用改，是对的

oh on!!!我只是个新手 能把改过的代码贴出来吗？

如果i==5不就输出yes了吗

引用 3 楼 u012271055 的回复:引用 2 楼 Adol1111 的回复:[quote=引用 1 楼 mcmay 的回复:] 不好意思，恕我眼拙，没看出有什么问题。比如，你输入25，当i = 2时，j%i != 0，然后就打印yes，然后就break;跳出for循环了。你输入4或者其他2的倍数，你试试看，应该会打印no。+1 +1[/quote] 再+1

看代码，不是一个循环，因为break是在第一次不论打印yes或者no都会退出的。 另外，25 % 2也不是0，所以，打印“yes"也是代码逻辑的结果。

不用break  它会执行很多次 怎么会这样？

for循环里的break完全破坏了循环啊，不管如何都只能指向一次啊

这段代码，看着太不舒服了。 for循环完全不需要（进去做个判断就break出来的循环有存在的必要么？） 如果去掉循环，那么输入25打印yes不是很明了的结果么？

引用 2 楼 Adol1111 的回复:引用 1 楼 mcmay 的回复:不好意思，恕我眼拙，没看出有什么问题。比如，你输入25，当i = 2时，j%i != 0，然后就打印yes，然后就break;跳出for循环了。你输入4或者其他2的倍数，你试试看，应该会打印no。+1 +1


Question: 好吧……调试的时候说已停止工作是什么情况= =

引用 5 楼 user-1 的回复:题目中说要用从n1的形式输出，你可以用 for(k = 0; k < l; k++)     printf("%d    ",  odd[k+1]);的形式即可。  嗯……但是输出结果还是和上面两个运行框一样

用变量定义数组的大小是在C99标准下可以接受的，你找个兼容C99标准的编译器试试，或者打开编译器的C99支持开关（如果有这项设置的话）。

引用 1 楼 user-1 的回复:请不要用图片上传代码，不方便这里的网友们帮你测试。你先试试将所有循环中的 x = 1; x <=N （这里x代表你所定义的变量），换成x = 0; x < N。如果你用x = 1的形式，数组的第一个元素即ar[0]（这里的ar代表你所定义的数组名称）就被忽略掉了，而用x <= N的形式，则又超过了数组下表的最大值，是越界了。一个数组，例如，ar[6]，其元素个数为6，其元素下标的范围为0~5。另外，不明白，你为什么要在声明数组时用n[N+1]，odd[N+1]和even[N+1]的形式呢？那个+1起什么作用？是怕后面的x<=N造成数组下标越界吗？也许这个办法可以解决这个问题，但始终数组的第一个元素，即ar[0]由于你在for循环中用了x=1这样的表达式而被跳过去了，即ar[0]是未被赋值的，它的值是不确定的，你的程序也许会在运行时因此而崩溃。  #include <stdio.h> int main() { 	int i,j,N,k,m,l,temp,a; 	k=1; 	j=1; 	printf("请输入数字个数N（小于20）="); 	scanf("%d",&N); 	printf("N=%d\n",N); 	int n[N+1]; 	int odd[N+1]; 	int even[N+1]; 	for(i=1;i<=N;i++) 	{ 		printf("n[%d]=",i); 		scanf("%d",&n[i]); 	} 	for(i=1;i<=N;i++) 	{ 		if(n[i]%2==0) 		{ 			even[j]=n[i]; 		    j++; 		} 		else 		{ 			odd[k]=n[i]; 		    k++; 		} 		m=j; 		l=k; 	} 	for(a=1;a<=m;a++) 	{ 		for(j=1;j<=m;j++) 		{ 			if(even[j]<even[j+1]) 			temp=even[j]; 			even[j]=even[j+1]; 			even[j+1]=temp; 		} 	} 	for(a=1;a<=l;a++) 	{ 		for(k=1;k<=l;k++) 		{ 			if(odd[k]>odd[k+1]) 			temp=odd[k]; 			odd[k]=odd[k+1]; 			odd[k+1]=temp; 		} 	} 	printf("odd="); 	for(k=1;k<=l;k++) 	{ 		printf("%d  ",odd[k]); 	} 	printf("\n"); 	printf("even="); 	for(j=1;j<=m;j++) 	{ 		printf("%d  ",even[j]); 	} return 0; }    谢谢大神……我稍微修改了一下可以执行…… 但是运算结果是错的…………我也不知道错哪里了……麻烦大神帮忙看一下……  这个是按照=0 <N的方式改过后的结果   这个是我原来的测试结果……  = = 我那个+1是为了防止越界的……还有数组定义似乎是不能用变量的……我在VS2013里输入一遍似乎是说int [N+1],或者int [N]这种形式是错的……不知道为什么在C-FREE 5中可以使用   老师要求是输出结果和题目完全一致……由于题目中第一个是n[1]……所以我只能想办法跳过n[0]了


Question: sleep引起内存泄漏？

线程不是用来频繁创建和销毁的；是用来在线程池中用的。 //循环向a函数每次发送200个字节长度（这个是固定的）的buffer, //a函数中需要将循环传进来的buffer，组成240字节（也是固定的）的新buffer进行处理， //在处理的时候每次从新buffer中取两个字节打印 #ifdef WIN32     #pragma warning(disable:4996) #endif #include <stdio.h> #include <stdlib.h> #include <string.h> #ifdef WIN32     #include <windows.h>     #include <process.h>     #include <io.h>     #define  MYVOID             void     #define  vsnprintf          _vsnprintf #else     #include <unistd.h>     #include <sys/time.h>     #include <pthread.h>     #define  CRITICAL_SECTION   pthread_mutex_t     #define  MYVOID             void * #endif //Log{ #define MAXLOGSIZE 20000000 #define MAXLINSIZE 16000 #include <time.h> #include <sys/timeb.h> #include <stdarg.h> char logfilename1[]="MyLog1.log"; char logfilename2[]="MyLog2.log"; static char logstr[MAXLINSIZE+1]; char datestr[16]; char timestr[16]; char mss[4]; CRITICAL_SECTION cs_log; FILE *flog; #ifdef WIN32 void Lock(CRITICAL_SECTION *l) {     EnterCriticalSection(l); } void Unlock(CRITICAL_SECTION *l) {     LeaveCriticalSection(l); } void sleep_ms(int ms) {     Sleep(ms); } #else void Lock(CRITICAL_SECTION *l) {     pthread_mutex_lock(l); } void Unlock(CRITICAL_SECTION *l) {     pthread_mutex_unlock(l); } void sleep_ms(int ms) {     usleep(ms*1000); } #endif void LogV(const char *pszFmt,va_list argp) {     struct tm *now;     struct timeb tb;      if (NULL==pszFmt||0==pszFmt[0]) return;     vsnprintf(logstr,MAXLINSIZE,pszFmt,argp);     ftime(&tb);     now=localtime(&tb.time);     sprintf(datestr,"%04d-%02d-%02d",now->tm_year+1900,now->tm_mon+1,now->tm_mday);     sprintf(timestr,"%02d:%02d:%02d",now->tm_hour     ,now->tm_min  ,now->tm_sec );     sprintf(mss,"%03d",tb.millitm);     printf("%s %s.%s %s",datestr,timestr,mss,logstr);     flog=fopen(logfilename1,"a");     if (NULL!=flog) {         fprintf(flog,"%s %s.%s %s",datestr,timestr,mss,logstr);         if (ftell(flog)>MAXLOGSIZE) {             fclose(flog);             if (rename(logfilename1,logfilename2)) {                 remove(logfilename2);                 rename(logfilename1,logfilename2);             }         } else {             fclose(flog);         }     } } void Log(const char *pszFmt,...) {     va_list argp;      Lock(&cs_log);     va_start(argp,pszFmt);     LogV(pszFmt,argp);     va_end(argp);     Unlock(&cs_log); } //Log} #define ASIZE    200 #define BSIZE    240 #define CSIZE      2 char Abuf[ASIZE]; char Cbuf[CSIZE]; CRITICAL_SECTION cs_HEX ; CRITICAL_SECTION cs_BBB ; struct FIFO_BUFFER {     int  head;     int  tail;     int  size;     char data[BSIZE]; } BBB; int No_Loop=0; void HexDump(int cn,char *buf,int len) {     int i,j,k;     char binstr[80];      Lock(&cs_HEX);     for (i=0;i<len;i++) {         if (0==(i%16)) {             sprintf(binstr,"%03d %04x -",cn,i);             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         } else if (15==(i%16)) {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);             sprintf(binstr,"%s  ",binstr);             for (j=i-15;j<=i;j++) {                 sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');             }             Log("%s\n",binstr);         } else {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         }     }     if (0!=(i%16)) {         k=16-(i%16);         for (j=0;j<k;j++) {             sprintf(binstr,"%s   ",binstr);         }         sprintf(binstr,"%s  ",binstr);         k=16-k;         for (j=i-k;j<i;j++) {             sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');         }         Log("%s\n",binstr);     }     Unlock(&cs_HEX); } int GetFromRBuf(int cn,CRITICAL_SECTION *cs,FIFO_BUFFER *fbuf,char *buf,int len) {     int lent,len1,len2;      lent=0;     Lock(cs);     if (fbuf->size>=len) {         lent=len;         if (fbuf->head+lent>BSIZE) {             len1=BSIZE-fbuf->head;             memcpy(buf     ,fbuf->data+fbuf->head,len1);             len2=lent-len1;             memcpy(buf+len1,fbuf->data           ,len2);             fbuf->head=len2;         } else {             memcpy(buf     ,fbuf->data+fbuf->head,lent);             fbuf->head+=lent;         }         fbuf->size-=lent;     }     Unlock(cs);     return lent; } MYVOID thdB(void *pcn) {     char        *recv_buf;     int          recv_nbytes;     int          cn;     int          wc;     int          pb;      cn=(int)pcn;     Log("%03d thdB              thread begin...\n",cn);     while (1) {         sleep_ms(10);         recv_buf=(char *)Cbuf;         recv_nbytes=CSIZE;         wc=0;         while (1) {             pb=GetFromRBuf(cn,&cs_BBB,&BBB,recv_buf,recv_nbytes);             if (pb) {                 Log("%03d recv %d bytes\n",cn,pb);                 HexDump(cn,recv_buf,pb);                 sleep_ms(1);             } else {                 sleep_ms(1000);             }             if (No_Loop) break;//             wc++;             if (wc>3600) Log("%03d %d==wc>3600!\n",cn,wc);         }         if (No_Loop) break;//     } #ifndef WIN32     pthread_exit(NULL); #endif } int PutToRBuf(int cn,CRITICAL_SECTION *cs,FIFO_BUFFER *fbuf,char *buf,int len) {     int lent,len1,len2;      Lock(cs);     lent=len;     if (fbuf->size+lent>BSIZE) {         lent=BSIZE-fbuf->size;     }     if (fbuf->tail+lent>BSIZE) {         len1=BSIZE-fbuf->tail;         memcpy(fbuf->data+fbuf->tail,buf     ,len1);         len2=lent-len1;         memcpy(fbuf->data           ,buf+len1,len2);         fbuf->tail=len2;     } else {         memcpy(fbuf->data+fbuf->tail,buf     ,lent);         fbuf->tail+=lent;     }     fbuf->size+=lent;     Unlock(cs);     return lent; } MYVOID thdA(void *pcn) {     char        *send_buf;     int          send_nbytes;     int          cn;     int          wc;     int           a;     int          pa;      cn=(int)pcn;     Log("%03d thdA              thread begin...\n",cn);     a=0;     while (1) {         sleep_ms(100);         memset(Abuf,a,ASIZE);         a=(a+1)%256;         if (16==a) {No_Loop=1;break;}//去掉这句可以让程序一直循环直到按Ctrl+C或Ctrl+Break或当前目录下存在文件No_Loop         send_buf=(char *)Abuf;         send_nbytes=ASIZE;         Log("%03d sending %d bytes\n",cn,send_nbytes);         HexDump(cn,send_buf,send_nbytes);         wc=0;         while (1) {             pa=PutToRBuf(cn,&cs_BBB,&BBB,send_buf,send_nbytes);             Log("%03d sent %d bytes\n",cn,pa);             HexDump(cn,send_buf,pa);             send_buf+=pa;             send_nbytes-=pa;             if (send_nbytes<=0) break;//             sleep_ms(1000);             if (No_Loop) break;//             wc++;             if (wc>3600) Log("%03d %d==wc>3600!\n",cn,wc);         }         if (No_Loop) break;//     } #ifndef WIN32     pthread_exit(NULL); #endif } int main() { #ifdef WIN32     InitializeCriticalSection(&cs_log);     InitializeCriticalSection(&cs_HEX );     InitializeCriticalSection(&cs_BBB ); #else     pthread_t threads[2];     int threadsN;     int rc;     pthread_mutex_init(&cs_log,NULL);     pthread_mutex_init(&cs_HEX,NULL);     pthread_mutex_init(&cs_BBB,NULL); #endif     Log("Start===========================================================\n");      BBB.head=0;     BBB.tail=0;     BBB.size=0;  #ifdef WIN32     _beginthread((void(__cdecl *)(void *))thdA,0,(void *)1);     _beginthread((void(__cdecl *)(void *))thdB,0,(void *)2); #else     threadsN=0;     rc=pthread_create(&(threads[threadsN++]),NULL,thdA,(void *)1);if (rc) Log("%d=pthread_create %d error!\n",rc,threadsN-1);     rc=pthread_create(&(threads[threadsN++]),NULL,thdB,(void *)2);if (rc) Log("%d=pthread_create %d error!\n",rc,threadsN-1); #endif      if (!access("No_Loop",0)) {         remove("No_Loop");         if (!access("No_Loop",0)) {             No_Loop=1;         }     }     while (1) {         sleep_ms(1000);         if (No_Loop) break;//         if (!access("No_Loop",0)) {             No_Loop=1;         }     }     sleep_ms(3000);     Log("End=============================================================\n"); #ifdef WIN32     DeleteCriticalSection(&cs_BBB );     DeleteCriticalSection(&cs_HEX );     DeleteCriticalSection(&cs_log); #else     pthread_mutex_destroy(&cs_BBB);     pthread_mutex_destroy(&cs_HEX);     pthread_mutex_destroy(&cs_log); #endif     return 0; }

sleep为什么一定要放到子函数里去,  直接放到while循环里不行么

引用 14 楼 u011828085 的回复:[quote=引用 13 楼 jerry_dqh 的回复:] sleep使用，在多线程的时候注意进程间锁，互斥的问题，正常情况不会带来内存的泄漏。 以前倒是使用出过问题，那就是在两个锁之间使用了sleep。你最简化你的代码，看看是否有问题。  最简化了，还是这个问题。 fd设备是源源不断有数据出来的，会不会是sleep那3秒期间，缓冲区多了很多未读数据，导致内存增加？[/quote] 你看看是不是无限增加呢？或者是你只是把文件内容读取到了内存中导致了内存增加呢？排除法啊大哥，一点点的排除才能找到问题所在、

引用 13 楼 jerry_dqh 的回复:sleep使用，在多线程的时候注意进程间锁，互斥的问题，正常情况不会带来内存的泄漏。 以前倒是使用出过问题，那就是在两个锁之间使用了sleep。你最简化你的代码，看看是否有问题。  最简化了，还是这个问题。 fd设备是源源不断有数据出来的，会不会是sleep那3秒期间，缓冲区多了很多未读数据，导致内存增加？

受教了，但未能解惑

有没有内存问题不是通过看程序是否崩溃来决定的。  进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’ 使用命令 gdb 运行程序名 core或core.数字 进入gdb然后使用bt命令 可以查看进程意外退出前函数调用的堆栈，内容为从上到下列出对应从里层到外层的函数调用历史。 如果进程意外退出不产生core文件，参考“ulimit -c core文件最大块大小”命令  检查是否资源泄漏的办法之一： 在任务管理器 进程 查看 选择列 里面选择：内存使用、虚拟内存大小、句柄数、线程数、USER对象、GDI对象 让你的程序(进程)不退出,循环执行主流程很多遍，越多越好，比如1000000次甚至无限循环，记录以上各数值，再隔至少一小时，越长越好，比如一个月，再记录以上各数值。如果以上两组数值的差较大或随时间流逝不断增加，则铁定有对应资源的资源泄漏！

引用 19 楼 zhao4zhong1 的回复:只要你仿照我上面代码中的方法使用线程，就不会发生你问的问题。  您的代码我会慢慢参考，但我还是想问一下，我的问题出在哪里？

引用19楼赵老师 有没有讲述多线程编程的文章和帖子啊 要写的比较好的。

只要你仿照我上面代码中的方法使用线程，就不会发生你问的问题。

引用 17 楼 zhao4zhong1 的回复:线程不是用来频繁创建和销毁的；是用来在线程池中用的。  我的程序里只是创建了一个线程，没有频繁创建啊。您的这大段代码看得我云里雾里的，能不能直白一点，不是很懂您想说明什么。

while循环一直调用func1函数，而func1函数由于sleep而不运行，不能返回无法释放占有的空间，因此占用的空间越来越多

引用 8 楼 u011828085 的回复:[quote=引用 7 楼 jerry_dqh 的回复:] 看个几分钟，看看是否一直在增长，你的代码是不是就是这样简单的，还是原来复杂现在做了一个简化让大家看的。  是一直在增长，40几秒增长8k。代码fun1有简化，“……”是处理读出来的设备字节流的语句，我注释掉之后问题一样，应该跟那个没有关系。  sleep不能这样用的吗，在线程函数里[/quote] sleep使用，在多线程的时候注意进程间锁，互斥的问题，正常情况不会带来内存的泄漏。 以前倒是使用出过问题，那就是在两个锁之间使用了sleep。你最简化你的代码，看看是否有问题。

sleep方法不推荐使用，可用wait。 Wait()是等待别人释放资源 Sleep()是自己占用资源，去做等待～

sleep函数绝对不会导致内存泄漏。 我的多线程程序，在需要一直运行的线程的循环中，都会加上sleep(1)，否则cpu利用率会100%的。

引用 5 楼 u011828085 的回复:[quote=引用 2 楼 u012271055 的回复:] sleep()函数功能你知道么？  一知半解，新手求详解[/quote] Thread.Sleep（） 函数来使线程挂起一段时间。单位ms。 #include <windows.h> #include<stdio.h> int main() { int a; a=1000; printf("你"); Sleep(a);/* VC 使用Sleep*/ printf("好"); /*输出“你”和“好”之间会间隔一千毫秒，即间隔一秒，sleep()的单位为毫秒*/ return 0; }

呃，看不明白....

引用 7 楼 jerry_dqh 的回复:看个几分钟，看看是否一直在增长，你的代码是不是就是这样简单的，还是原来复杂现在做了一个简化让大家看的。  是一直在增长，40几秒增长8k。代码fun1有简化，“……”是处理读出来的设备字节流的语句，我注释掉之后问题一样，应该跟那个没有关系。  sleep不能这样用的吗，在线程函数里

引用 3 楼 sd530842780 的回复:肯定是由于sleep暴露了你代码的缺陷吧。。。  帮忙看看这段代码还有其它什么缺陷吗，新手不是很懂里面的利害关系。谢谢了！

引用 2 楼 u012271055 的回复:sleep()函数功能你知道么？  一知半解，新手求详解


Question: 为什么这个程序运行后，就弹出窗口“程序已停止运行”

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

3# 最后一个输出应该是p/n吧！非常有用，谢谢大神们了！

引用 楼主 u014619754 的回复:**************************************************************** 我想用这个程序求任意两个数的最大公约数，和最小公倍数，求大神指教，勿喷 ********************************************************************  #include <stdio.h> int main() { 	int m,n,t,r,p; 	printf("请输入任意两个整数： "); 	scanf("m=%d,n=%d\n",&m,&n);  	if(m<n) 	{	t=m;m=n;n=t;  } 	p=m*n; 	while(n!=0) 	{r=m%n; 	 m=n; 	 n=r; 	} 	printf("最大公约数为:%d\n",n); 	printf("最小公倍数为:%d\n",p/n);     return 0; } 首先，这个scanf("m=%d,n=%d\n",&m,&n); 不是一种恰当的写法，恰当的写法当中最简单的是scanf("%d%d", &m, &n); 然后，你那个while循环的运算，最终导致n = 0，然后最后的那句printf("最小公倍数为:%d\n",p/n);就会成为除数为零的情况。 下面的代码测试可知： #include <stdio.h> int main() { int m,n,t,r,p; printf("请输入任意两个整数： "); scanf("%d%d",&m,&n); printf("m = %d, n = %d\n", m, n); if(m<n) { t=m;m=n;n=t;  } p=m*n; printf("m = %d, n = %d\n", m, n); while(n!=0) {r=m%n;  m=n;  n=r;  printf("w: m = %d, n = %d, r = %d\n", m, n, r); } printf("最大公约数为:%d\n",n); printf("最小公倍数为:%d\n",p/n);     return 0; } 测试结果： 请输入任意两个整数： 3 5 m = 3, n = 5 m = 5, n = 3 w: m = 3, n = 2, r = 2 w: m = 2, n = 1, r = 1 w: m = 1, n = 0, r = 0 最大公约数为:0  修改了一下，包括写代码的格式都改了： #include <stdio.h>  int main(void) {     int m, n, t, r, p, q;  //这里多加个q表示最小公倍数      printf("请输入任意两个整数： ");     scanf("%d%d",&m,&n);  //scanf修正     if(m<n)     {         t=m;         m=n;         n=t;     }     if(m % n == 0)  //当其中较大的数是另一个数的倍数时     {         p = m;         q = n;     }     else     {         p = m*n;         while(n != 0)   //辗转相除法         {             r = m%n;             if(r == 0)                 break;    //当余数为0时，跳出循环             m=n;             n=r;         }         q = n;   //记录最大公约数     }     printf("最大公约数为:%d\n",q);     printf("最小公倍数为:%d\n",p);      return 0; }

while(n!=0)//当n == 0 时才跳出循环,这时n已经为零了 {r=m%n;  m=n;  n=r; } printf("最大公约数为:%d\n",n); printf("最小公倍数为:%d\n",p/n);//零是不能当作分母的

应该是你输入的问题，还有这句输入最好不要这样写\n的匹配会有问题 scanf("m=%d,n=%d\n",&m,&n); 改成 scanf("%d%d",&m,&n);


引用 3 楼 jerry_dqh 的回复:wndclass.cbClsExtra  你没有设置好。你设置了两个cbWndExtra 阿里嘎多，我看到了，80分收好

引用 1 楼 my3439955 的回复:WNDCLASS wndclass = {sizeof(wndclass)};不懂事什么意思

WNDCLASS wndclass = {sizeof(wndclass)};


Question: 一个数组问题（函数调用，递归求回文数）--新手

#include <stdio.h>  int hui_wen(const char *str) {     int m;     int i;      m = strlen(str);      for(i = 0; i < m; ++i)         if(str[i] != str[m - 1 - i])             return 0;     return 1;  }  int main(int argc, char *argv[]) {     char *test = "12344321";     printf("%d\n", hui_wen(test));     return 0; }

从中心对称比对就可以了


Question: #define的用法求教？

引用 4 楼 guiguiyiha 的回复: #define dump(resrc, level, fmt, args, ...) \     do{\         struct test_struct *resource = (struct test_struct *)resrc;\         printf("resource: %p, %d\n", resource, resource->a);\         \         if (level) {\              printf("(func:%s line:%4d): \n", __func__, __LINE__, fmt, #args);\         }\     }while(0)  struct test_struct {     unsigned int a;     unsigned int b;     unsigned int c;     unsigned int d; };  int main() {     struct test_struct resource;     resource.a = 10;     resource.b = 20;     resource.c = 30;     resource.d = 40;          printf("resource: %p, %d\n", &resource, resource.a);      dump(&resource, TRACE_DEBUG, "resource: %d\n", resource.d);      } 打印结果为： resource: 0xbfd69000, 10 resource: 0xbfd68ffc, -1076457476 (func:main line:  39):  我这执行没什么问题http://ideone.com/IR6Foq

引用 9 楼 lming_08 的回复:printf("(func:%s line:%4d): \n", __func__, __LINE__, fmt, #args); 你这个能对应起来吗？分成两个printf试试 我现在就是用2个printf实现的。

引用 6 楼 angel_su 的回复:宏是文字置换，resource有重名问题，改一下...  struct test_struct *presource = printf("resource: %p, %d\n", presource， presource->a); #define dump(resrc, level, fmt, args...) \     do{\         printf("2.0 resource: %p\n", resrc);\         struct test_struct *Presource = (struct test_struct *)resrc ;\         printf("3.0 resource: %p, %d\n", Presource, Presource->a);\         \         if (level) {\              printf("4.0 (func:%s line:%4d): \n", __func__, __LINE__, fmt, #args);\         }\     }while(0)    int main() {     struct test_struct resource;     resource.a = 10;     resource.b = 20;     resource.c = 30;     resource.d = 40;          printf("1.0 resource: %p, %d\n", &resource, resource.a);      dump(&resource, TRACE_DEBUG, "resource: %d\n", resource.d); } 标红的部分打印不出来，为什么，fmt和args与#的配合不是很明白，求解。谢谢

宏定义变参。。。第一次见这么用！好使吗？ 好像ls火眼金睛，已经发现那个逗号问题了。此外审核以下每个'\'后有没有空格字符，这是宏常见的错误

dump前的地址和传入给define中的地址，一直相差4，为什么呢？

引用 1 楼 user-5 的回复:有两处错误。 1. 在printf("resource: %p, %d\n", resource， resource->a);\中第二个逗号是中文字符！！ 2. 在dump(resource, TRACE_DEBUG, "resource: %d\n", resource.d);中dump函数里，第一个参数是指针。所以应该是dump(&resource, TRACE_DEBUG, "resource: %d\n", resource.d); 恩，改正了，搜狗输入法最近老卡，换了个qq输入法，切换起来使用不熟。 我编译通过了但是运行结果不是我想要的.运行结果是： resource: 0xbfbf0fbc, -1077997636 (func:main line:  37):

现在的编译器一般都能定位了吧

引用 11 楼 lming_08 的回复:[quote=引用 4 楼 guiguiyiha 的回复:]  #define dump(resrc, level, fmt, args, ...) \     do{\         struct test_struct *resource = (struct test_struct *)resrc;\         printf("resource: %p, %d\n", resource, resource->a);\         \         if (level) {\              printf("(func:%s line:%4d): \n", __func__, __LINE__, fmt, #args);\         }\     }while(0)  struct test_struct {     unsigned int a;     unsigned int b;     unsigned int c;     unsigned int d; };  int main() {     struct test_struct resource;     resource.a = 10;     resource.b = 20;     resource.c = 30;     resource.d = 40;          printf("resource: %p, %d\n", &resource, resource.a);      dump(&resource, TRACE_DEBUG, "resource: %d\n", resource.d);      } 打印结果为： resource: 0xbfd69000, 10 resource: 0xbfd68ffc, -1076457476 (func:main line:  39):  我这执行没什么问题http://ideone.com/IR6Foq[/quote]  那你试试8楼的


Question: 定义一个新的指针变量的作用是什么？ 不定义行不行？

主要还是void *类型的变量不能+ - 等运算。  对于保护vptr的值，这里倒是谈不上。

首先vptr是一个void*的指针，使用ptr(是char *类型指针）也是转换一下，void类型的数据是不可以进行加减运算的吧。 其次，也可以保护vptr的值吧，不过这个是我的个人见解。


Question: 传结构体数组的首地址给函数，在函数中 x[i] = 结构体数组[i].x 该怎么做

这种时候可以用引用类型 struct Bubble{ 	COLORREF	color; 	double		x; };  Bubble bubble[N];  void Func(struct Bubble (&arry)[N]) { 	double x[N]; 	for(int i=0; i<N; i++){ 		x[i] = arry[i].x; 	} }  void main() { 	Func(bubble); }

引用 1 楼 a515360208 的回复:学了C++的类和对象的概念你就会清楚一点，你只是传入了第一个对象的地址，你无法访问访问其他对象的成员的 struct Bubble{ 	COLORREF	color; 	double		x; };  Bubble bubble[N];  void Func(Bubble (*p)[N]) { 	double x[N]; 	for(int i=0; i<N; i++){ 		x[i] = p[i]->x; 	} }  void main() { 	Func(&bubble); }  谢谢了


Question: 关于free函数

引用 楼主 cs_huster 的回复:看c专家编程里面说free释放的内存块并没有直接交给操作系统，还是在进程空间内部，那么这么说free后，其他进程无法malloc这块内存？那么通过神马方法可以把这块内存从进程交换给操作系统呢、？  通常无需关心这个问题，而且完全没有必要。 真的需要的话，自己实现好了。

#include <stdio.h> #include <stdlib.h> #include <string.h>  int main() {    char *p;    p =(char *)malloc(sizeof(char) * 8);    strcpy(p,"asdfgh");    printf("%s\n",p);    p++;    printf("%s\n",p);    free(p);    printf("%s\n",p-1);    printf("%s\n",p);    //printf("%s\n",p+1);     return 0; }

http://www.chinaunix.net/old_jh/4/677609.html 希望这个链接能够帮你解决这个问题。


Question: 求教温度补偿的程序DS18B20

你这个基本跟C本身没有多大关系，专业化的。


Question: 初学者一枚 希望有大神指教一下程序调用的问题

我看看  谢谢

这个能看懂吗？参考一下：#pragma comment(lib, "crypt32.lib") #pragma comment(lib, "advapi32.lib") #define _WIN32_WINNT 0x0400 #include <stdio.h> #include <windows.h> #include <wincrypt.h> #define MY_ENCODING_TYPE  (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING) #define KEYLENGTH  0x00800000 void HandleError(char *s); //-------------------------------------------------------------------- //  These additional #define statements are required. #define ENCRYPT_ALGORITHM CALG_RC4 #define ENCRYPT_BLOCK_SIZE 8 //   Declare the function EncryptFile. The function definition //   follows main. BOOL EncryptFile(     PCHAR szSource,     PCHAR szDestination,     PCHAR szPassword); //-------------------------------------------------------------------- //   Begin main. void main(void) {     CHAR szSource[100];     CHAR szDestination[100];     CHAR szPassword[100];     printf("Encrypt a file. \n\n");     printf("Enter the name of the file to be encrypted: ");     scanf("%s",szSource);     printf("Enter the name of the output file: ");     scanf("%s",szDestination);     printf("Enter the password:");     scanf("%s",szPassword);     //--------------------------------------------------------------------     // Call EncryptFile to do the actual encryption.     if(EncryptFile(szSource, szDestination, szPassword)) {         printf("Encryption of the file %s was a success. \n", szSource);         printf("The encrypted data is in file %s.\n",szDestination);     } else {         HandleError("Error encrypting file!");     } } // End of main //-------------------------------------------------------------------- //   Code for the function EncryptFile called by main. static BOOL EncryptFile(     PCHAR szSource,     PCHAR szDestination,     PCHAR szPassword) //-------------------------------------------------------------------- //   Parameters passed are: //     szSource, the name of the input, a plaintext file. //     szDestination, the name of the output, an encrypted file to be //         created. //     szPassword, the password. {     //--------------------------------------------------------------------     //   Declare and initialize local variables.     FILE *hSource;     FILE *hDestination;     HCRYPTPROV hCryptProv;     HCRYPTKEY hKey;     HCRYPTHASH hHash;     PBYTE pbBuffer;     DWORD dwBlockLen;     DWORD dwBufferLen;     DWORD dwCount;     //--------------------------------------------------------------------     // Open source file.     if(hSource = fopen(szSource,"rb")) {         printf("The source plaintext file, %s, is open. \n", szSource);     } else {         HandleError("Error opening source plaintext file!");     }     //--------------------------------------------------------------------     // Open destination file.     if(hDestination = fopen(szDestination,"wb")) {         printf("Destination file %s is open. \n", szDestination);     } else {         HandleError("Error opening destination ciphertext file!");     }     //以下获得一个CSP句柄     if(CryptAcquireContext(                 &hCryptProv,                 NULL,               //NULL表示使用默认密钥容器，默认密钥容器名                 //为用户登陆名                 NULL,                 PROV_RSA_FULL,                 0)) {         printf("A cryptographic provider has been acquired. \n");     } else {         if(CryptAcquireContext(                     &hCryptProv,                     NULL,                     NULL,                     PROV_RSA_FULL,                     CRYPT_NEWKEYSET))//创建密钥容器         {             //创建密钥容器成功，并得到CSP句柄             printf("A new key container has been created.\n");         } else {             HandleError("Could not create a new key container.\n");         }     }     //--------------------------------------------------------------------     // 创建一个会话密钥（session key）     // 会话密钥也叫对称密钥，用于对称加密算法。     // （注: 一个Session是指从调用函数CryptAcquireContext到调用函数     //   CryptReleaseContext 期间的阶段。会话密钥只能存在于一个会话过程）     //--------------------------------------------------------------------     // Create a hash object.     if(CryptCreateHash(                 hCryptProv,                 CALG_MD5,                 0,                 0,                 &hHash)) {         printf("A hash object has been created. \n");     } else {         HandleError("Error during CryptCreateHash!\n");     }     //--------------------------------------------------------------------     // 用输入的密码产生一个散列     if(CryptHashData(                 hHash,                 (BYTE *)szPassword,                 strlen(szPassword),                 0)) {         printf("The password has been added to the hash. \n");     } else {         HandleError("Error during CryptHashData. \n");     }     //--------------------------------------------------------------------     // 通过散列生成会话密钥     if(CryptDeriveKey(                 hCryptProv,                 ENCRYPT_ALGORITHM,                 hHash,                 KEYLENGTH,                 &hKey)) {         printf("An encryption key is derived from the password hash. \n");     } else {         HandleError("Error during CryptDeriveKey!\n");     }     //--------------------------------------------------------------------     // Destroy the hash object.     CryptDestroyHash(hHash);     hHash = NULL;     //--------------------------------------------------------------------     //  The session key is now ready.     //--------------------------------------------------------------------     // 因为加密算法是按ENCRYPT_BLOCK_SIZE 大小的块加密的，所以被加密的     // 数据长度必须是ENCRYPT_BLOCK_SIZE 的整数倍。下面计算一次加密的     // 数据长度。     dwBlockLen = 1000 - 1000 % ENCRYPT_BLOCK_SIZE;     //--------------------------------------------------------------------     // Determine the block size. If a block cipher is used,     // it must have room for an extra block.     if(ENCRYPT_BLOCK_SIZE > 1)         dwBufferLen = dwBlockLen + ENCRYPT_BLOCK_SIZE;     else         dwBufferLen = dwBlockLen;     //--------------------------------------------------------------------     // Allocate memory.     if(pbBuffer = (BYTE *)malloc(dwBufferLen)) {         printf("Memory has been allocated for the buffer. \n");     } else {         HandleError("Out of memory. \n");     }     //--------------------------------------------------------------------     // In a do loop, encrypt the source file and write to the source file.     do {         //--------------------------------------------------------------------         // Read up to dwBlockLen bytes from the source file.         dwCount = fread(pbBuffer, 1, dwBlockLen, hSource);         if(ferror(hSource)) {             HandleError("Error reading plaintext!\n");         }         //--------------------------------------------------------------------         // 加密数据         if(!CryptEncrypt(                     hKey,           //密钥                     0,              //如果数据同时进行散列和加密，这里传入一个                     //散列对象                     feof(hSource),  //如果是最后一个被加密的块，输入TRUE.如果不是输.                     //入FALSE这里通过判断是否到文件尾来决定是否为                     //最后一块。                     0,              //保留                     pbBuffer,       //输入被加密数据，输出加密后的数据                     &dwCount,       //输入被加密数据实际长度，输出加密后数据长度                     dwBufferLen))   //pbBuffer的大小。         {             HandleError("Error during CryptEncrypt. \n");         }         //--------------------------------------------------------------------         // Write data to the destination file.         fwrite(pbBuffer, 1, dwCount, hDestination);         if(ferror(hDestination)) {             HandleError("Error writing ciphertext.");         }     } while(!feof(hSource));     //--------------------------------------------------------------------     //  End the do loop when the last block of the source file has been     //  read, encrypted, and written to the destination file.     //--------------------------------------------------------------------     // Close files.     if(hSource)         fclose(hSource);     if(hDestination)         fclose(hDestination);     //--------------------------------------------------------------------     // Free memory.     if(pbBuffer)         free(pbBuffer);     //--------------------------------------------------------------------     // Destroy session key.     if(hKey)         CryptDestroyKey(hKey);     //--------------------------------------------------------------------     // Destroy hash object.     if(hHash)         CryptDestroyHash(hHash);     //--------------------------------------------------------------------     // Release provider handle.     if(hCryptProv)         CryptReleaseContext(hCryptProv, 0);     return(TRUE); } // End of Encryptfile //-------------------------------------------------------------------- //  This example uses the function HandleError, a simple error //  handling function, to print an error message to the standard error //  (stderr) file and exit the program. //  For most applications, replace this function with one //  that does more extensive error reporting. void HandleError(char *s) {     fprintf(stderr,"An error occurred in running the program. \n");     fprintf(stderr,"%s\n",s);     fprintf(stderr, "Error number %x.\n", GetLastError());     fprintf(stderr, "Program terminating. \n");     exit(1); } // End of HandleError

只要你有加密程序提供的接口，然后根据接口中需要的参数把各参数传递进去就可以调用了

找到加密程序的对外接口吧，一个程序一定会有对外的接口函数，注意看一下接口函数的参数，然后写个demo测试一下就知道如何使用和调用了。


Question: 字符串以单词为单位倒序输出

最容易出错的地方是+1，-1错误

逆序输出，或者转换到另一个数组（串），可以自后向前，逐个单词输出（复制）。 原地反转，需要2步反转，1步反转每个单词，1步反转整个字符串。

有限自动机

char* fun(char* s,int len)  {      int i = 0;      char s1;      int len1 = len-1;      if(s == NULL)          return 0;      while((*s != '\0') &&( i<(len/2)))      {           s1 = s[i];          s[i]=s[len1];          s[len1] = s1;            i++;          len1--;      }      return s;  } 测试可用

可以用字符串指针数组来实现

把字符串压入栈中就可以了

用递归写了一个，有一个小问题，多输出了一个空格[code=c]# include <iostream> # include <string> using namespace std;  void reverseString(char *head, char *tail);  int main() { 	char str[] = "hello word boy baby lili";  	reverseString(str, str); 	 	return 0; }  void reverseString(char *head, char *tail) { 	while (*tail != ' ' && *tail != '\0') 	{ 		tail++; 	} 	if (*tail == '\0') 	{ 		cout << head << " "; 		return; 	} 	else 	{ 		reverseString(tail + 1, tail + 1); 		*tail = '\0'; 		cout << head << " "; 	}	 }[/code]

void fun(char *strSrc, int lenSrc, char *strDest, int lenDest) { 	for(int index=lenSrc-1; index>0; index--) 	{ 		strDest[lenDest-index-1] = strSrc[index]; 	} } //没有编译验证，不知道可否

每个单词倒序，然后整个字符串倒序，转换完成。。

引用 1 楼 oYinGui1 的回复:Hello World变成World Hello这种的话。。string+vector就可以很轻松完成了。 要求不能用STL。。。忘记说了


Question: CryptoAPI的证书库基本操作的C代码，提示C2664错误，怎么解决啊

LPCSTR pszFileName = "TestStor.sto"; 改成LPCWSTR pszFileName = L"TestStor.sto";


Question: struct对齐疑问

好吧 我sb了，错吧cc 的union写成struct 了，眼睛啊

你的bb是结构体类型啊，sizeof(bb) = sizeof(cc) + sizeof(LUAI_USER_ALIGNMENT_T) = 16 + 8 = 24

数学没有学好吧，8 + 16 = 24不是很简单么 你的cc是struct而不是union


Question: 有关用C实现密码学中的平方乘算法。

因为你用的是c语言所以你在使用printf后，还要给a赋值编译肯定出问题 ，你可以在写个试试

可以用字符串来存储运算结果

引用 1 楼 u013163178 的回复:什么？不支持long long就是一种数据类型啊  呵呵   重点其实也不再那啦

什么？不支持long long


Question: C Primer Plus 问题求解

返回了一个copy哈

这是结构体赋值，没有问题。

#include<stdio.h> char function1() { 	char a='o'; 	return a; } char *function2() { 	char a[]="asdf"; 	return a;//warning C4172: returning address of local variable or temporary } int main() { 	printf("%c\n",function1()); 	return 0; }

你连最基本的函数传递和返回都没弄清楚，举个简单的例子 int f() { 	int i; 	i = 2; 	return i; }  int main() { 	int a; 	a = f();  	return 0; }函数调用后返回了一个i的副本给a, 而你的函数不就是返回了一个struct test类型的副本么，虽然临时变量的内存释放了，但副本传出来了

引用 3 楼 u013163178 的回复:struct test val变量临死前值传给了val_m精辟

struct test val变量临死前值传给了val_m

是一个返回值的操作。应该就像返回整型数，函数调用结束后，虽然该整型数的内存释放了，但是可以把返回值传递出来。

把val当返回值传回给main()中的val_m，这是一个拷贝结构体的操作。虽然un()中的结构体val所占内存空间被收回，但main()中的val_m通过赋值操作保存了一份val的值，所以就可以将ch和i的值打印出来了。

是被释放了，系统自动回收了，但是在函数fun调用结束后它将值传给了你在main函数申请的局部变量val，所以，你在main函数能够打印在fun函数里的赋值。

临时对象。。


Question: 进程间如何传递数据？

文件或全局变量

共享内存和信号量结合使用

IPC有很多方式

你可以使用各种进程间通信机制（IPC）。Perl的文档里描述了很多种，主要包括： 最简单的：一个进程写一个文件，另一个进程读。注意锁好。 古典的：SysV IPC机制，包括共享内存、semaphore信号量等。 常用的：管道文件（这个好像只有Unix有），Socket和网络协议（同样可以用于本地的进程间）。


Question: 求windows下通过MinGW编译使用OCILIB的C程序的详细步骤

angel_su ,非常感谢你的提醒，我看了一下OCILIB的Readme.txt文件：      - add ocilib/include folder to your compiler includes path      - add ocilib/lib folder to your linker library path      - For MinGW only, rename/copy ocilib[x].lib to libocilib[x].a      - add ocilib[x].lib (or -locilib[x] from MinGw) to your linking options      - add OCI_CHARSET_XXX macro to your preprocessor options      - add OCI_API macro definition to your preprocessor options (set it to __stdcall) 上面有提到添加函数调用约定，但是我对这个不理解，所以忽略了这点，就出现了上述问题，现在我修改程序如下： #define OCI_API __stdcall #define OCI_CHARSET_ANSI UTF-8 #include "ocilib.h" int main(int argc, char *argv[]){     OCI_Connection * cn;     OCI_Statement * st;     OCI_Resultset * rs;     OCI_Initialize(NULL, NULL, OCI_ENV_DEFAULT);     cn = OCI_ConnectionCreate("test", "hanlin", "hanlin", OCI_SESSION_DEFAULT);     st = OCI_StatementCreate(cn);     OCI_ExecuteStmt(st, "select * from stars");     rs = OCI_GetResultset(st);     while (OCI_FetchNext(rs)){         printf("%i - %s\n", OCI_GetInt(rs, 1), OCI_GetString(rs,2));     }     OCI_Cleanup();     return EXIT_SUCCESS; } 使用相同的编译命令，已经编译通过，并且也执行成功，在此非常感谢angel_su，同时也感谢zhao4zhong1 的帮助，现在我的解决方法贴在这里，希望对你有帮助！谢谢。

* To use OCILIB in a project :  *  * - include "ocilib.h" in your application  * - define call convention (OCI_API) to __stdcall  * - define charset mode (OCI_CHARSET_ANSI | OCI_CHARSET_MIXED| OCI_CHARSET_WIDE | OCI_CHARSET_UFT8)  *  * Note for MinGW users:  * - Precompiled 32bits static libraries libocilib[x].a are provided  * - To use OCILIB dll's, copy/rename import libraries ocilib[x].lib to libocilib[x].lib  * - Add the desired version (static/shared + charset) of the library to the linker options

将源代码的后缀改改再试试。 .c改为.cpp或.cpp改为.c


Question: 用C/C++做个简单的APP

引用 10 楼 guodongxiaren 的回复:你是不会连接数据库？还不不会开单导出Excel？或者是不会发送到邮箱？ EXCEL和邮箱都没试过

你是不会连接数据库？还不不会开单导出Excel？或者是不会发送到邮箱？

APP我好像不会，想先做成动态链接库，由JAVA调用吧

不行的话，就发到邮箱再说吧

引用 4 楼 shimachao 的回复:QQ官方给接口了吗？你觉得麻花藤会给吗

在线传QQ文件或微信

你需要找人付费帮你做喽

QQ官方给接口了吗？

我擦，你要用你的app向QQ传文件？

说说思路也可以，朋友叫帮忙的，我不会。

这东西就是在公司里头做也得给领导算一星期的工时吧？凭什么帮你做？


Question: c 中带返回值的宏怎么理解？

这是GCC编译器的特性，使用GCC编译

引用 1 楼 my_live_123 的回复:宏中的最后一个语句，作为整个语句的值。这个和语句块有关系，{}内所有语句对{}外都认为是一条语句，{}的值就是最后一条语句的值。 2.交换16位无符号整数的高低字节！AB->BA  感谢讲解，这个在VS里编译不通过，有木有什么设置可以让它在VS里通过的？


Question: c语言小问题

一楼正解透彻！！

你的程序不能达到统计输入一段字符中空格的个数，为什么呢？首先你得看看你循环中的判定，要是一个非‘\n’且为空格才能进入循环体，自然不对了，程序改一下就行了# include <stdio.h> # include <ctype.h> int main() { 	int nspace = 0; 	char c;  	while ((c = getchar()) != '\n') 	{  		if (isspace(c)) 			++nspace; 	} 	printf("%d",nspace);  	return 0; }

what's your question?

[code=c#include<stdio.h> #include<ctype.h> int main() { char c; //int i; int nspace=0; while((c=getchar())!= '\n') //如果你用while((c=getchar())!='\n'&&(isspace(c)))这样的判断                                            //除非你只输入空格，否则只要一有非空格字符出现                                          //你的循环就跳出了 {     if(isspace(c))         ++nspace; }  printf("%d",nspace);  return 0; } [/code] 不知你所说的程序问题是什么，不过以上的修改似乎可以让程序健壮一点。


Question: ++(a++)这句为什么不对呢？

强烈要求CSDN在凡是提问帖标题或内容中出现≥两次++、--时，自动在一楼回复以下内容：  http://bbs.csdn.net/topics/370153775 http://bbs.csdn.net/topics/370153775

a++返回的是一个临时变量不可以作为左值的

引用 1 楼 oYinGui1 的回复:a++得到的是一个右值，++操作需要的是一个左值。 ++++

引用 楼主 guodongxiaren 的回复:++(a++)这句为什么不对呢？ 不是先执行a++，再++a的意思么。。 ++

问这个意思嘛,项目中写这个,老大立马拍死你................

有来月经了,真是月月有啊

一楼和二楼说的都很有道理，这样的语句完全是可以避免的

N1570，6.5.2.4： The result of the postfix ++ operator is the value of the operand.

引用 3 楼 BeanJoy 的回复: C,C++表达式求值顺序 裘老的解释。 这和求值顺序关系不大，就是左值右值的问题。

楼上都回答的很清楚了。

C,C++表达式求值顺序 裘老的解释。

a++返回的是一个右值，不对再++了，可以写成 ++(++a)

a++得到的是一个右值，++操作需要的是一个左值。


Question: 关于linux size命令的疑问

楼上是对的，可以给我点分吗

dec  10进制 表示总size hex   16进制 表示总size


Question: GDI游戏CPU占用率持高不下..

不至于啊 我也很好奇 release版本呢？

引用 6 楼 user-2 的回复:你消息循环里放一个PaintBg，PaintBg里又有Sleep(170)，那当然占用率下来了。你原来的满占用是因为消息循环导致的。你现在在消息循环里加Sleep的后果就是cpu占用想上去也上不去。嗯..谢谢你的回复与批评..结贴了

我看lz乃还是花点时间研究消息循环该怎么写吧。现在这个实在是写乱了。

引用 2 楼 sniffer12345 的回复:不至于啊 我也很好奇 release版本呢？  引用 3 楼 user-2 的回复:while(TRUE)     {      if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))          {             if (msg.message == WM_QUIT)               break ;              TranslateMessage(&msg) ;               DispatchMessage(&msg) ;          }       }  PeekMessage不会block，那当然满cpu了。这个是有效果的...谢谢...但是我用PeekMessage在循环内多贴了几张Bmp他的CPU占有率就降下来了...这是为什么呢。。我我把代码改了一下 麻烦可以再看一下嘛.. 谢谢了#include <windows.h>  HDC hdc,mdc ; HBITMAP bg ; HWND hwnd ; MSG msg ; WNDCLASS wndclass ; PAINTSTRUCT ps ; RECT rect ;  void PaintBg(HBITMAP hbmp,LPCSTR lptext,HDC hdc,HDC pdc,HWND hwnd) ;  LRESULT CALLBACK WndProc (HWND,UINT,WPARAM,LPARAM) ;  int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE,PSTR,int iCmdShow) { static TCHAR szAppName[] = TEXT ("Sample") ;  wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc = WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION) ; wndclass.hCursor = LoadCursor(NULL,IDC_ARROW) ; wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH) ; wndclass.lpszMenuName = NULL ; wndclass.lpszClassName = szAppName ;  if (!RegisterClass (&wndclass)) {   MessageBox ( NULL, TEXT ("This program requires Windows NT!"),szAppName, MB_ICONERROR) ;   return 0 ; } hwnd = CreateWindow(szAppName,TEXT ("GDI_Game"),WS_OVERLAPPEDWINDOW|WS_BORDER,                     600,320,256,240,NULL,NULL,hInstance,NULL) ;  ShowWindow(hwnd,iCmdShow) ; UpdateWindow(hwnd) ;     while(TRUE) 	{ 	 PaintBg(bg,"sdk.bmp",hdc,mdc,hwnd) ; 	 if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) 	     {             if (msg.message == WM_QUIT)               break ; 	         TranslateMessage(&msg) ;  	         DispatchMessage(&msg) ; 	     } 	   	  	 }   	return(msg.wParam) ; } LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) {   case WM_CREATE:   return 0 ;    case WM_PAINT:   hdc = BeginPaint (hwnd,&ps) ;   EndPaint(hwnd,&ps) ;   return 0 ;     case WM_DESTROY:   DeleteDC(mdc);   DeleteObject(bg);   PostQuitMessage (0) ;   return 0 ; }   return DefWindowProc (hwnd, message, wParam, lParam) ; } void PaintBg(HBITMAP hbmp,LPCSTR lptext,HDC hdc,HDC pdc,HWND hwnd) {        hbmp = (HBITMAP)LoadImage(NULL,"sdk.bmp",IMAGE_BITMAP,256,366,LR_LOADFROMFILE) ; 	   hdc = GetDC(hwnd) ;         pdc = CreateCompatibleDC(hdc) ; 	   Sleep(170) ; 	   SelectObject(pdc,hbmp);        BitBlt(hdc,0,0,256,240,pdc,0,0,SRCCOPY) ; 	   Sleep(170) ; 	   BitBlt(hdc,31,64,192,96,pdc,0,240,SRCCOPY) ; 	   BitBlt(hdc,31,195,192,9,pdc,0,336,SRCCOPY) ; }

引用 2 楼 sniffer12345 的回复:不至于啊 我也很好奇 release版本呢？Release版本也差不多...

#include <windows.h>  HDC hdc,mdc ; HBITMAP bg ; HWND hwnd ; MSG msg ; WNDCLASS wndclass ; PAINTSTRUCT ps ; RECT rect ;  LRESULT CALLBACK WndProc (HWND,UINT,WPARAM,LPARAM) ; int WINAPI WinMain  (HINSTANCE hInstance, HINSTANCE,PSTR,int iCmdShow) { static TCHAR szAppName[] = TEXT ("Sample") ;  wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc = WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION) ; wndclass.hCursor = LoadCursor(NULL,IDC_ARROW) ; wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH) ; wndclass.lpszMenuName = NULL ; wndclass.lpszClassName = szAppName ;  if (!RegisterClass (&wndclass)) {   MessageBox ( NULL, TEXT ("This program requires Windows NT!"),szAppName, MB_ICONERROR) ;   return 0 ; } hwnd = CreateWindow(szAppName,TEXT ("GDI_Game"),WS_OVERLAPPEDWINDOW,                     600,320,256,240,NULL,NULL,hInstance,NULL) ;  ShowWindow(hwnd,iCmdShow) ; UpdateWindow(hwnd) ;  hdc = GetDC(hwnd) ; mdc = CreateCompatibleDC(hdc) ; bg = (HBITMAP)LoadImage(NULL,"sdk.bmp",IMAGE_BITMAP,256,336,LR_LOADFROMFILE) ; SelectObject(mdc,bg); BitBlt(hdc,0,0,256,240,mdc,0,0,SRCCOPY); while(TRUE) 	{ 	 if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) 	     {             if (msg.message == WM_QUIT)               break ; 	         TranslateMessage(&msg) ;  	         DispatchMessage(&msg) ; 	     }  	 }   	return(msg.wParam) ; } LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) {   case WM_CREATE:   return 0 ;    case WM_PAINT:   hdc = BeginPaint (hwnd,&ps) ;   GetClientRect (hwnd,&rect) ;   EndPaint(hwnd,&ps) ;   return 0 ;     case WM_DESTROY:   DeleteDC(mdc);   DeleteObject(bg);   PostQuitMessage (0) ;   return 0 ; }   return DefWindowProc (hwnd, message, wParam, lParam) ; }


Question: 麻烦看下这个为什么段错误 该怎样改 这块我总是晕 多谢

to: tuzhutuzhu  您说的 create_list中使用的是head1的一个拷贝 是说 比如: main中的head1 的地址是 0xAEFD0 , 那么接收参数hptr 指针变量的地址也是  0xAEFD0 还是说 , 他们head1 和 hptr本身都是不同的地址,  他们只想的值相同呢?

段错误，也即是访问内存错误！常见的有空指针，内存访问越界！

引用 2 楼 power0811 的回复:非常感谢您的回答, 可还是有点地方不明白, 如下面代码, 为什么传一级指针就可以了, 有什么区别么?  int fun(void *p) { 	char *ptr = (char *)p; 	strcpy_s(ptr, 128, "hello");  	return 0; }  int main() { 	char *p = new char[128]; 	fun(p);  	cout<<p<<endl;  	delete p;  	return 0; }  首先需要理解函数参数的值传递与指针传递之间的区别 主楼的例子的中，虽然传递的是一个指针，但是你的这个操作： PNODE head1 = NULL; 所以head1的值为NULL，没有地方可指。把head1传给create_list，create_list中使用的是head1的一个拷贝。但是main函数中的head1不会变，一直是NULL。所以使用head1->操作，肯定会segment fault。 但是上面的这个例子，指针p已经分配了内存，指向了字符指针。然后将p传给fun函数。虽然fun函数中不会改变p的值，但是p指向的内存的值在fun函数中已经变了。

计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）  想要从本质上理解C指针，必须学习汇编以及C和汇编的对应关系。 从汇编的角度理解和学习C语言的指针，原本看似复杂的东西就会变得非常简单！ 指针即地址。“地址又是啥？”“只能从汇编语言和计算机组成原理的角度去解释了。” 但我又不得不承认：  有那么些人喜欢或者适合用“先具体再抽象”的方法学习和理解复杂事物；  而另一些人喜欢或者适合用“先抽象再具体”的方法学习和理解复杂事物。 而我本人属前者。  不要企图依赖输出指针相关表达式的值【比如printf("%p\n",...)】来理解指针的本质， 而要依赖调试时的反汇编窗口中的C/C++代码【比如void *p=...】及其对应汇编指令以及内存窗口中的内存地址和内存值来理解指针的本质。  这辈子不看内存地址和内存值；只画链表、指针示意图，画堆栈示意图，画各种示意图，甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗？本人深表怀疑！ 这辈子不种麦不收麦不将麦粒拿去磨面；只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头，压面条，烤面包，……能从本质上理解面粉、理解面食吗？本人深表怀疑！！  提醒： “学习用汇编语言写程序” 和 “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

main()中的head1 是Node类型的结构体指针，而void create_list(void *hptr)的参数需要的是指向结构体指针的指针（Node **），即 *hptr = &head1，所以传参数要传&head1。这样做是为了能够通过传递一个变量的地址来改变那个变量的值。 而create_list(void *hptr)中void类型的*hptr 通过NODE *head1 = (PNODE)hptr;语句中的强制类型转换，转变成了一个PNODE类型的指针，它所指向的是一个Node类型的结构体。


Question: codeblock 很简单的一个小程序 运行的时候说是停止运行，不知道为什么

看一半天，居然就是多了一个分号。

多了个分号都看到了,眼神真好

引用 2 楼 zhangyonghui2117 的回复:[quote=引用 楼主 u014787492 的回复:] #include<stdio.h> void main() {     int a[10],i,minv;     int *p;     p=a;     for (i=0;i<10;i++);     {         scanf("%d",p+i);      }     minv=*p;     for(i=1;i<10;i++)     {         if (minv>*(p+i))             minv=*(p+i);     }     printf("%d",minv); } 很简单的一个程序，而且程序也是对的，但是在运行的时候显示停止运行，无法输出结果，求解答  ///////  for (i=0;i<10;i++);多了个分号[/quote] 正解

引用 楼主 u014787492 的回复:#include<stdio.h> void main() {     int a[10],i,minv;     int *p;     p=a;     for (i=0;i<10;i++);     {         scanf("%d",p+i);      }     minv=*p;     for(i=1;i<10;i++)     {         if (minv>*(p+i))             minv=*(p+i);     }     printf("%d",minv); } 很简单的一个程序，而且程序也是对的，但是在运行的时候显示停止运行，无法输出结果，求解答  ///////  for (i=0;i<10;i++);多了个分号

/// 求最小数   #include<stdio.h> void main() {     int a[10],i,minv=1;     int *p;     p=a;     for (i=0;i<10;i++)     {         scanf("%d",p+i);      }     minv=*p;     for(i=1;i<10;i++)     {         if (minv>*(p+i))             minv=*(p+i);     }     printf("the min digit is:%d",minv); }  /* 5 89 1 236 956 65 23 85 3 2 the min digit is:1 Process returned 18 (0x12)   execution time : 14.446 s Press any key to continue. */


Question: 求c/c++大神  帮忙教一下怎么样调用子程序

lz找函数的说明书啊，   这种问题只有说明书能帮你

我只是个菜鸟 对程序一窍不通  而且都是英文 看不懂啊


Question: 关于gcc分别编译失败的问题

引用 5 楼 mcmay 的回复:[quote=引用 4 楼 cs_huster 的回复:] [quote=引用 1 楼 xuweiwei1860 的回复:] 文件关联了啊    找个。h  公用的放里面就好了 我这个目的是测试extern变量的，放入.h就失去了测试extern 变量的意义了。。为什么放在一块编译可以通过，而分别编译就不行呢？[/quote] 你在test2.c中用了extern，但你是单独编译这个test2.c文件，编译器这时不知道有个test1.c的存在，对它的内容更是一无所知。比如，你和你的女朋友去找一个画家给你们两人画肖像画，你们一起去，画家就可以画出你们俩的肖像画。但是你和你的女朋友分别去，你去时跟画家说，我的女朋友叫XXX，你给她也画一幅肖像画吧。但画家说，你说了你女朋友的名字，但我没有见到你女朋友的人，我不知道她是什么模样，我没法画。[/quote] 找到错误原因了，gcc -o test1.o test2.o -o testt 这条命令里面多了一个“-o"选项，所以出错了，去掉第一个-o后，正常编译和运行

引用 4 楼 cs_huster 的回复:[quote=引用 1 楼 xuweiwei1860 的回复:] 文件关联了啊    找个。h  公用的放里面就好了 我这个目的是测试extern变量的，放入.h就失去了测试extern 变量的意义了。。为什么放在一块编译可以通过，而分别编译就不行呢？[/quote] 你在test2.c中用了extern，但你是单独编译这个test2.c文件，编译器这时不知道有个test1.c的存在，对它的内容更是一无所知。比如，你和你的女朋友去找一个画家给你们两人画肖像画，你们一起去，画家就可以画出你们俩的肖像画。但是你和你的女朋友分别去，你去时跟画家说，我的女朋友叫XXX，你给她也画一幅肖像画吧。但画家说，你说了你女朋友的名字，但我没有见到你女朋友的人，我不知道她是什么模样，我没法画。

引用 1 楼 xuweiwei1860 的回复:文件关联了啊    找个。h  公用的放里面就好了 我这个目的是测试extern变量的，放入.h就失去了测试extern 变量的意义了。。为什么放在一块编译可以通过，而分别编译就不行呢？

引用 2 楼 CarlXie 的回复:错误很明显，你分别编译的时候没有找到相应的声明。 为什么放一块编译的时候可以找到相应的声明，分别编译就不行了呢？

错误很明显，你分别编译的时候没有找到相应的声明。

文件关联了啊    找个。h  公用的放里面就好了


Question: 求助:怎么读取文件里面的内容,谢谢2!

if (strlen(ff)>=3 && 0==strncmp(ff+strlen(ff)-3,"jkl",3))//最后 3 位是否为 jkl

引用 10 楼 lshlsh2008 的回复:谢谢各位大哥! 还有个问题 char ff[100];  ff 赋值为 "asd21344gh6jkl"  我希望判断 ff  的前3 位是否为 asd , 第 5和6位是否为 13  最后 3 位是否为 jkl  这个程序要怎么写? 谢谢! char ff[100];  strcpy(ff,"asd21344gh6jkl");//ff 赋值为 "asd21344gh6jkl"  if (0==strncmp(ff,"asd",3))//判断 ff  的前3 位是否为 asd , if (0==strncmp(ff+4,"13",2))//第 5和6位是否为 13 if (strlen(ff)>3 && 0==strncmp(ff+strlen(ff)-3,"jkl",3))//最后 3 位是否为 jkl

除了 fopen第二个参数有问题外, 读的方式也要注意,fread是读二进制的,如果是读的是文本文件那就不成了

有时候一个很明显的错误，但是自己就是看不出来，别人一眼就发现了。

fopen fwrite fread fclose 一体的操作，多看看哈

引用 4 楼 CarlXie 的回复:大神，您这是读文件，还是写文件？ w表示写文件，每次调用都会把文件清空，当然你读出来的就是空了。  +1

fopen第2个参数不能瞎写！

.......... 这个写的吧

读文件，不应该是用SS =  fopen("c:\\1.txt","r")吗？


Question: DOS下 troboc3如何将两个.C文件连接成工程文件，求教

引用 13 楼 zhao4zhong1 的回复:试试Complie\Build all 还是那个linker error： bad object file record in module C:\bc\lib\cs.lib  源文件是.c文件，不知道BCB打开.c文件要改部分代码？

试试Complie\Build all

引用 11 楼 zhao4zhong1 的回复:[quote=引用 10 楼 dxwsdosdo 的回复:] make的时候遇到了bad object file record in module C:\bc\lib\cs.lib ,这是个什么错误呢 偶遇到类似问题都是用 “每次用/*...*/注释掉不同部分再重新编译，直到定位到具体语法出错的位置。” 的方法解决的。  或者请改用BC++3.1[/quote] 您好，后来就是采用的BC++3.1出现的那个问题，不知道您以前有没有遇到过，求助。

引用 10 楼 dxwsdosdo 的回复:make的时候遇到了bad object file record in module C:\bc\lib\cs.lib ,这是个什么错误呢 偶遇到类似问题都是用 “每次用/*...*/注释掉不同部分再重新编译，直到定位到具体语法出错的位置。” 的方法解决的。  或者请改用BC++3.1

按照楼上说的这个问题已经好了，现在又有了bad object file record in module C:\bc\lib\cs.lib ,这是个什么错误呢

楼上这个试试。。

先在一个目录下建立一个工程文件(.prj），例如：E:\test.prj，然后打开在里面写上你要编译的各个文件（包括其所在目录），例如：E:\test1.c E:\test2.c E:\test3.c E:\test.h 菜单（Menu）-->工程（Project）-->工程名称（Project Name），写下工程名称，例如，test.prj 然后，菜单（Menu）-->编译（Compile）-->主要的C文件（Primary  C file），填写你的主要C文件（即含有main()的那个文件） 编译成功，再菜单（Menu）-->编译（Compile）-->制作EXE文件（Make EXE file），通过后再菜单（Menu）-->编译（Compile）-->连接EXE文件(Link EXE file），这样就应该可以了。

是不是有个Build菜单项？

现在有两个C文件，但是不知道怎么链接到一个工程下面。。。

TurboC3不知道和BC++3.1是否一样。 Project菜单看一下。  bc++3.1 帮助里面对每个函数都有一小段能拷贝出来运行看效果的例子程序。非常适合初学C语言。相比较而言VC带的帮助MSDN就没有。http://download.csdn.net/source/2805028

需要链结   光编译不行吧

现在知道在TC3下可以open project  但是不知道怎么连接两个.C文件


Question: 关于‘\0’和NULL的问题

引用 74 楼 FrankHB1989 的回复:如果够格的话，你要拉branch叫人陪你消遣也行，至少的前提： 1.搞清楚你是什么斤两。 2.搞清楚谁都没义务给你撸码。 3.明确需求。别人没兴趣也没义务逗你玩。 4.别给别人制造麻烦（包括可能有辱国格的国际笑话）。 鉴于前提1都不成立（234看来也都不怎么能成立），所以没得玩了。 作为预防针，Linus这种coding撸瑟的话还是别引了。Code is cheap.（何况他自己都说编码没设计重要了。）  满口假仁义道德， 你从小的价值观谁帮你养成的？从小缺钙，长大缺爱？

引用 74 楼 FrankHB1989 的回复:如果够格的话，你要拉branch叫人陪你消遣也行，至少的前提： 1.搞清楚你是什么斤两。 2.搞清楚谁都没义务给你撸码。 3.明确需求。别人没兴趣也没义务逗你玩。 4.别给别人制造麻烦（包括可能有辱国格的国际笑话）。 鉴于前提1都不成立（234看来也都不怎么能成立），所以没得玩了。 作为预防针，Linus这种coding撸瑟的话还是别引了。Code is cheap.（何况他自己都说编码没设计重要了。）  分分钟让你明白什么是编程。你他妈也就跟方舟子同一个货色，BB帝。

引用 74 楼 FrankHB1989 的回复:如果够格的话，你要拉branch叫人陪你消遣也行，至少的前提： 1.搞清楚你是什么斤两。 2.搞清楚谁都没义务给你撸码。 3.明确需求。别人没兴趣也没义务逗你玩。 4.别给别人制造麻烦（包括可能有辱国格的国际笑话）。 鉴于前提1都不成立（234看来也都不怎么能成立），所以没得玩了。 作为预防针，Linus这种coding撸瑟的话还是别引了。Code is cheap.（何况他自己都说编码没设计重要了。）  来加我QQ，装你妈逼，理论帝？？？ 敢不敢秀秀你的身份？知名企业？一个语法可以让你如此长自信？  你够种就来solo敲代码。  POJ， 随机题号，看谁先先出来。不敢我就求你别继续BB了。

引用 75 楼 TBWood 的回复:[quote=引用 74 楼 FrankHB1989 的回复:] 如果够格的话，你要拉branch叫人陪你消遣也行，至少的前提： 1.搞清楚你是什么斤两。 2.搞清楚谁都没义务给你撸码。 3.明确需求。别人没兴趣也没义务逗你玩。 4.别给别人制造麻烦（包括可能有辱国格的国际笑话）。 鉴于前提1都不成立（234看来也都不怎么能成立），所以没得玩了。 作为预防针，Linus这种coding撸瑟的话还是别引了。Code is cheap.（何况他自己都说编码没设计重要了。）  来加我QQ，装你妈逼，理论帝？？？ 敢不敢秀秀你的身份？知名企业？一个语法可以让你如此长自信？  你够种就来solo敲代码。  POJ， 随机题号，看谁先先出来。不敢我就求你别继续BB了。 [/quote] 瞧瞧，算我有先见之明，就只会拿撸码来BB了吧。 连什么叫语法都不懂就别瞎BB了。 POJ？嘛，上次登录是两年前，ID倒是还在……不巧，本屌现在没心情艹你，你还是自己捡肥皂吧。  引用 76 楼 TBWood 的回复:分分钟让你明白什么是编程。你他妈也就跟方舟子同一个货色，BB帝。 省省吧，你还是别浪费氧气了。 方是民纵然逗比，好歹也比你有常识些，在自己不懂的地方不会大声掌嘴（虽然也不是没有）。  引用 77 楼 TBWood 的回复:满口假仁义道德， 你从小的价值观谁帮你养成的？从小缺钙，长大缺爱？ 然后？你就真仁义道德了？说起来frankhb1989_tadie还不就是你注册的么。就这种表面功夫都做不好还搞双重标准，不又在掌嘴了么，还有脸说什么价值观？2333。 我给你打破三连了你可以接着在这嚷嚷，感谢我吧。

引用 69 楼 TBWood 的回复:[quote=引用 66 楼 FrankHB1989 的回复:] [quote=引用 65 楼 TBWood 的回复:] [quote=引用 64 楼 FrankHB1989 的回复:] [quote=引用 62 楼 TBWood 的回复:] [quote=引用 61 楼 sholber 的回复:] [quote=引用 60 楼 TBWood 的回复:] 唉，站在和谐讨论，为楼主解决问题的角度上去回答问题，都是好样的，无关于对错。 证明自己对，不一定要踩在别人的头上，不一定要通过否定别人来肯定自己。 已经遇到好几个这样的人了，见贤则学，不贤而省己。 和稀泥更可恶哟~~ 别人指出你的错误，那是为你好，也是为了防止误导更多的人，所以，那不是否定，也不是单纯的肯定自己。说你错了，那不意味着骑在你头上，老虎屁股摸不得，是不好的作风。这个“踩”和“否定”用得不对，因为很多人在指出别人错误的时候，并没有骂人，也没跳脚，只是语气强硬了点而已。你错了，我可以让你错一辈子，我能指出，已经很可贵了，难道还要毕恭毕敬地指出来？那我干嘛要指出来。 见贤则学，不贤而省己。[/quote] 我了个去，我真不懂，我错在哪里了？ 和稀泥又从何谈起。 人说话还没个语境么？ 我说NULL 是地址，0x0000000访问出错，你那个*p=0本来就会访问出错。还问我会不会出错，难道你的编译器不会？ 我说'\0' 是字符串结尾标识符，你偏要说还可以用 int a ='\0'。 那我还可以 用 int a='x' 呢，你能说'x'不是不是字符吗。const int a我不知道又和我说的有什么关系，呵呵，知识真渊博。 下次别人说'x' 是字符，你说他乱说，'x'  是字符吗，还可以用做数字。有意思？ 我说'\0'做字符时，是内存数据，是有分配内存的，就是告诉楼主，下次用到字符串的时候别忘记还有个'\0'字符也占内存。 因为我想到有同学问我的他遇到的一道面试题，就是考的sizeof("12345")的内存分配。 NULL是常数0，C++之所以要定义这么一个宏，就是为了在语义上当作是空指针，没人会去写 int a=NULL（虽然也合法). 关于NULL和\0 从数值上来说明显一样，不然楼主就不会问了。既然问不同点，加上有了上面那些回答的语境，我给出了不同点就是语义上，一个是空地址，一个是字符串字符的答案，不是顺理成章？ 你的博学不一定要建立在否定别人之上，何况，大家都明白我的说的意思，还刻意的去装作那么严谨。 我知道你是想博得大家的肯定，但你应该把时间花在更有创新价值的回答上，而不是断章取义，咬文嚼字。 本人也就在大学阶段发了3篇EI,1篇SCI，加上在IEEESMC 2013英国国际会议上发表过演讲，本科也就拿到过ACM江苏省区选拔赛季军，也就拿过研究生国家奖学金，去年也就拿到阿里和携程，以及一系列其他小公司的offer。 虽然3年没来csdn活跃了，但是每次回答我都是理解了楼主的问题，然后结合其可能真正想问的东西，给予回答，不为其他的，就为闲暇之余互帮互助，互相感谢。[/quote] 如果你确信你懂实际上是怎么回事，但表达不清楚，也不用这么急着说啥。没人会有闲心就因为这个抓着你不放。 但是错了还要嘴硬，槽点漏洞一个接一个越攒越多，那么也怪不得别人了。 说NULL是地址就是常识性错误了。这个大版里面这点就跟语境没关系。NULL是不是0倒可以说是有些关系，C和C++不一样……但是麻烦看清楚这个版面说的是C。 *p=0本来就会访问出错是谁给你保证的。 而所谓说'\0'做字符时，是内存数据，是有分配内存的，这个老实说就是得回炉重修的水准。不管你撸出多少能用的码都一样。 发了3篇EI,1篇SCI能说明啥。算历史成就么。JTC1/SC36的专家C艹小儿科水准写书的我都看到过，按理说SC36和SC22之间的间隔比你说的要相关多了吧。 [/quote]  又见装逼bitlity。 嘴硬都来了，漏洞都来了。呵呵。 你知道你的语法错误多少吗？ 正常人能批评你？  p=NULL; *p=0; 没错？ 你确定你小学毕业？ 你是语文课代表？ 翻翻你之前给别人的回答，你知道你要被骂多少次吗？ 站在装逼的至高点来看别人的错误，站在弱智的水平看待自己的错误？ 这些说明或者不能说明啥我不知道，我只知道你写不出来。你以为paper是成就你知识体系的路边小摊故事会？ 凤姐看完《读者》就说自己前300年，后300年，无人能敌了，你又是看了什么“天书”，如此的有自信？  你知道有句话叫做： YOU CAN YOU UP,  NO CAN NO BB？  NULL 在很多标准C++库文件中都定义成  ((void *)0)。 见http://msdn.microsoft.com/en-us/library/43t8xk57.aspx 当然，你自己可以定义成 #define NULL 100000 我说NULL 是 0地址的代写，有点常识的人，都会知道意思是指NULL的常规用法。 我就不懂了，我这么说，难道是毫无根据，自编自撰？  你学过高等数学？学过反推法么？   关于字符'\0' 我解释过了，跟你这种咬文嚼字的人解释也是白费，要咬文嚼字，你。 http://baike.baidu.com/link?url=hnfZv167VbP0X08t1BNorR8dKP1_arXaUZNZQ-jeiPDdYJNuzlY29gBRmJAt87Tj 这是ASCII字符码的定义，看看0字符后面写的三个大字 “空字符”。 我说分配内存是告诉楼主字符串中空字符是占内存的。  我看上面说了那么多，随便留了句话，总结下常规用法，我承认是有不严谨的地方，每个人都会有认识上的盲点，不可能什么都知道，我只是把知道的说出来，我说错了，不得分，说的对了得全分，说的有道理，得部分分。我就不懂了，你跑来装什么B？  我也不吹我多牛逼了吧，像你这样的所谓的“网络散客”很多，多是看评论，然后专门去抠字眼，以否定别人来肯定自己，从而获得一点安慰感。  我不是笑话你，就你，也就0.1桶水，你回的帖子也就那点东西。  代码不是你能吹，能吹就能写的，懂？  你把C++ Primer看100遍，你能写出个排序出来？  代码是逻辑，语言只是工具。  你撑死也就是个修车的，不能说车技好，你懂么？  随便一道OJ题，让你半小时，你都得跪。  [/quote] 偷换概念惯了是吧。问你谁保证出错的，你来个反问没错？ 疑问句都看不懂，你确定你小学毕业？ 我现在确信你连语法(syntax, not grammar) 都不懂了，更别提分清语法跟语义了……难怪还会不预设前提给UB擦脸。我再问你一遍，谁给你提供保证让你YY程序行为的？如果想说具体环境，提个core、segfault还是SEH、AV都不会，太水了吧？ 好个YOU CAN YOU UP，我怎么没在WG21里见到你继续装了？ 虽然没有辱国格是好事，不过存在感过剩在这里发泄也不痛快是吧。 NULL 在很多标准C++库文件中都定义成  ((void *)0)？ 还翻个毛线MSDN。我就问你，看见过了#ifdef __cplusplus了没有？ 你学过高等数学？知道高数关什么反推法个蛋事？我为了跟你装是不是还要问问你有没有学过非标准分析？ 有点常识的人都知道地址和指针的区别是什么。当然，谭×流座下的自然除外。你还一口一个NULL一口一个地址不分？ 行，我是就0.1桶水。我眼前都闹旱灾了。 C++ Primer的术语被人乱用前两天刚有被我教育过的，可惜你混CSDN的没撞枪口上啊。还特么100遍，真有脸说。TC++PL我也就有耐心看上100来页而已，还正在纠结是不是腾出点时间给BS发个邮件指出他的FAQ上的错免得继续欺负你这样装都装不会的失败新手呢。 所以说，知道为什么我还是有底气看穿你没啥水么。 代码是逻辑这种空话就欺负下HR小姑娘吧。你要扯一阶逻辑还是模态逻辑？先把形式逻辑修理好，懂什么叫充足理由律再装。 扯什么语言只是工具的，没水也正常。反正会这样吹的，只能说明当下基本也没摆脱自己是语言和工具的奴隶的状态而已。赶快接受yinwang好♂好♂教♂育一番吧。 OJ？当年ZOJ刷了300多题去HIT现场旅游了一番就觉得无聊懒得玩了。你玩过？ 最后，劝你既然顶着单位的名字，自己又斤两不足，还是低调点的好。免得最后谁的脸挂不住。  [/quote]  装你妈的逼。来加我Q: 542561233. 或者上开源GIT，拉分支来比比。  还你妈逼"欠缺礼数"，敢来实名？看看你的真实吊丝身份？ 蓝翔技工学院毕业？   [/quote] 你不够资格。 关于C和C++的水平，你烂到啥程度已经没话说了吧。我就当默认了。 GitHub上有的东西应该很好找。有空自己锻炼下搜索能力吧，小碰友。 嘛，之前顶着“携程软件工程师”我知会过了一下携程的，结果现在又改成“支付宝软件工程师”了？看来也不用麻烦我在这方面上动手了。真有本事随便跳的话也不必要在这边跳来跳去了吧。

有些人就是喜欢咬文嚼字。太幼稚了。 程序员的平均情商被拉低了好多。 如果告诉他们，这些定义都是当成设计者拍脑袋定的，没啥高深的逻辑推理， 而后辈们在此争得面红耳赤，悲哀啊。

引用 68 楼 FrankHB1989 的回复:这么久没回答LZ的问题似有欠缺礼数。 那么这里需要有几点注意的。 1.NULL由实现定义，只说是空指针常量，也就是值等于0的整数常量表达式或这样的表达式转换成void*的值，没说类型一定是什么。虽然一般典型的C实现中会是 (void*)0。总之根本不是常量表达式也不保证是整数类型，所以不是。 2.‘\0’在C中类型是int，不像C++那样是char。所以如果字面上讲，也没法这么认为。 ASCII中值等于0的字符NUL，虽然也可以叫null character，但跟宏NULL显然是两回事。  还他妈的“虽然一般典型的”。。。。真你妈的specific，accruate，你看看自己以前的回复，这是你人生的巅峰吧？

引用 68 楼 FrankHB1989 的回复:这么久没回答LZ的问题似有欠缺礼数。 那么这里需要有几点注意的。 1.NULL由实现定义，只说是空指针常量，也就是值等于0的整数常量表达式或这样的表达式转换成void*的值，没说类型一定是什么。虽然一般典型的C实现中会是 (void*)0。总之根本不是常量表达式也不保证是整数类型，所以不是。 2.‘\0’在C中类型是int，不像C++那样是char。所以如果字面上讲，也没法这么认为。 ASCII中值等于0的字符NUL，虽然也可以叫null character，但跟宏NULL显然是两回事。  你他妈就在重复我的话，还边笔笔的说这么多废话，你这种人不正是 见人就喷，以此扬己，锋芒毕露的脑残么。

引用 66 楼 FrankHB1989 的回复:[quote=引用 65 楼 TBWood 的回复:] [quote=引用 64 楼 FrankHB1989 的回复:] [quote=引用 62 楼 TBWood 的回复:] [quote=引用 61 楼 sholber 的回复:] [quote=引用 60 楼 TBWood 的回复:] 唉，站在和谐讨论，为楼主解决问题的角度上去回答问题，都是好样的，无关于对错。 证明自己对，不一定要踩在别人的头上，不一定要通过否定别人来肯定自己。 已经遇到好几个这样的人了，见贤则学，不贤而省己。 和稀泥更可恶哟~~ 别人指出你的错误，那是为你好，也是为了防止误导更多的人，所以，那不是否定，也不是单纯的肯定自己。说你错了，那不意味着骑在你头上，老虎屁股摸不得，是不好的作风。这个“踩”和“否定”用得不对，因为很多人在指出别人错误的时候，并没有骂人，也没跳脚，只是语气强硬了点而已。你错了，我可以让你错一辈子，我能指出，已经很可贵了，难道还要毕恭毕敬地指出来？那我干嘛要指出来。 见贤则学，不贤而省己。[/quote] 我了个去，我真不懂，我错在哪里了？ 和稀泥又从何谈起。 人说话还没个语境么？ 我说NULL 是地址，0x0000000访问出错，你那个*p=0本来就会访问出错。还问我会不会出错，难道你的编译器不会？ 我说'\0' 是字符串结尾标识符，你偏要说还可以用 int a ='\0'。 那我还可以 用 int a='x' 呢，你能说'x'不是不是字符吗。const int a我不知道又和我说的有什么关系，呵呵，知识真渊博。 下次别人说'x' 是字符，你说他乱说，'x'  是字符吗，还可以用做数字。有意思？ 我说'\0'做字符时，是内存数据，是有分配内存的，就是告诉楼主，下次用到字符串的时候别忘记还有个'\0'字符也占内存。 因为我想到有同学问我的他遇到的一道面试题，就是考的sizeof("12345")的内存分配。 NULL是常数0，C++之所以要定义这么一个宏，就是为了在语义上当作是空指针，没人会去写 int a=NULL（虽然也合法). 关于NULL和\0 从数值上来说明显一样，不然楼主就不会问了。既然问不同点，加上有了上面那些回答的语境，我给出了不同点就是语义上，一个是空地址，一个是字符串字符的答案，不是顺理成章？ 你的博学不一定要建立在否定别人之上，何况，大家都明白我的说的意思，还刻意的去装作那么严谨。 我知道你是想博得大家的肯定，但你应该把时间花在更有创新价值的回答上，而不是断章取义，咬文嚼字。 本人也就在大学阶段发了3篇EI,1篇SCI，加上在IEEESMC 2013英国国际会议上发表过演讲，本科也就拿到过ACM江苏省区选拔赛季军，也就拿过研究生国家奖学金，去年也就拿到阿里和携程，以及一系列其他小公司的offer。 虽然3年没来csdn活跃了，但是每次回答我都是理解了楼主的问题，然后结合其可能真正想问的东西，给予回答，不为其他的，就为闲暇之余互帮互助，互相感谢。[/quote] 如果你确信你懂实际上是怎么回事，但表达不清楚，也不用这么急着说啥。没人会有闲心就因为这个抓着你不放。 但是错了还要嘴硬，槽点漏洞一个接一个越攒越多，那么也怪不得别人了。 说NULL是地址就是常识性错误了。这个大版里面这点就跟语境没关系。NULL是不是0倒可以说是有些关系，C和C++不一样……但是麻烦看清楚这个版面说的是C。 *p=0本来就会访问出错是谁给你保证的。 而所谓说'\0'做字符时，是内存数据，是有分配内存的，这个老实说就是得回炉重修的水准。不管你撸出多少能用的码都一样。 发了3篇EI,1篇SCI能说明啥。算历史成就么。JTC1/SC36的专家C艹小儿科水准写书的我都看到过，按理说SC36和SC22之间的间隔比你说的要相关多了吧。 [/quote]  又见装逼bitlity。 嘴硬都来了，漏洞都来了。呵呵。 你知道你的语法错误多少吗？ 正常人能批评你？  p=NULL; *p=0; 没错？ 你确定你小学毕业？ 你是语文课代表？ 翻翻你之前给别人的回答，你知道你要被骂多少次吗？ 站在装逼的至高点来看别人的错误，站在弱智的水平看待自己的错误？ 这些说明或者不能说明啥我不知道，我只知道你写不出来。你以为paper是成就你知识体系的路边小摊故事会？ 凤姐看完《读者》就说自己前300年，后300年，无人能敌了，你又是看了什么“天书”，如此的有自信？  你知道有句话叫做： YOU CAN YOU UP,  NO CAN NO BB？  NULL 在很多标准C++库文件中都定义成  ((void *)0)。 见http://msdn.microsoft.com/en-us/library/43t8xk57.aspx 当然，你自己可以定义成 #define NULL 100000 我说NULL 是 0地址的代写，有点常识的人，都会知道意思是指NULL的常规用法。 我就不懂了，我这么说，难道是毫无根据，自编自撰？  你学过高等数学？学过反推法么？   关于字符'\0' 我解释过了，跟你这种咬文嚼字的人解释也是白费，要咬文嚼字，你。 http://baike.baidu.com/link?url=hnfZv167VbP0X08t1BNorR8dKP1_arXaUZNZQ-jeiPDdYJNuzlY29gBRmJAt87Tj 这是ASCII字符码的定义，看看0字符后面写的三个大字 “空字符”。 我说分配内存是告诉楼主字符串中空字符是占内存的。  我看上面说了那么多，随便留了句话，总结下常规用法，我承认是有不严谨的地方，每个人都会有认识上的盲点，不可能什么都知道，我只是把知道的说出来，我说错了，不得分，说的对了得全分，说的有道理，得部分分。我就不懂了，你跑来装什么B？  我也不吹我多牛逼了吧，像你这样的所谓的“网络散客”很多，多是看评论，然后专门去抠字眼，以否定别人来肯定自己，从而获得一点安慰感。  我不是笑话你，就你，也就0.1桶水，你回的帖子也就那点东西。  代码不是你能吹，能吹就能写的，懂？  你把C++ Primer看100遍，你能写出个排序出来？  代码是逻辑，语言只是工具。  你撑死也就是个修车的，不能说车技好，你懂么？  随便一道OJ题，让你半小时，你都得跪。  [/quote] 偷换概念惯了是吧。问你谁保证出错的，你来个反问没错？ 疑问句都看不懂，你确定你小学毕业？ 我现在确信你连语法(syntax, not grammar) 都不懂了，更别提分清语法跟语义了……难怪还会不预设前提给UB擦脸。我再问你一遍，谁给你提供保证让你YY程序行为的？如果想说具体环境，提个core、segfault还是SEH、AV都不会，太水了吧？ 好个YOU CAN YOU UP，我怎么没在WG21里见到你继续装了？ 虽然没有辱国格是好事，不过存在感过剩在这里发泄也不痛快是吧。 NULL 在很多标准C++库文件中都定义成  ((void *)0)？ 还翻个毛线MSDN。我就问你，看见过了#ifdef __cplusplus了没有？ 你学过高等数学？知道高数关什么反推法个蛋事？我为了跟你装是不是还要问问你有没有学过非标准分析？ 有点常识的人都知道地址和指针的区别是什么。当然，谭×流座下的自然除外。你还一口一个NULL一口一个地址不分？ 行，我是就0.1桶水。我眼前都闹旱灾了。 C++ Primer的术语被人乱用前两天刚有被我教育过的，可惜你混CSDN的没撞枪口上啊。还特么100遍，真有脸说。TC++PL我也就有耐心看上100来页而已，还正在纠结是不是腾出点时间给BS发个邮件指出他的FAQ上的错免得继续欺负你这样装都装不会的失败新手呢。 所以说，知道为什么我还是有底气看穿你没啥水么。 代码是逻辑这种空话就欺负下HR小姑娘吧。你要扯一阶逻辑还是模态逻辑？先把形式逻辑修理好，懂什么叫充足理由律再装。 扯什么语言只是工具的，没水也正常。反正会这样吹的，只能说明当下基本也没摆脱自己是语言和工具的奴隶的状态而已。赶快接受yinwang好♂好♂教♂育一番吧。 OJ？当年ZOJ刷了300多题去HIT现场旅游了一番就觉得无聊懒得玩了。你玩过？ 最后，劝你既然顶着单位的名字，自己又斤两不足，还是低调点的好。免得最后谁的脸挂不住。  [/quote]  装你妈的逼。来加我Q: 542561233. 或者上开源GIT，拉分支来比比。  还你妈逼"欠缺礼数"，敢来实名？看看你的真实吊丝身份？ 蓝翔技工学院毕业？

引用 64 楼 FrankHB1989 的回复:[quote=引用 62 楼 TBWood 的回复:] [quote=引用 61 楼 sholber 的回复:] [quote=引用 60 楼 TBWood 的回复:] 唉，站在和谐讨论，为楼主解决问题的角度上去回答问题，都是好样的，无关于对错。 证明自己对，不一定要踩在别人的头上，不一定要通过否定别人来肯定自己。 已经遇到好几个这样的人了，见贤则学，不贤而省己。 和稀泥更可恶哟~~ 别人指出你的错误，那是为你好，也是为了防止误导更多的人，所以，那不是否定，也不是单纯的肯定自己。说你错了，那不意味着骑在你头上，老虎屁股摸不得，是不好的作风。这个“踩”和“否定”用得不对，因为很多人在指出别人错误的时候，并没有骂人，也没跳脚，只是语气强硬了点而已。你错了，我可以让你错一辈子，我能指出，已经很可贵了，难道还要毕恭毕敬地指出来？那我干嘛要指出来。 见贤则学，不贤而省己。[/quote] 我了个去，我真不懂，我错在哪里了？ 和稀泥又从何谈起。 人说话还没个语境么？ 我说NULL 是地址，0x0000000访问出错，你那个*p=0本来就会访问出错。还问我会不会出错，难道你的编译器不会？ 我说'\0' 是字符串结尾标识符，你偏要说还可以用 int a ='\0'。 那我还可以 用 int a='x' 呢，你能说'x'不是不是字符吗。const int a我不知道又和我说的有什么关系，呵呵，知识真渊博。 下次别人说'x' 是字符，你说他乱说，'x'  是字符吗，还可以用做数字。有意思？ 我说'\0'做字符时，是内存数据，是有分配内存的，就是告诉楼主，下次用到字符串的时候别忘记还有个'\0'字符也占内存。 因为我想到有同学问我的他遇到的一道面试题，就是考的sizeof("12345")的内存分配。 NULL是常数0，C++之所以要定义这么一个宏，就是为了在语义上当作是空指针，没人会去写 int a=NULL（虽然也合法). 关于NULL和\0 从数值上来说明显一样，不然楼主就不会问了。既然问不同点，加上有了上面那些回答的语境，我给出了不同点就是语义上，一个是空地址，一个是字符串字符的答案，不是顺理成章？ 你的博学不一定要建立在否定别人之上，何况，大家都明白我的说的意思，还刻意的去装作那么严谨。 我知道你是想博得大家的肯定，但你应该把时间花在更有创新价值的回答上，而不是断章取义，咬文嚼字。 本人也就在大学阶段发了3篇EI,1篇SCI，加上在IEEESMC 2013英国国际会议上发表过演讲，本科也就拿到过ACM江苏省区选拔赛季军，也就拿过研究生国家奖学金，去年也就拿到阿里和携程，以及一系列其他小公司的offer。 虽然3年没来csdn活跃了，但是每次回答我都是理解了楼主的问题，然后结合其可能真正想问的东西，给予回答，不为其他的，就为闲暇之余互帮互助，互相感谢。[/quote] 如果你确信你懂实际上是怎么回事，但表达不清楚，也不用这么急着说啥。没人会有闲心就因为这个抓着你不放。 但是错了还要嘴硬，槽点漏洞一个接一个越攒越多，那么也怪不得别人了。 说NULL是地址就是常识性错误了。这个大版里面这点就跟语境没关系。NULL是不是0倒可以说是有些关系，C和C++不一样……但是麻烦看清楚这个版面说的是C。 *p=0本来就会访问出错是谁给你保证的。 而所谓说'\0'做字符时，是内存数据，是有分配内存的，这个老实说就是得回炉重修的水准。不管你撸出多少能用的码都一样。 发了3篇EI,1篇SCI能说明啥。算历史成就么。JTC1/SC36的专家C艹小儿科水准写书的我都看到过，按理说SC36和SC22之间的间隔比你说的要相关多了吧。 [/quote]  又见装逼bitlity。 嘴硬都来了，漏洞都来了。呵呵。 你知道你的语法错误多少吗？ 正常人能批评你？  p=NULL; *p=0; 没错？ 你确定你小学毕业？ 你是语文课代表？ 翻翻你之前给别人的回答，你知道你要被骂多少次吗？ 站在装逼的至高点来看别人的错误，站在弱智的水平看待自己的错误？ 这些说明或者不能说明啥我不知道，我只知道你写不出来。你以为paper是成就你知识体系的路边小摊故事会？ 凤姐看完《读者》就说自己前300年，后300年，无人能敌了，你又是看了什么“天书”，如此的有自信？  你知道有句话叫做： YOU CAN YOU UP,  NO CAN NO BB？  NULL 在很多标准C++库文件中都定义成  ((void *)0)。 见http://msdn.microsoft.com/en-us/library/43t8xk57.aspx 当然，你自己可以定义成 #define NULL 100000 我说NULL 是 0地址的代写，有点常识的人，都会知道意思是指NULL的常规用法。 我就不懂了，我这么说，难道是毫无根据，自编自撰？  你学过高等数学？学过反推法么？   关于字符'\0' 我解释过了，跟你这种咬文嚼字的人解释也是白费，要咬文嚼字，你。 http://baike.baidu.com/link?url=hnfZv167VbP0X08t1BNorR8dKP1_arXaUZNZQ-jeiPDdYJNuzlY29gBRmJAt87Tj 这是ASCII字符码的定义，看看0字符后面写的三个大字 “空字符”。 我说分配内存是告诉楼主字符串中空字符是占内存的。  我看上面说了那么多，随便留了句话，总结下常规用法，我承认是有不严谨的地方，每个人都会有认识上的盲点，不可能什么都知道，我只是把知道的说出来，我说错了，不得分，说的对了得全分，说的有道理，得部分分。我就不懂了，你跑来装什么B？  我也不吹我多牛逼了吧，像你这样的所谓的“网络散客”很多，多是看评论，然后专门去抠字眼，以否定别人来肯定自己，从而获得一点安慰感。  我不是笑话你，就你，也就0.1桶水，你回的帖子也就那点东西。  代码不是你能吹，能吹就能写的，懂？  你把C++ Primer看100遍，你能写出个排序出来？  代码是逻辑，语言只是工具。  你撑死也就是个修车的，不能说车技好，你懂么？  随便一道OJ题，让你半小时，你都得跪。

行了，不逗你玩了，就65楼的低级硬伤先正面上你。 WG21/N3936 18.2 3 The macro NULL is an implementation-defined C++ null pointer constant in this International Standard (4.10).194 194) Possible definitions include 0 and 0L, but not (void*)0. 懂得怎么找打脸材料了么？

引用 65 楼 TBWood 的回复:[quote=引用 64 楼 FrankHB1989 的回复:] [quote=引用 62 楼 TBWood 的回复:] [quote=引用 61 楼 sholber 的回复:] [quote=引用 60 楼 TBWood 的回复:] 唉，站在和谐讨论，为楼主解决问题的角度上去回答问题，都是好样的，无关于对错。 证明自己对，不一定要踩在别人的头上，不一定要通过否定别人来肯定自己。 已经遇到好几个这样的人了，见贤则学，不贤而省己。 和稀泥更可恶哟~~ 别人指出你的错误，那是为你好，也是为了防止误导更多的人，所以，那不是否定，也不是单纯的肯定自己。说你错了，那不意味着骑在你头上，老虎屁股摸不得，是不好的作风。这个“踩”和“否定”用得不对，因为很多人在指出别人错误的时候，并没有骂人，也没跳脚，只是语气强硬了点而已。你错了，我可以让你错一辈子，我能指出，已经很可贵了，难道还要毕恭毕敬地指出来？那我干嘛要指出来。 见贤则学，不贤而省己。[/quote] 我了个去，我真不懂，我错在哪里了？ 和稀泥又从何谈起。 人说话还没个语境么？ 我说NULL 是地址，0x0000000访问出错，你那个*p=0本来就会访问出错。还问我会不会出错，难道你的编译器不会？ 我说'\0' 是字符串结尾标识符，你偏要说还可以用 int a ='\0'。 那我还可以 用 int a='x' 呢，你能说'x'不是不是字符吗。const int a我不知道又和我说的有什么关系，呵呵，知识真渊博。 下次别人说'x' 是字符，你说他乱说，'x'  是字符吗，还可以用做数字。有意思？ 我说'\0'做字符时，是内存数据，是有分配内存的，就是告诉楼主，下次用到字符串的时候别忘记还有个'\0'字符也占内存。 因为我想到有同学问我的他遇到的一道面试题，就是考的sizeof("12345")的内存分配。 NULL是常数0，C++之所以要定义这么一个宏，就是为了在语义上当作是空指针，没人会去写 int a=NULL（虽然也合法). 关于NULL和\0 从数值上来说明显一样，不然楼主就不会问了。既然问不同点，加上有了上面那些回答的语境，我给出了不同点就是语义上，一个是空地址，一个是字符串字符的答案，不是顺理成章？ 你的博学不一定要建立在否定别人之上，何况，大家都明白我的说的意思，还刻意的去装作那么严谨。 我知道你是想博得大家的肯定，但你应该把时间花在更有创新价值的回答上，而不是断章取义，咬文嚼字。 本人也就在大学阶段发了3篇EI,1篇SCI，加上在IEEESMC 2013英国国际会议上发表过演讲，本科也就拿到过ACM江苏省区选拔赛季军，也就拿过研究生国家奖学金，去年也就拿到阿里和携程，以及一系列其他小公司的offer。 虽然3年没来csdn活跃了，但是每次回答我都是理解了楼主的问题，然后结合其可能真正想问的东西，给予回答，不为其他的，就为闲暇之余互帮互助，互相感谢。[/quote] 如果你确信你懂实际上是怎么回事，但表达不清楚，也不用这么急着说啥。没人会有闲心就因为这个抓着你不放。 但是错了还要嘴硬，槽点漏洞一个接一个越攒越多，那么也怪不得别人了。 说NULL是地址就是常识性错误了。这个大版里面这点就跟语境没关系。NULL是不是0倒可以说是有些关系，C和C++不一样……但是麻烦看清楚这个版面说的是C。 *p=0本来就会访问出错是谁给你保证的。 而所谓说'\0'做字符时，是内存数据，是有分配内存的，这个老实说就是得回炉重修的水准。不管你撸出多少能用的码都一样。 发了3篇EI,1篇SCI能说明啥。算历史成就么。JTC1/SC36的专家C艹小儿科水准写书的我都看到过，按理说SC36和SC22之间的间隔比你说的要相关多了吧。 [/quote]  又见装逼bitlity。 嘴硬都来了，漏洞都来了。呵呵。 你知道你的语法错误多少吗？ 正常人能批评你？  p=NULL; *p=0; 没错？ 你确定你小学毕业？ 你是语文课代表？ 翻翻你之前给别人的回答，你知道你要被骂多少次吗？ 站在装逼的至高点来看别人的错误，站在弱智的水平看待自己的错误？ 这些说明或者不能说明啥我不知道，我只知道你写不出来。你以为paper是成就你知识体系的路边小摊故事会？ 凤姐看完《读者》就说自己前300年，后300年，无人能敌了，你又是看了什么“天书”，如此的有自信？  你知道有句话叫做： YOU CAN YOU UP,  NO CAN NO BB？  NULL 在很多标准C++库文件中都定义成  ((void *)0)。 见http://msdn.microsoft.com/en-us/library/43t8xk57.aspx 当然，你自己可以定义成 #define NULL 100000 我说NULL 是 0地址的代写，有点常识的人，都会知道意思是指NULL的常规用法。 我就不懂了，我这么说，难道是毫无根据，自编自撰？  你学过高等数学？学过反推法么？   关于字符'\0' 我解释过了，跟你这种咬文嚼字的人解释也是白费，要咬文嚼字，你。 http://baike.baidu.com/link?url=hnfZv167VbP0X08t1BNorR8dKP1_arXaUZNZQ-jeiPDdYJNuzlY29gBRmJAt87Tj 这是ASCII字符码的定义，看看0字符后面写的三个大字 “空字符”。 我说分配内存是告诉楼主字符串中空字符是占内存的。  我看上面说了那么多，随便留了句话，总结下常规用法，我承认是有不严谨的地方，每个人都会有认识上的盲点，不可能什么都知道，我只是把知道的说出来，我说错了，不得分，说的对了得全分，说的有道理，得部分分。我就不懂了，你跑来装什么B？  我也不吹我多牛逼了吧，像你这样的所谓的“网络散客”很多，多是看评论，然后专门去抠字眼，以否定别人来肯定自己，从而获得一点安慰感。  我不是笑话你，就你，也就0.1桶水，你回的帖子也就那点东西。  代码不是你能吹，能吹就能写的，懂？  你把C++ Primer看100遍，你能写出个排序出来？  代码是逻辑，语言只是工具。  你撑死也就是个修车的，不能说车技好，你懂么？  随便一道OJ题，让你半小时，你都得跪。  [/quote] 偷换概念惯了是吧。问你谁保证出错的，你来个反问没错？ 疑问句都看不懂，你确定你小学毕业？ 我现在确信你连语法(syntax, not grammar) 都不懂了，更别提分清语法跟语义了……难怪还会不预设前提给UB擦脸。我再问你一遍，谁给你提供保证让你YY程序行为的？如果想说具体环境，提个core、segfault还是SEH、AV都不会，太水了吧？ 好个YOU CAN YOU UP，我怎么没在WG21里见到你继续装了？ 虽然没有辱国格是好事，不过存在感过剩在这里发泄也不痛快是吧。 NULL 在很多标准C++库文件中都定义成  ((void *)0)？ 还翻个毛线MSDN。我就问你，看见过了#ifdef __cplusplus了没有？ 你学过高等数学？知道高数关什么反推法个蛋事？我为了跟你装是不是还要问问你有没有学过非标准分析？ 有点常识的人都知道地址和指针的区别是什么。当然，谭×流座下的自然除外。你还一口一个NULL一口一个地址不分？ 行，我是就0.1桶水。我眼前都闹旱灾了。 C++ Primer的术语被人乱用前两天刚有被我教育过的，可惜你混CSDN的没撞枪口上啊。还特么100遍，真有脸说。TC++PL我也就有耐心看上100来页而已，还正在纠结是不是腾出点时间给BS发个邮件指出他的FAQ上的错免得继续欺负你这样装都装不会的失败新手呢。 所以说，知道为什么我还是有底气看穿你没啥水么。 代码是逻辑这种空话就欺负下HR小姑娘吧。你要扯一阶逻辑还是模态逻辑？先把形式逻辑修理好，懂什么叫充足理由律再装。 扯什么语言只是工具的，没水也正常。反正会这样吹的，只能说明当下基本也没摆脱自己是语言和工具的奴隶的状态而已。赶快接受yinwang好♂好♂教♂育一番吧。 OJ？当年ZOJ刷了300多题去HIT现场旅游了一番就觉得无聊懒得玩了。你玩过？ 最后，劝你既然顶着单位的名字，自己又斤两不足，还是低调点的好。免得最后谁的脸挂不住。

引用 62 楼 TBWood 的回复:[quote=引用 61 楼 sholber 的回复:] [quote=引用 60 楼 TBWood 的回复:] 唉，站在和谐讨论，为楼主解决问题的角度上去回答问题，都是好样的，无关于对错。 证明自己对，不一定要踩在别人的头上，不一定要通过否定别人来肯定自己。 已经遇到好几个这样的人了，见贤则学，不贤而省己。 和稀泥更可恶哟~~ 别人指出你的错误，那是为你好，也是为了防止误导更多的人，所以，那不是否定，也不是单纯的肯定自己。说你错了，那不意味着骑在你头上，老虎屁股摸不得，是不好的作风。这个“踩”和“否定”用得不对，因为很多人在指出别人错误的时候，并没有骂人，也没跳脚，只是语气强硬了点而已。你错了，我可以让你错一辈子，我能指出，已经很可贵了，难道还要毕恭毕敬地指出来？那我干嘛要指出来。 见贤则学，不贤而省己。[/quote] 我了个去，我真不懂，我错在哪里了？ 和稀泥又从何谈起。 人说话还没个语境么？ 我说NULL 是地址，0x0000000访问出错，你那个*p=0本来就会访问出错。还问我会不会出错，难道你的编译器不会？ 我说'\0' 是字符串结尾标识符，你偏要说还可以用 int a ='\0'。 那我还可以 用 int a='x' 呢，你能说'x'不是不是字符吗。const int a我不知道又和我说的有什么关系，呵呵，知识真渊博。 下次别人说'x' 是字符，你说他乱说，'x'  是字符吗，还可以用做数字。有意思？ 我说'\0'做字符时，是内存数据，是有分配内存的，就是告诉楼主，下次用到字符串的时候别忘记还有个'\0'字符也占内存。 因为我想到有同学问我的他遇到的一道面试题，就是考的sizeof("12345")的内存分配。 NULL是常数0，C++之所以要定义这么一个宏，就是为了在语义上当作是空指针，没人会去写 int a=NULL（虽然也合法). 关于NULL和\0 从数值上来说明显一样，不然楼主就不会问了。既然问不同点，加上有了上面那些回答的语境，我给出了不同点就是语义上，一个是空地址，一个是字符串字符的答案，不是顺理成章？ 你的博学不一定要建立在否定别人之上，何况，大家都明白我的说的意思，还刻意的去装作那么严谨。 我知道你是想博得大家的肯定，但你应该把时间花在更有创新价值的回答上，而不是断章取义，咬文嚼字。 本人也就在大学阶段发了3篇EI,1篇SCI，加上在IEEESMC 2013英国国际会议上发表过演讲，本科也就拿到过ACM江苏省区选拔赛季军，也就拿过研究生国家奖学金，去年也就拿到阿里和携程，以及一系列其他小公司的offer。 虽然3年没来csdn活跃了，但是每次回答我都是理解了楼主的问题，然后结合其可能真正想问的东西，给予回答，不为其他的，就为闲暇之余互帮互助，互相感谢。[/quote] 如果你确信你懂实际上是怎么回事，但表达不清楚，也不用这么急着说啥。没人会有闲心就因为这个抓着你不放。 但是错了还要嘴硬，槽点漏洞一个接一个越攒越多，那么也怪不得别人了。 说NULL是地址就是常识性错误了。这个大版里面这点就跟语境没关系。NULL是不是0倒可以说是有些关系，C和C++不一样……但是麻烦看清楚这个版面说的是C。 *p=0本来就会访问出错是谁给你保证的。 而所谓说'\0'做字符时，是内存数据，是有分配内存的，这个老实说就是得回炉重修的水准。不管你撸出多少能用的码都一样。 发了3篇EI,1篇SCI能说明啥。算历史成就么。JTC1/SC36的专家C艹小儿科水准写书的我都看到过，按理说SC36和SC22之间的间隔比你说的要相关多了吧。

引用 61 楼 sholber 的回复:[quote=引用 60 楼 TBWood 的回复:] 唉，站在和谐讨论，为楼主解决问题的角度上去回答问题，都是好样的，无关于对错。 证明自己对，不一定要踩在别人的头上，不一定要通过否定别人来肯定自己。 已经遇到好几个这样的人了，见贤则学，不贤而省己。 和稀泥更可恶哟~~ 别人指出你的错误，那是为你好，也是为了防止误导更多的人，所以，那不是否定，也不是单纯的肯定自己。说你错了，那不意味着骑在你头上，老虎屁股摸不得，是不好的作风。这个“踩”和“否定”用得不对，因为很多人在指出别人错误的时候，并没有骂人，也没跳脚，只是语气强硬了点而已。你错了，我可以让你错一辈子，我能指出，已经很可贵了，难道还要毕恭毕敬地指出来？那我干嘛要指出来。 见贤则学，不贤而省己。[/quote] 我了个去，我真不懂，我错在哪里了？ 和稀泥又从何谈起。 人说话还没个语境么？ 我说NULL 是地址，0x0000000访问出错，你那个*p=0本来就会访问出错。还问我会不会出错，难道你的编译器不会？ 我说'\0' 是字符串结尾标识符，你偏要说还可以用 int a ='\0'。 那我还可以 用 int a='x' 呢，你能说'x'不是不是字符吗。const int a我不知道又和我说的有什么关系，呵呵，知识真渊博。 下次别人说'x' 是字符，你说他乱说，'x'  是字符吗，还可以用做数字。有意思？ 我说'\0'做字符时，是内存数据，是有分配内存的，就是告诉楼主，下次用到字符串的时候别忘记还有个'\0'字符也占内存。 因为我想到有同学问我的他遇到的一道面试题，就是考的sizeof("12345")的内存分配。 NULL是常数0，C++之所以要定义这么一个宏，就是为了在语义上当作是空指针，没人会去写 int a=NULL（虽然也合法). 关于NULL和\0 从数值上来说明显一样，不然楼主就不会问了。既然问不同点，加上有了上面那些回答的语境，我给出了不同点就是语义上，一个是空地址，一个是字符串字符的答案，不是顺理成章？ 你的博学不一定要建立在否定别人之上，何况，大家都明白我的说的意思，还刻意的去装作那么严谨。 我知道你是想博得大家的肯定，但你应该把时间花在更有创新价值的回答上，而不是断章取义，咬文嚼字。 本人也就在大学阶段发了3篇EI,1篇SCI，加上在IEEESMC 2013英国国际会议上发表过演讲，本科也就拿到过ACM江苏省区选拔赛季军，也就拿过研究生国家奖学金，去年也就拿到阿里和携程，以及一系列其他小公司的offer。 虽然3年没来csdn活跃了，但是每次回答我都是理解了楼主的问题，然后结合其可能真正想问的东西，给予回答，不为其他的，就为闲暇之余互帮互助，互相感谢。

引用 62 楼 TBWood 的回复:[quote=引用 61 楼 sholber 的回复:] [quote=引用 60 楼 TBWood 的回复:] 唉，站在和谐讨论，为楼主解决问题的角度上去回答问题，都是好样的，无关于对错。 证明自己对，不一定要踩在别人的头上，不一定要通过否定别人来肯定自己。 已经遇到好几个这样的人了，见贤则学，不贤而省己。 和稀泥更可恶哟~~ 别人指出你的错误，那是为你好，也是为了防止误导更多的人，所以，那不是否定，也不是单纯的肯定自己。说你错了，那不意味着骑在你头上，老虎屁股摸不得，是不好的作风。这个“踩”和“否定”用得不对，因为很多人在指出别人错误的时候，并没有骂人，也没跳脚，只是语气强硬了点而已。你错了，我可以让你错一辈子，我能指出，已经很可贵了，难道还要毕恭毕敬地指出来？那我干嘛要指出来。 见贤则学，不贤而省己。[/quote] 我了个去，我真不懂，我错在哪里了？ 和稀泥又从何谈起。 人说话还没个语境么？ 我说NULL 是地址，0x0000000访问出错，你那个*p=0本来就会访问出错。还问我会不会出错，难道你的编译器不会？ 我说'\0' 是字符串结尾标识符，你偏要说还可以用 int a ='\0'。 那我还可以 用 int a='x' 呢，你能说'x'不是不是字符吗。const int a我不知道又和我说的有什么关系，呵呵，知识真渊博。 下次别人说'x' 是字符，你说他乱说，'x'  是字符吗，还可以用做数字。有意思？ 我说'\0'做字符时，是内存数据，是有分配内存的，就是告诉楼主，下次用到字符串的时候别忘记还有个'\0'字符也占内存。 因为我想到有同学问我的他遇到的一道面试题，就是考的sizeof("12345")的内存分配。 NULL是常数0，C++之所以要定义这么一个宏，就是为了在语义上当作是空指针，没人会去写 int a=NULL（虽然也合法). 关于NULL和\0 从数值上来说明显一样，不然楼主就不会问了。既然问不同点，加上有了上面那些回答的语境，我给出了不同点就是语义上，一个是空地址，一个是字符串字符的答案，不是顺理成章？ 你的博学不一定要建立在否定别人之上，何况，大家都明白我的说的意思，还刻意的去装作那么严谨。 我知道你是想博得大家的肯定，但你应该把时间花在更有创新价值的回答上，而不是断章取义，咬文嚼字。 本人也就在大学阶段发了3篇EI,1篇SCI，加上在IEEESMC 2013英国国际会议上发表过演讲，本科也就拿到过ACM江苏省区选拔赛季军，也就拿过研究生国家奖学金，去年也就拿到阿里和携程，以及一系列其他小公司的offer。 虽然3年没来csdn活跃了，但是每次回答我都是理解了楼主的问题，然后结合其可能真正想问的东西，给予回答，不为其他的，就为闲暇之余互帮互助，互相感谢。[/quote] 我怎么感觉你的意思是“我大学毕业我跟谁说过” 你也是有成就的人，所以，更应该懂得严谨的价值。我不相信不严谨就能获得这么多成就。别的就不多说了。

引用 60 楼 TBWood 的回复:唉，站在和谐讨论，为楼主解决问题的角度上去回答问题，都是好样的，无关于对错。 证明自己对，不一定要踩在别人的头上，不一定要通过否定别人来肯定自己。 已经遇到好几个这样的人了，见贤则学，不贤而省己。 和稀泥更可恶哟~~ 别人指出你的错误，那是为你好，也是为了防止误导更多的人，所以，那不是否定，也不是单纯的肯定自己。说你错了，那不意味着骑在你头上，老虎屁股摸不得，是不好的作风。这个“踩”和“否定”用得不对，因为很多人在指出别人错误的时候，并没有骂人，也没跳脚，只是语气强硬了点而已。你错了，我可以让你错一辈子，我能指出，已经很可贵了，难道还要毕恭毕敬地指出来？那我干嘛要指出来。 见贤则学，不贤而省己。

引用 58 楼 TBWood 的回复:[quote=引用 57 楼 sholber 的回复:] [quote=引用 54 楼 TBWood 的回复:] [quote=引用 53 楼 sholber 的回复:] [quote=引用 52 楼 TBWood 的回复:] [quote=引用 51 楼 sholber 的回复:] [quote=引用 50 楼 TBWood 的回复:] NULL 是 0地址的代写。 如果你尝试防伪 0x00000000 就会提示错误。 '\0' 是字符串结尾符，也就是000000，是有内存分配的。  简单来说，一个是地址，一个是内存数据。 int * pi = 0; * pi = 0; 象这样访问会提示什么错误？ int a [2] = {'\0', '\0'}; 以上，字符串在哪里？ const int i = '\0'; 如果程序中没有引用过i的地址，标准允许C的实现不为i分配任何内存。在这种情况下，何来“是有内存分配的”？[/quote]   啥意思？  int * pi = 0; * pi = 0; 象这样访问会提示什么错误？  难道不会报错？   你妈让你多穿点衣服，外面冷，就代表外面真的冷？  在白话小说里咬文嚼字以表现自己的严谨性？  '\0' 一般用来代表字符串结尾符，咬文嚼字有意思？ 难道还要因为这个问题拉分支，solo 写代码？ 我说的占内存，自然也是字符串中。 sizeof("12345")中的'\0' 难道不分配内存？   [/quote] 不咬文嚼字你当你写小说哪？唵？ 你那个“一般”也是刚才加的，早干嘛了？ 表达式sizeof("12345")中，"12345"是不求值的，不求值分配啥内存？其实sizeof("12345")直接被编译器生成常量6了。所以你可别辩了，越辩漏洞越多，我还得费力帮你纠正。[/quote]  You think you are full of niubility, actually you just have zhuangbility.  注意自己的吊丝程序员形象好吗？ 别装的那么高富帅。 摸摸胸口问问自己，你身边的朋友有几个批评过你的？  你妈关心你，还得用高等数学帮你算温度？  还你妈的别bian了，你要吓尿我么？  编译器生成常量？就不知道编译器都知道的东西，你个B不知道？ 你就一找骂的货色。  看看你上面对别人的回复，唉，素质就不说了，整一个喷子。  我断定你本科以下学历。    [/quote] 这段话正好说明了你的素质是啥。就算朕的素质不高，你也是乌鸦笑猪黑，你没觉得吗？朕学历不高，但是朕有理有据，你学历高，还说错了，你说你是个啥？[/quote]  "朕" 都来了，不得不承认你挺有理想的。  猜学历只是说明我希望你对自己代表的群总负起责任，不要见人就喷，创建和谐社会。  我说错了？ 马克思主义原理学过么？ 真理的范围性知道么？ 量子力学说过牛顿定理错了么？  呵呵 [/quote] 你对了，你对了好吧。我学历低，但我还知道是“群众”不是“群总”。算了算了，散了吧。你坚持你的观点吧，就算我对了，或者你对了，对我有什么好处？ 总结：你对了！


Question: 为什么双击debug里的exe文件一闪就没了？

因为程序执行完了就退出了

在 return 前面加一个getchar 函数就欧克了

双击是在windows下开一个窗口来运行，所有的输出都是输出到这个窗口的。程序运行结束后窗口句柄释放，所有的输出就一起销毁了。 如果想查看程序输出的话，可以通过cmd命令启动一个窗口，然后在里面通过命令行来启动可执行程序，那么输出就会输出到当前窗口。因为这个窗口并不是执行程序创建，所以不会随着程序的结束而销毁，可以保留之前的输出。

加个暂停语句吧，在return前，system("pause");

建议在cmd窗口中执行以下命令： cd /d "exe文件所在盘符和目录" "exe文件名"

cmd,然后在命令窗口看

加  getchar()   不然肯定运行完就要结束的

估计是Consol 的exe文件， 简单的在main()函数最后加getchar(); 来等待输入，让程序停住！~

运行完毕了当然要关闭了，你有没有设置断点或者让它停下来的语句

引用 1 楼 user-10 的回复:楼主别卖萌，是cli吗 不是，就是VC++6.0的debug文件里的exe

楼主别卖萌，是cli吗


Question: 百思不得其解

引用 4 楼 zhao4zhong1 的回复:printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。  在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 看不太懂，先研究研究

引用 5 楼 xia597289162 的回复:1、代码实现将数据存在一个文件中，下次运行的时候自动调用 写文件很简单， fopen， fwrite， fread。每次启动程序你先读文件，读取预设的值。  2、每个选项运行完了多一个返回主菜单的选项 返回很简单。goto一下，或者printf("f)Quit\n"); scanf("%c",&g); 在scanf前加个 while（1） 好久没上，先研究研究

引用 2 楼 xia597289162 的回复:void assign(struct plane *p) { int number,i; printf("Pleasr input the number of the seat you want to assign"); scanf("%d",&number); if(p[i].whether==1)   i=？？？？？？？？？？？？？？？？？？？？？ 都没初始化，怎么if 厉害，解决了！ 还有两个问题能帮忙解决一下么？ 还有一个问题，怎么让这个代码实现将数据存在一个文件中，下次运行的时候自动调用？ 怎么写让每个选项运行完了多一个返回主菜单的选项？

发现代码有点乱 试试 #include <stdio.h>   struct plane{ 	int number; 	int whether; 	char firstname[20]; 	char lastname[20]; };  struct plane seat[12];  /*void read(struct plane *p,char* filename) { 	file *pseat; 	if((pseat=fopen(filename,"rb"))==NULL) 		printf("Cant open %s file.\n",filename); 	else 	{ 		rewind(pseat); 		while(fread(p,sizeof (struct plane),12,pseat)==1) 			continue; 		fclose(pseat); 		printf("success"); 	} }*/  void init_plane_array(void) { 	for(int i= 0;i<12;i++) 	{ 		seat[i].number = i; 		seat[i].whether = 0; /*		seat[i].firstname="Allen"; 		seat[i].lastname="Iverson";*/ 	}  }  void num_emp_sea(struct plane *p) { 	int i,n; 	for(i=0,n=0;i<12;i++) 	{ 		if (p[i].whether==0) 			n++;	 	} 	printf("The number of empty seats are %d\n",n); }  void list_emp_sea(struct plane *p) { 	int i; 	for(i=0;i<12;i++) 	{ 		if (p[i].whether==0) 			printf("Seat NO.%d is empty.\n",i+1); 	} }  void list_sea(struct plane *p) { 	int i; 	for(i=0;i<12;i++) 	{ 		printf("Seat No.%d is ",i+1); 		if (p->whether==0) 			printf("empty\n"); 		else 			printf("full"); 	} }  void assign(struct plane *p) { 	int number,i; 	printf("Pleasr input the number of the seat you want to assign"); 	scanf("%d",&number); 	if(p[i].whether==1) 		printf("This seat is assigned"); 	else 	{ 		printf("Please input your first name\n"); 		scanf("%c",&p[i].firstname); 		printf("Please input your last name\n"); 		scanf("%c",&p[i].firstname); 		printf("Success"); 	} }  void delet(struct plane *p) { 	int number,i,a; 	char last[20],first[20]; 	printf("Please input the number of the seat you want to delete"); 	scanf("%d",&number); 	if(p[i].whether==0) 		printf("The seat is empty"); 	else 	{ 		printf("Please input your first name\n"); 		scanf("%c",&p[i].firstname); 		printf("Please input your last name\n"); 		scanf("%c",&p[i].firstname); 		for(a=0;a<20;a++); 		do 		{ 			p[i].whether=0; 			printf("Success"); 		} 		while (last[a]!=p[i].lastname[a]||first[a]!=p[i].firstname[a]); 		 	} }    int main() { 	char a,b,c,d,e,f,g;  	init_plane_array();  	printf("To choose a function, enter its letter label:\n"); 	printf("a)Show number of empty seats\n"); 	printf("b)Show list of empty seats\n"); 	printf("c)Show alphabetical list of seats\n"); 	printf("d)Assign a customer to a seat assignment\n"); 	printf("e)Delete a seat assignment\n"); 	printf("f)Quit\n"); 	scanf("%c",&g); 	switch(g) 	{ 	case 'a':num_emp_sea(seat);break; 	case 'b':list_emp_sea(seat);break; 	case 'c':list_sea(seat);break; 	case 'd':assign(seat);break; 	case 'e':delet(seat);break; 	case 'f':printf("7");break; 	}; 	return(0); }


Question: lua请教

lgbxyz 你好，我的lua脚本是 #!/usr/local/bin/lua  function mysub(a,b)         return a+b; end function mytest()         local i=0;         local luasql = require "luasql.mysql"          -- create environment object          env = assert (luasql.mysql())         -- connect to data source         con = assert (env:connect("mylct", "root", "hjzx", "127.0.0.1", 3306))          -- retrieve a cursor         cur = assert (con:execute"SELECT id,pos,offset,type from analog_info")    --获取数据         -- print all rows         row = cur:fetch ({}, "a") -- the rows will be indexed by field names    --显示出来         while row do           -- print(row.type)         print(string.format("%02d id: %d, pos: %d  type:%s",i, row.id, row.pos,row.type))         -- print(i.."  cid:"..)         i=i+1;         row = cur:fetch (row, "a") -- reusing the table of results         end         print "this is the test";         -- close everything         cur:close()         con:close()         env:close() end 我的C程序是： #include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> //lua头文件  #include "/usr/local/include/lua.h" #include "/usr/local/include/lualib.h" #include "/usr/local/include/lauxlib.h"   #define err_exit(num,fmt,args)  \     do{printf("[%s:%d]"fmt"\n",__FILE__,__LINE__,##args);exit(num);} while(0)  #define err_return(num,fmt,args)  \     do{printf("[%s:%d]"fmt"\n",__FILE__,__LINE__,##args);return(num);} while(0)  void stackDump(lua_State* L);   int main(int argc,char**argv) { 	int ret = 0 ; 	char sc[50] = {"test.lua"};      	lua_State * l = luaL_newstate() ;        //创建lua运行环境     	if ( l == NULL ) { 		printf("luaL_newstat() failed\n");      		return 1;      	}      	luaL_openlibs(l);     	ret = luaL_loadfile(l,sc) ;      //加载lua脚本文件     	if ( ret != 0 )  { 		printf("luaL_loadfile failed: %s\n",lua_tostring(l,-1));      		return 1;      	}  	lua_pcall(l,0,0,0); 	lua_getglobal(l,"mytest"); 	if(1 == (ret = lua_isfunction(l,-1))) 	{      		ret = lua_pcall(l,0,0,0) ;     		if ( ret != 0 ) printf("lua_pcall failed[%d]:%s\n",ret,lua_tostring(l,-1)) ; 		else 		{ 			printf("the result is:%d\n",lua_tointeger(l,-1)); 		} 	} 	else{ 		printf("%d ----> 3\n",ret); 	}     	lua_close(l) ;                     //释放lua运行环境     	return 0 ; }

sniffer12345 感谢你的回复，我加了local也是同样的错误

你好，感谢你的回复。 我加了local也是同样的错误  引用 1 楼 lgbxyz 的回复:C是怎么调用Lua的?

引用 楼主 sql2zy 的回复:我的lua脚边是（test.lua）：   luasql = require "luasql.mysql"   i =1; env = assert (luasql.mysql()) con = assert (env:connect("mylct", "root", "123456", "127.0.0.1", 3306))  cur = assert (con:execute"SELECT calldate,src,dst from cdr limit 10")    --获取数据  row = cur:fetch ({}, "a")  while row do print(string.format("%02d calldate: %s, callerid: %s  dnid:%s",i, row.calldate, row.src,row.dst)) i=i+1; row = cur:fetch (row, "a") end  cur:close() con:close() env:close()  执行lua test.lua，输出都正常，但是在c程序中调用这个test.lua就会出错，通过gdb查到的信息是： Program terminated with signal 11, Segmentation fault. #0  0x0066a7ab in newkey () from /usr/local/lib/lua/5.1/luasql/mysql.so (gdb) bt #0  0x0066a7ab in newkey () from /usr/local/lib/lua/5.1/luasql/mysql.so #1  0x00661f0d in lua_rawset () from /usr/local/lib/lua/5.1/luasql/mysql.so #2  0x006606e3 in cur_fetch () from /usr/local/lib/lua/5.1/luasql/mysql.so #3  0x0804d034 in luaD_precall () #4  0x08055a31 in luaV_execute () #5  0x0804d4d0 in luaD_call () #6  0x0804a8a1 in f_call () #7  0x0804cbc7 in luaD_rawrunprotected () #8  0x0804cc2f in luaD_pcall () #9  0x0804a6f7 in lua_pcall () #10 0x08049763 in main (argc=2, argv=0xbfe8ba04) at test.c:45 请高手给点提示，这是怎么回事？ 拜托 变量前加local好不好 否则的话是全局变量

C是怎么调用Lua的?


Question: 求一个MPI简单C或者C++代码，对二维数组进行quicksort排序

amazon这个太高级了，我只想写个简单的MPI的C程序。  [ quote=引用 1 楼 gigglesun 的回复:] 可以考虑使用这个： http://aws.amazon.com/developertools/Elastic-MapReduce?browse=1[/quote]


Question: 我是新手，不懂来问问题来了

自学成才的典范

你这么学太要命了，找本书，跟着系统学一下基础吧先

#include <stdio.h> double power(double x,int n) { double y=1;//记得初始化啊，兄弟 for(;n>0;n--)//是大于号 y=y*x; return(y); } int main() { double a,m; int b; while(1) { printf("请输入数值:\n"); scanf("%lf",&a); getchar(); scanf("%d",&b); getchar(); m=power(a,b); printf("结果为:%lf\n",m); } }  加油

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

楼主瞎搞什么呢，从哪里贴的，都不看就上来问，，，

for条件写错了，应该是 n>0。其他没看

double y; 都没有赋初始值，如果系统自动赋值是0，那你的结果永远都是0  for循环循环控制条件需要检查一下

lz你上面的函数里怎么多个左括号，打错了吧 # include <stdio.h>  double power(double x, int n) { 	double y = 1;    ///////这里 	for(; n>0; n--)  //////这里该n>0 	{ 		y *= x; 	} 	return y; }	   int main(void) { 	double a, m; 	int b; 	//	while(1) 	//	{  	printf("请输入数值: "); 	scanf("%lf %d",&a, &b); 	m = power(a, b); 	printf("结果为:%lf\n", m); 	//	} 	return 0; }

#include <math.h>  return pow<double>(x,n);


Question: 关于动态内存，求大神解答

引用 楼主 u012941377 的回复:#include<stdio.h> #include<malloc.h>  void f(int **q) { 	*q=(int *)malloc(sizeof(int));//为什么不去掉这行 该程序编译就回出错？ 	int i; 	i=10; 	*q=&i;  } int main(void) { 	int *p; 	f(&p); 	printf("%d\n",*p); 	return 0; } /////////////////////////////////////////////////////////////////// 楼主，你写出这样写代码迟早会出问题： 1.你在main函数已经定义了一个p指针，程序启动后它在进程空间中会有一个虚拟内存地址，此时p会占用4个字节（32位系统前提），这个指针里面没有指向； 2，然后你把p的虚拟内存地址传给了f（），f（）接受到参数&p，后，会干什么呢？ 3.你然后又在堆里面申请了一个int类型的4字节的空间传递给p，这样一来，p原来的地址被这4个字节的首地址覆盖，此时p原来的地址已经找不到了， 3.接着你又把栈里面的局部变量i的地址交给了p， 4.最后打印出来的*p到底是什么？ 这个先不说，楼主这样写，会出现内存泄露，你用molloc申请的内存，必须由程序员释放的，当程序结束后，系统也会回收这些在堆里面申请的内存，但是系统能回收吗？系统要释放，首先要找到这块int内存的首地址，但是它的地址已经丢失，他就无法释放这块内存，你程序运行一次，就有一块内存泄露，多运行几次，内存就完了，

楼主，指针带回来一个栈区地址到底有什么意义。

计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）  想要从本质上理解C指针，必须学习汇编以及C和汇编的对应关系。 从汇编的角度理解和学习C语言的指针，原本看似复杂的东西就会变得非常简单！ 指针即地址。“地址又是啥？”“只能从汇编语言和计算机组成原理的角度去解释了。” 但我又不得不承认：  有那么些人喜欢或者适合用“先具体再抽象”的方法学习和理解复杂事物；  而另一些人喜欢或者适合用“先抽象再具体”的方法学习和理解复杂事物。 而我本人属前者。  不要企图依赖输出指针相关表达式的值【比如printf("%p\n",...)】来理解指针的本质， 而要依赖调试时的反汇编窗口中的C/C++代码【比如void *p=...】及其对应汇编指令以及内存窗口中的内存地址和内存值来理解指针的本质。  这辈子不看内存地址和内存值；只画链表、指针示意图，画堆栈示意图，画各种示意图，甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗？本人深表怀疑！ 这辈子不种麦不收麦不将麦粒拿去磨面；只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头，压面条，烤面包，……能从本质上理解面粉、理解面食吗？本人深表怀疑！！  提醒： “学习用汇编语言写程序” 和 “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

除了第二条和语言规范,C标准有关外,其他都是逻辑错误. 有些会产生严重的运行时错误.

1)分配的内存被替换,因而无法释放,内存泄漏.这是严重错误. 2)C,和C++有所不同,C变量声明定义要在其他执行语句之前,C99不清楚还是不是这样. 3)返回和传出函数局部自动变量的地址,是危险的行为,      因为变量的生命周期已经结束了,引用他的行为是错误的(这是个死魂灵了). 4)不是分配的内存,被释放掉,是个错误,至少逻辑是错误的.

引用 28 楼 liu111qiang88 的回复:首先去不去掉都是错误的，你最后改变了p的指向，他指向了占内存，这个函数结束这个内存会释放的，你看到的结果是个假象，因为你用的是debug，你用release试试，肯定会有问题。 如果有人编不过，是因为c语言规范编译器要求定义放在最上边  Code Blocks的release版本证实了这是对的。

引用 32 楼 my_live_123 的回复:ls说了一大堆，没有点题啊 很简单，你不分配内存，如何用？道理很简单，你指者一个空盆说，这是一盆水，然后你就用手去触摸水。有水的感觉嘛？没有！只有加满水，才能舒服摸摸！ “这是一盆水”——声明一个指针，”加水“——分配内存！“触摸水”——访问内存！”摸水的感觉“——读取内存数据！晓得？ 务必区分指针变量和存储数据的变量大神可以给个交流方式 详细的跟我讲解一下这个么

引用 17 楼 u012941377 的回复:[quote=引用 13 楼 lijian19911012 的回复:] [quote=引用 10 楼 lijian19911012 的回复:] [quote=引用 7 楼 liuhengxiao 的回复:] [quote=引用 5 楼 lijian19911012 的回复:] [quote=引用 3 楼 dbzhang800 的回复:] [quote=引用 楼主 u012941377 的回复:] #include<stdio.h> #include<malloc.h>  void f(int **q) { 	*q=(int *)malloc(sizeof(int));//为什么不去掉这行 该程序编译就回出错？ } 你是想说，去掉就会出错么？？[/quote] 有个疑问是，i是在f()中定义的变量，存放在stack中，调用完成之后释放，为什么printf("%d\n",*p);不会报错。[/quote]  虽然i变量已经被释放了，但i这个变量原本的地址在内存依然存在的，printf时打印的结果会是垃圾数据[/quote] 我可以理解为，给一个地址，就可以允许访问他指向的内存空间吗？ int *pt = 0x12345678; printf("%d", *pt);??[/quote] 解引用野指针是未定义行为。打印的10只是个假象。[/quote]那为什么加上哪行会出错呢 ，应该是正确的吧[/quote] 出的什么错，贴出来

*q=(int *)malloc(sizeof(int*));//为什么不去掉这行 该程序编译就回出错？

引用 28 楼 liu111qiang88 的回复:首先去不去掉都是错误的，你最后改变了p的指向，他指向了占内存，这个函数结束这个内存会释放的，你看到的结果是个假象，因为你用的是debug，你用release试试，肯定会有问题。 如果有人编不过，是因为c语言规范编译器要求定义放在最上边 我倒是没想到这一点，malloc的是堆，i是栈，编译没问题，运行就有问题。

使用visual studio2010的编译器也没问题。如果你想要c-free专业版，加我QQ：2901452412，我给你发过去，带激活码的。

你换个编译器试试，我是用的是c-free专业版，里边默认使用mingw编译器，代码应该没什么问题。

引用 26 楼 u012941377 的回复:[quote=引用 19 楼 mcmay 的回复:] 在CodeBlocks和TC下编译，都没有出错。 不过 *q = (int *) malloc(sizeof(int)); 这个语句没有起到任何作用， *q所指向的地址由*q = &i; 这个语句给替换掉了。malloc所分配的空间地址犹在，但却没有指针指向它了。在CB下 可以编译了 感谢，可是根据我们老师讲的 如果q分配的不是动态内存的话，下面的p应该不会是10啊，我在动态内存在纠结了[/quote] 难道q一定要分配动态内存，*p的值才是10吗？*p的值之所以是10，是因为*q的值是10。而*q的值成为10，是因为*q = &i。&i覆盖了malloc返回值赋予q的指针。当*q = &i时，q与(int *)malloc(sizeof(int))的返回值已经没有任何关系了。

引用 19 楼 mcmay 的回复:在CodeBlocks和TC下编译，都没有出错。 不过 *q = (int *) malloc(sizeof(int)); 这个语句没有起到任何作用， *q所指向的地址由*q = &i; 这个语句给替换掉了。malloc所分配的空间地址犹在，但却没有指针指向它了。在CB下 可以编译了 感谢，可是根据我们老师讲的 如果q分配的不是动态内存的话，下面的p应该不会是10啊，我在动态内存在纠结了

你要用动态分配将f函数改成这样就没问题了void f(int **q) {     *q=(int *)malloc(sizeof(int));//为什么不去掉这行 该程序编译就回出错？ //  int i; //  scanf("%d",&i); //  *q=&i; 	scanf("%d", *q); }

引用 21 楼 u010211892 的回复:因为c的声明要放在语句前，你把那句和下面的定义掉换个位置。 #include<stdio.h> #include<malloc.h>   void f(int **q) {     int i; 	*q=(int *)malloc(sizeof(int));     i=10;     *q=&i;   } int main(void) {     int *p;     f(&p);     printf("%d\n",*p);     return 0; }这样就不会报错了，你的c基础不够扎实。还是不正确

引用 22 楼 a515360208 的回复:[quote=引用 15 楼 u014687239 的回复:] #include<stdio.h> #include <iostream> #include<malloc.h>   void f(int **q) {     *q=(int *)malloc(sizeof(int));//为什么不去掉这行 该程序编译就回出错？     int i;     scanf("%d",&i);     *q=&i;   } int main(void) {     int *p;     f(&p);     printf("%d\n",*p); 	free(p); 	*p=NULL;     system("pause");     return 0; }  我改了改，在free（p）编译器报错。是指向指针的指针，使用free（p)是不是释放了一块内存。。这个程序写的可读性太差了，地址不知不觉改变了，你自己都不知道，你在f中malloc后又用其它的地址去替代，也就造成了一块分配的内存无法访问了，而你free的是另一个地方，你单步调试看看各变量的地址变化就清楚了[/quote]准确的说你free的是f函数中变量i的地址，

引用 15 楼 u014687239 的回复:#include<stdio.h> #include <iostream> #include<malloc.h>   void f(int **q) {     *q=(int *)malloc(sizeof(int));//为什么不去掉这行 该程序编译就回出错？     int i;     scanf("%d",&i);     *q=&i;   } int main(void) {     int *p;     f(&p);     printf("%d\n",*p); 	free(p); 	*p=NULL;     system("pause");     return 0; }  我改了改，在free（p）编译器报错。是指向指针的指针，使用free（p)是不是释放了一块内存。。这个程序写的可读性太差了，地址不知不觉改变了，你自己都不知道，你在f中malloc后又用其它的地址去替代，也就造成了一块分配的内存无法访问了，而你free的是另一个地方，你单步调试看看各变量的地址变化就清楚了


Question: 在头文件中中定义全局变量的问题

尽量避免使用全局变量。

引用 16 楼 shixiazuike 的回复:[quote=引用 8 楼 mcmay 的回复:] [quote=引用 6 楼 zmlovelx 的回复:] 在头中声明，某个.c中定义， 其他.c中使用。 正解[/quote] 请问怎么在头文件中声明呢，对于一个基本类型，声明也就是定义了，已经分配内存空间了。[/quote] extern int i;

引用 8 楼 mcmay 的回复:[quote=引用 6 楼 zmlovelx 的回复:] 在头中声明，某个.c中定义， 其他.c中使用。 正解[/quote] 请问怎么在头文件中声明呢，对于一个基本类型，声明也就是定义了，已经分配内存空间了。

引用 14 楼 luotuo44 的回复:[quote=引用 13 楼 shixiazuike 的回复:] [quote=引用 11 楼 luotuo44 的回复:] [quote=引用 3 楼 shixiazuike 的回复:] 但是如果宏只对单个.c文件有效，那么条件编译有什么作用呢？  像  #ifndefine #define #endif  这类条件编译是为了防止同一个.c文件包含同一个头文件多次。  楼主要明白：每一个.c文件最后都会编译生成对应的.obj文件的。所以你的两个.c文件对应的两个.obj文件都会有你说的那个全局变量的，链接的时候，链接器就会发现有定义了两个同名变量，于是就报multiple definition错误。 正确的做法是：是其中一个.c文件定义这个变量,在另外一个.c文件用  extern int g_a;  声明，这就可以在两个.c都使用这个变量了。[/quote] 恩，谢谢，我最后就是用extern来解决的，只不过对于条件编译有些疑问而已。因为目前没有遇到过一个.c文件包含另一个.c的情况，我认为这应当是尽量避免的。[/quote]  不是一个.c文件包含另外一个.c文件。没有人会这样组织代码的。 条件编译为了防止一个.c文件多次包含一个.h文件。 比如有a.h， b.h，main.c三个文件，b.h文件include了a.h文件。而在main.c文件中首先include了a.h，然后再include了b.h文件。这样就会出现包含一个头文件多次的情况。这时条件编译就能派上用场了。[/quote] 恩，谢谢，这样我就懂了。虽然这种情况下不包含a.h直接包含b.h就可以了，不过在大型工程项目中应该很有难度。

那个编译只是在.h里面有效吧

引用 13 楼 shixiazuike 的回复:[quote=引用 11 楼 luotuo44 的回复:] [quote=引用 3 楼 shixiazuike 的回复:] 但是如果宏只对单个.c文件有效，那么条件编译有什么作用呢？  像  #ifndefine #define #endif  这类条件编译是为了防止同一个.c文件包含同一个头文件多次。  楼主要明白：每一个.c文件最后都会编译生成对应的.obj文件的。所以你的两个.c文件对应的两个.obj文件都会有你说的那个全局变量的，链接的时候，链接器就会发现有定义了两个同名变量，于是就报multiple definition错误。 正确的做法是：是其中一个.c文件定义这个变量,在另外一个.c文件用  extern int g_a;  声明，这就可以在两个.c都使用这个变量了。[/quote] 恩，谢谢，我最后就是用extern来解决的，只不过对于条件编译有些疑问而已。因为目前没有遇到过一个.c文件包含另一个.c的情况，我认为这应当是尽量避免的。[/quote]  不是一个.c文件包含另外一个.c文件。没有人会这样组织代码的。 条件编译为了防止一个.c文件多次包含一个.h文件。 比如有a.h， b.h，main.c三个文件，b.h文件include了a.h文件。而在main.c文件中首先include了a.h，然后再include了b.h文件。这样就会出现包含一个头文件多次的情况。这时条件编译就能派上用场了。

引用 11 楼 luotuo44 的回复:[quote=引用 3 楼 shixiazuike 的回复:] 但是如果宏只对单个.c文件有效，那么条件编译有什么作用呢？  像  #ifndefine #define #endif  这类条件编译是为了防止同一个.c文件包含同一个头文件多次。  楼主要明白：每一个.c文件最后都会编译生成对应的.obj文件的。所以你的两个.c文件对应的两个.obj文件都会有你说的那个全局变量的，链接的时候，链接器就会发现有定义了两个同名变量，于是就报multiple definition错误。 正确的做法是：是其中一个.c文件定义这个变量,在另外一个.c文件用  extern int g_a;  声明，这就可以在两个.c都使用这个变量了。[/quote] 恩，谢谢，我最后就是用extern来解决的，只不过对于条件编译有些疑问而已。因为目前没有遇到过一个.c文件包含另一个.c的情况，我认为这应当是尽量避免的。

引用 6 楼 zmlovelx 的回复:在头中声明，某个.c中定义， 其他.c中使用。 请问怎么在头文件中生命呢，比如一个全局变量int a，声明也就是定义了，理论上就分配了内存空间，除非使用静态类型，但是这就改变了问题的条件了。

引用 3 楼 shixiazuike 的回复:但是如果宏只对单个.c文件有效，那么条件编译有什么作用呢？  像  #ifndefine #define #endif  这类条件编译是为了防止同一个.c文件包含同一个头文件多次。  楼主要明白：每一个.c文件最后都会编译生成对应的.obj文件的。所以你的两个.c文件对应的两个.obj文件都会有你说的那个全局变量的，链接的时候，链接器就会发现有定义了两个同名变量，于是就报multiple definition错误。 正确的做法是：是其中一个.c文件定义这个变量,在另外一个.c文件用  extern int g_a;  声明，这就可以在两个.c都使用这个变量了。

但是如果宏只对单个.c文件有效，那么条件编译有什么作用呢？

把代码贴出来

经过我的测试，宏似乎只针对单个.c有效。

引用 1 楼 shixiazuike 的回复:经过我的测试，宏似乎只针对单个.c有效。 好像不是的啊 我今天编译的时候在一个项目下  另一个类就拿到那个宏定义了啊

引用 3 楼 shixiazuike 的回复:但是如果宏只对单个.c文件有效，那么条件编译有什么作用呢？ 文件A 包含文件B 同时有自己特有的内容 文件C同时 包含文件A  和 文件B 如果不做条件编译 在文件C 文件B会被包含2次  当然你也可以说 文件C只包含文件A 就能有同样的效果啊  我会告诉你 的确是那样  然后对于一个几百个头文件的小项目 你这么干试试

通常每个c文件是各自编译的，你别指望在一个c文件中的条件可以拿来在另一个c文件中做判断，所以#if这种情况不管用

引用 6 楼 zmlovelx 的回复:在头中声明，某个.c中定义， 其他.c中使用。 正解

头文件就定义常量

在头中声明，某个.c中定义， 其他.c中使用。

那是因为你在.h 文件中，也加入了extern xxx ，只在.C 文件中加入extern  xxx 即可。


Question: 求助 vc6.0没有新建源文件的选项 如图

重装或重新下载安装包吧，

楼主下的应该不是完整版的。

不清楚lz什么情况，，，你的VC6.0是不是没下载完啊？     http://zhidao.baidu.com/link?url=sTACf0YM2XwoAujKb62Lzew3oTJ4VqqRgdI73vwv_qlng44wIn23IfwYReFt_XT9c_uZL8J1OOdLk0UBHT-BYa  http://zhidao.baidu.com/question/144791410.html?qbl=relate_question_0&word=%CE%AA%CA%B2%C3%B4VC6.0%C3%BB%D3%D0%D0%C2%BD%A8%D4%B4%CE%C4%BC%FE%B5%C4%D1%A1%CF%EE  学会使用百度谷歌

没有安装完全。


Question: 关于进制转换

#include <stdio.h>  int main() { 	int		n, i, res;    //int够用了 	while (scanf("%d", &n) == 1) 	{ 		for (i = 1, res = 1; i <= n; i++) 		{ 			if (i % 7 == 0) 				res *= i / 7; 			else 				res *= i % 7; 			res %= 7; 		}         printf("%d\n", res); 	}     return 0; }

在1~n中，把7的倍数变小，除以7只留商；其余数除以7只留余数。如1~15得 1、2、3、4、5、6、1、1、2、3、4、5、6、2、1……。这些数相乘，每次乘积模7，得结果。

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <locale.h> int main() {     int i,v;     char bs[33];     char b[33];     char hs[9];     char h[9];     char s[4];     char *e;  // 十进制整数转二进制串；     i=1024;     ltoa(i,b,2);     sprintf(bs,"%032s",b);     printf("i=%d,bs=%s\n",i,bs); // 十进制整数转十六进制串；     i=1024;     ltoa(i,h,16);     sprintf(hs,"%08s",h);     printf("i=%d,hs=%s\n",i,hs); // 十六进制字符串转成十进制数     strcpy(hs,"00000400");     sscanf(hs,"%x",&i);     printf("hs=%s,i=%d\n",hs,i); // 二进制字符串转化为十六进制字符串；     strcpy(bs,"00000000000000000000010000000000");     i=strtol(bs,&e,2);     ltoa(i,h,16);     sprintf(hs,"%08s",h);     printf("bs=%s,hs=%s\n",bs,hs); // 二进制字符串转化为十进制数；     strcpy(bs,"00000000000000000000010000000000");     i=strtol(bs,&e,2);     printf("bs=%s,i=%d\n",bs,i); // 十六进制字符串转成二进制串     strcpy(hs,"00000400");     sscanf(hs,"%x",&i);     ltoa(i,b,2);     sprintf(bs,"%032s",b);     printf("hs=%s,bs=%s\n",hs,bs); // ASC\GBK字符串转十六进制串     strcpy(s,"a汉");     i=0;     while (1) {         if (0==s[i]) break;         sprintf(hs+i*2,"%02X",(unsigned char)s[i]);         i++;     }     setlocale(LC_ALL,"chs");     printf("s=%s,hs=%s\n",s,hs); // 十六进制字符串转成汉字（GBK）及字符(ASC)     strcpy(hs,"61BABA");     i=0;     while (1) {         if (1!=sscanf(hs+i*2,"%2x",&v)) break;         s[i]=(char)v;         i++;     }     s[i]=0;     printf("hs=%s,s=%s\n",hs,s);      return 0;  } //i=1024,bs=00000000000000000000010000000000 //i=1024,hs=00000400 //hs=00000400,i=1024 //bs=00000000000000000000010000000000,hs=00000400 //bs=00000000000000000000010000000000,i=1024 //hs=00000400,bs=00000000000000000000010000000000 //s=a汉,hs=61BABA //hs=61BABA,s=a汉

2-9进制都可以转换的程序。  #include <stdio.h> #define N 1024  void trans(int m, int k) {//请在这个函数里面修改你的代码 	int a[N], i; 	for(i = 0; m; i++) 	{ 		a[i] = m % k; 		m /= k; 	} 	i--; 	for(;i>=0;i--) 		printf("%d", a[i]); }  int main() { 	int m, k; 	scanf("%d%d", &m, &k); 	trans(m, k); 	printf("\n"); 	return 0; }

显然能logn多项式做掉。注意到1*2*...*6和11*12*...*16对于最后一位的贡献是相同的。所以把1~n根据7因子个数分成log(n)组，每组计算有多少个1*2*...*6和尾数，然后全部乘起来就是。整个应该能log(n)^2。

#include <stdio.h>  int main() { 	int		n, i, t, res; 	while (scanf("%d", &n) == 1) 	{ 		for (i = 1, res = 1; i <= n; i++) 		{ 			t = i; 			while (t % 7 == 0) 				t /= 7; 			res *= t % 7; 			res %= 7; 		}         printf("%d\n", res); 	}     return 0; }

#include <stdio.h>  int factorial(int n) {     int num = 1;     if (n <= 1)       return 1;     num = n * factorial(n - 1);      return num; }  int get_num(int n) {     for (;;) {         if (n % 7 == 0)           n = n / 7;         else           return n % 7;     }    }  int main() {     int n, decimal, num;     for (;;) {         printf("Please input: ");         scanf("%d", &n);         decimal = factorial(n);         num = get_num(decimal);         printf("%d\n", num);     }        return 0; }

当n很小的时候，直接计算n!，然后模7，如果等于0，用商继续模7.直到结果不为0，就是后缀第一个不为零的7进制数字 当n很大的时候，采用下面模公式 (a * b) % p = (a % p * b % p) % p  由于求n！中间过程已经完成求模运算，因此a*b最大就是36.可以生成一个大小37的表，进行优化，省去不必要的模运算

常规方法： 1.计算n！，好像也没有什么好的公式，使劲乘呗 2.计算7进制的最后一个非零位：    unsigned int dat;//要计算的数    unsigned int yu;//余     do        {            unsigned int yu=dat%7;            dat=dat/7;        }while(yu==0);        return yu;  当然这题目肯定要通过数学方法改进，要不然n！太大了。


Question: 关于程序基址的问题

引用 10 楼 buyong 的回复:这个问题如果就用应用层的知识，估计是很难解释清楚的。 必须对操作系统内核机制深入研究。 使用虚拟地址是肯定的。噢，既然大家言尽于此，后面的我自己看看操作系统的书来自己理解吧

引用 8 楼 xiaohuh421 的回复:各种进程空间, 虚拟地址是隔离的. 基址, 即是程序代码被编译成二进制码时就已经规定好的一个绝对地址值. 一般反汇编后为: mov xxx  [XXXXXX]    //XXXXX就是16进制数字代表的值, 除非程序被破坏,或者被重新编译生成,否则是不会改变的.噢，比如基址epx（是一个虚拟地址），某程序向操作系统发出对epx+7A读或写2个字节的请求，那么操作系统会查找类似于地址转换表之类的东西，找到epx+7A对应的内存地址进行操作（读、写），那么是不是说系统分配给该程序的数据区的内存是连续的？假设我前面设想的正确：当我开了两个一样的程序时，则它们基址相同（物理内存不同？），那么我对操作系统发出对epx+7A读或写2个字节的请求时，这时候系统又该怎么找对应的物理内存地址呢？（现在是一个基址对应两块物理内存），还是说发送请求时要附加其它条件？

引用 1 楼 u012033027 的回复:程序运行时，编译器生成的可执行码中的地址都是虚地址。操作系统负责把虚拟地址转换为物理地址。 至于你说的虚地址相同的问题，可能他们处于不同的进程，所以操作系统能够区分。噢，那么是不是：以同一个基址或基址+偏移量向操作系统发送读写请求,操作系统返回的是同一个物理内存地址？

引用 3 楼 fengzizhuang 的回复:-------问题1，“假设当关闭程序重启之前有其它程序占据了那个程序的基址不就不可能不变了吗？” 程序的逻辑地址是不变的，编译的时候已经决定了，当程序启动时，即加载的内存中，操作系统会映射一定的内存给改程序，但程序的寻址任然是按自己的逻辑地址进行，映射过程由操作系统决定，是透明的 -------问题2，“好像有一点懂就是基址不是物理地址而是虚拟地址（不知道是不是？）？” 没错，基址的确不是物理地址，一个程序在寻址是，都是相对于基址的偏移量。基址与偏移量进行运算得到逻辑地址，操作系统会将逻辑地址转为为内存的物理地址。详细的原理可以参见《计算机操作系统》这本书 你可以看看，操作系统中内存管理这一块，应该能够帮助你理解程序调用过程，及地址换行法则谢谢你的解答，那么基地址是逻辑地址，操作系统给程序分配内存是是一块连续的内存吗？如果不是，基址+偏移量不就不是某个属性的动态地址了吗？既然基址是逻辑地址那CE又是怎么找到某程序的基址对应的内存地址的呢（比如我开了两个一模一样的程序，它们基址相同，CE不就不能分别是哪个了吗？）？

引用 4 楼 sd530842780 的回复:你还是没有找到 基址吧，ce不是有tutor么，多级寻址看一下。不是，已经找到了，我是按教程找的，而且做了测试是基地址。主要就是不明白基地址为什么不变等问题。

你还是没有找到 基址吧，ce不是有tutor么，多级寻址看一下。

如果你对这个感兴趣，可以看看《深入理解计算机系统》这本书。


Question: 初始化种群怎么，不是随机数，而是一样的？程序如下，求告诉错误原因在哪？

引用 4 楼 u014774381 的回复:试了，不是随机函数种子问题，把断点设在for(k=0;k<5;++k) 此处就能生成随机的数  不知道你怎么式的，从代码看，你不要把srand放在函数内。

C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\rand.c /*** *rand.c - random number generator * *       Copyright (c) Microsoft Corporation. All rights reserved. * *Purpose: *       defines rand(), srand() - random number generator * *******************************************************************************/  #include <cruntime.h> #include <mtdll.h> #include <stddef.h> #include <stdlib.h>  /*** *void srand(seed) - seed the random number generator * *Purpose: *       Seeds the random number generator with the int given.  Adapted from the *       BASIC random number generator. * *Entry: *       unsigned seed - seed to seed rand # generator with * *Exit: *       None. * *Exceptions: * *******************************************************************************/  void __cdecl srand (         unsigned int seed         ) {         _getptd()->_holdrand = (unsigned long)seed; }   /*** *int rand() - returns a random number * *Purpose: *       returns a pseudo-random number 0 through 32767. * *Entry: *       None. * *Exit: *       Returns a pseudo-random number 0 through 32767. * *Exceptions: * *******************************************************************************/  int __cdecl rand (         void         ) {         _ptiddata ptd = _getptd();          return( ((ptd->_holdrand = ptd->_holdrand * 214013L             + 2531011L) >> 16) & 0x7fff ); }

srand丢到main的开头而不是里面init的开头。

随机函数种子的事！


Question: ACM与编程的关系

不要被那些华丽的界面蒙蔽了双眼，要知道程序是怎么运行的，怎么用编程解决问题，那些界面的只是程序运行时的一种假象。 程序 =  数据结构 + 算法

ACM好，多锻炼，有的职位还是需要ACM编程经验的

MapReduce是可视化的吗？

算法还算不上底层，但固然重要，确实ACM很费时间，看你怎么权衡了

可视化的东西很屌吗？

其实，你说的可能会忽略的问题，那只是小问题，你花一小段时间就能赶上，而算法方面你远超别人了

不会，我觉得。

练内功总是要时间的。耽误不耽误看你怎么看了。

深入底层挺好的

GUI 可做demo, 可以演示。 需求变更多也能对应，表示适应性强。 开发时间短，表示效率高。 而且这样的人要的工资还不高，也容易招募。

引用 8 楼 zhao4zhong1 的回复:好程序 ≈ 合适的数据结构 + 巧妙的算法 + 严格的输入合法性校验 + 输出到可读性极佳的纯文本文件 - 华而不实的GUI - 改来改去的需求   中国多数老板喜欢的： 华而不实的GUI + 改来改去的需求 + 及其有限的时间内实现功能（means:  合适的数据结构 + 巧妙的算法 + 严格的输入合法性校验 + 输出到可读性极佳的纯文本文件 都不重要）