Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 这题的结果是多少呢？

回复:
user: user-1
content: 难道就没人发现楼主的代码已经是   2^0+2^1……+2^32  了么？

user: user-2
content: sum 定义成 unsigned  long 类型。

user: user-3
content: cout << "4294967295" << endl;

user: user-4
content: 溢出了，用无符号数就行了。

user: user-5
content: 对的，楼主正解,有很多方法可以解囧

user: user-6
content: sum初始化应给是0

user: user-7
content: 2^0 = 1 2^1=10 2^2=100 ... 2^31=1000 0000 0000 0000 他们的和，就是1111 1111 1111 1111 = FFFF=-1 就是这个味

user: user-7
content: 正好溢出

user: user-8
content: x86/debian gnu linux/gcc  # include <stdio.h>   int main(void) {     char i;     long int sum = 1;       for (i=0;i<32;++i)         sum += 2<<i;     printf("%ld",sum);       return 0; }   lly@debian:~/mydir/csdn/practice$ gcc shift.c  lly@debian:~/mydir/csdn/practice$ ./a.out  4294967295

user: user-9
content: 用 __int64时，由于是64位，打印要指明64位 printf("%I64d\n", sum);

user: user-9
content: 用 unsigned int 或者，__int64  __int64 v = 1; __int64 sum = 0; for (int i = 0; i < 32; i++) {     sum += v;     v <<= 1; }

user: user-10
content: 引用 6 楼 lin5161678 的回复:2的32次方 -1+1,按照补码的规则，输出-1，建议用无符号数

user: user-11
content: 2的32次方 -1

user: user-12
content: char i; 	long int sum = 1;  	for (i=0;i<32;++i) 		sum += 2<<i; 	printf("%lu\r\n",sum);//为%lu已验证 为4294967295

user: user-13
content: int main () {   unsigned int sum = 0, v = 1, i;    for (i = 0; i < 32; ++i) {     if (0 == i)       /*sum += 1;*/ sum |= 1;     else       /*sum += (v <<= 1);*/ sum |= (v <<= 1);   }    printf("%u == %u\n", sum, (unsigned int)(-1)); // 2^32-1 }

user: user-14
content: 应该加上unsigned. 结果是2的32次方减1，必须要用unsighed

user: user-15
content: 因为结果就是-1啊   你要用printf("%lu",sum);

user: user-16
content: 建议你把 2定义为unsigned  long类型吧， 安全起见。右移的话，int 只有31位，32位为符号位。 另外sum初始化应给是0
user-0 提问: 怎么实现向文件中指定位置添加字符串

回复:
user: user-1
content: 所谓修改删除文件a某位置的内容，其实是读打开文件a，再将‘a中修改删除位置之前的内容＋修改删除的内容＋a中修改删除位置之后的内容’保存到文件b，关闭文件a，删除文件a，将文件b改名为与之前文件a相同的名字，仅此而已。

user: user-2
content: 引用 1 楼 user-3 的回复:没办法，只能重建文件，然后删掉原来的，把新文件改名。+1

user: user-0
content: 那像word等办公软件是怎么实现替换的呢，也是用这种方法？遇到很大的文件怎么办？比如说2G多的文件，是分段处理吗？那岂不是很慢？

user: user-3
content: 没办法，只能重建文件，然后删掉原来的，把新文件改名。
user-0 提问: 求解，不太明白

回复:
user: user-1
content: C语言中一行只可以输入80个字符，如果代码需要换行，则在每行后面加上行结束符“\”

user: user-2
content: 换行是要以 \ 结尾吧。。。

user: user-3
content: 啥叫“自由风格”？

user: user-4
content: 引用 5 楼 Adol1111 的回复:听说这个和C语言的黑历史有关系，当年屏幕太小，一行的内容太长了会被截断，所以需要手动插入换行符 \，现在的技术应该无所谓了，不过可能是为了兼容吧，还是保留了这个特点。+1

user: user-5
content: 可以看一下这里的介绍https://gcc.gnu.org/onlinedocs/gcc-3.2/cpp/Initial-processing.html

user: user-5
content: 听说这个和C语言的黑历史有关系，当年屏幕太小，一行的内容太长了会被截断，所以需要手动插入换行符 \，现在的技术应该无所谓了，不过可能是为了兼容吧，还是保留了这个特点。

user: user-0
content: C语言中一行只可以输入80个字符，如果代码需要换行，则在每行后面加上行结束符“\”  char *p = "test\n\                    ----\n";     就可以。2楼链接给出答案  C语言中一行只可以输入80个字符，如果代码需要换行，则在每行后面加上行结束符“\”

user: user-6
content: 我自己瞎猜的：引号内容里面的东西，编译器是要照原样保存到字符串的，包括空格、换行、TAB都要保持原样，所以必须明确。 其他的“自由风格”，空格什么的多了少了都无所谓，反正唯一的作用就是当作分隔符

user: user-7
content: http://iask.sina.com.cn/b/1930331.html

user: user-6
content: 引号还是要求在同一行吧 或者这样写也行   6         char *p = "test\n"   7                 "----\n";
user-0 提问: 为什么有这么多的编程风格，语言格式为什么不统一？

回复:
user: user-1
content: 引用 12 楼 zhao4zhong1 的回复:比用什么风格更重要的是在任何地方，任何时候都坚持用一种风格。 比爱哪种美眉更重要的是在任何地方，任何时候都坚持爱一个美眉。好比喻！！

user: user-2
content: 啥都一样了，这世界还有什么魅力可言吗

user: user-3
content: 就像这个世界上有无数的方言一样，照理说有了汉语和英语就足够了。  引用 楼主 Esaak 的回复:有些疑惑，各个编程语言对语法块的区分方法、注释的表示、语句结尾的表示都不尽相同。有些语言本身就是用C实现的，比如Python等，但对格式要求迥异。想知道各语言为什么不把风格统一，是为了强调个性才高出这么多代码的格式要求吗？ 真心求教。

user: user-4
content: 就像寫一道程式題目，結果都一樣，但是方法可能不完全相同而已

user: user-5
content: 有了选择， 真好

user: user-6
content: 比用什么风格更重要的是在任何地方，任何时候都坚持用一种风格。 比爱哪种美眉更重要的是在任何地方，任何时候都坚持爱一个美眉。

user: user-7
content: 世界上有这么多国家，为什么不统一？

user: user-8
content: 因为它们不是从一个大师手中出来的。这样才丰富多彩啊

user: user-6
content: http://bbs.csdn.net/topics/380157851

user: user-9
content: 因为没有一个强制的标准组织去规定这些； 因为不同种类的语言在一开始出现时是基于创始人想用在某个特定领域或解决某些问题才发明的，所以必然就会出现不同； 最先出现的，最受用户的往往成为事实上但不是书面上的标准。

user: user-10
content: 编程是种艺术，艺术的美在多样，而不在单一。

user: user-11
content: 这就跟有人是长脸  有人是方脸   有人胖  有人瘦  大家都是细胞组成的， 难道所有人都得长成一个模子刻出来的么

user: user-12
content: 每种语言都有它各自的特色  不一样就不一样咯

user: user-13
content: 因为对美的认识和理解，各语言大师并不能统一。 代沟，你听说过么？你能和你父母在音乐、艺术等方面都达成共识么？

user: user-14
content: 因为各种语言的语法不一样啊。。。比如C用大括号区分代码块，Python用缩进区分代码块。。。  难道你要各种语言的语法都一样吗。。。

user: user-15
content: 代码怎么写并没有明确的规定，自己喜欢就行
user-0 提问: 求将BMP彩色图像转化为黑白图像的程序，或者显示4色BMP图像的程序，求大神帮忙，有的发我邮箱626022479@qq.com，谢谢！！

回复:
user: user-1
content: http://download.csdn.net/detail/ko1_1ok/4734848 参考

user: user-2
content: Image Magick

user: user-3
content: 已发送。结贴给分吧
user-0 提问: C语言宏定义的问题

回复:
user: user-0
content: 原来如此，谢谢各位了

user: user-1
content: lz的代码相当于   #include <stdio.h>   void bbb() {    printf("aaa()\n"); }   int main() {    bbb();  }

user: user-2
content: 引用 2 楼 dbzhang800 的回复:因为代码没有问题，无论是用 aaa替换bbb，还是bbb替换aaa，都没有问题+1

user: user-3
content: x86/Debian GNU/Linux/gcc vi macro.c  lly@debian:~/mydir/csdn/marco$ gcc  -E  macro.c ........ void bbb() {       printf("aaa()\n"); }   int main() {  bbb(); } lly@debian:~/mydir/csdn/marco$

user: user-4
content: 把aaa换成了bbb  #include <stdio.h>  void bbb() { 	printf("aaa()\n"); }  int main() { 	bbb(); }

user: user-5
content: 因为代码没有问题，无论是用 aaa替换bbb，还是bbb替换aaa，都没有问题

user: user-6
content: 楼主，看教材，别扯百度百科，浪费生命不是怎么浪费的。
user-0 提问: 结构体含有指针和指针指向的数据长度，怎么初始化

回复:
user: user-0
content: 引用 2 楼 truelance 的回复:变长的字段只能有一个，而且必须放在最后 typedef struct HEAD { unsigned int regf; unsigned char head; unsigned int namelength; unsigned char name[1]; }HEAD,*PHEAD;我也一直这么觉得，只是不太相信自己，可以结贴了，谢谢

user: user-1
content: 能不能得到namelength的数据。能得到的话用下面的结构体 typedef struct HEAD { unsigned int regf; unsigned int namelength; unsigned char name[0]; }HEAD,*PHEAD;  给这个结构体分配地址空间的时候， PHEAD *p = (PHEAD)calloc(sizeof(struct HEAD) + namelength, 1); 你就可以通过name这个指针去访问后面分配的数据，name将指向name后面数组的首地址。这样就实现了可变长的访问。

user: user-2
content: 中间有变长数据的话，只有一个数据一个数据的解析了，不要期望用结构体直接映射。  引用 楼主 braveheart2010 的回复: 如图，这是一段内存的数据，现在我要用定义一个结构体来解析这段数据。但是问题是，里面有name长度是可变的，长度存储在namelength里面。我定义了下面的结构体，但是有问题，应该如何定义来解析这段数据呢？谢谢各位  typedef struct HEAD { 	unsigned int regf; 	unsigned int namelength; 	unsigned char* name; 	unsigned char head; }HEAD,*PHEAD;  [/size]

user: user-3
content: 变长的字段只能有一个，而且必须放在最后 typedef struct HEAD { unsigned int regf; unsigned char head; unsigned int namelength; unsigned char name[1]; }HEAD,*PHEAD;

user: user-4
content: #include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include <string.h>  typedef struct HEAD { unsigned int regf; unsigned int namelength; unsigned char* name; unsigned char head; }HEAD,*PHEAD;  int main(int argc, _TCHAR* argv[]) { 	HEAD h; 	char tmp[1024] = {0}; 	const char* p = tmp; 	printf("input name:\n"); 	scanf("%s", tmp);  	h.namelength = strlen(p); 	h.name = (unsigned char*)p;   	printf("name is : %s , name lenth is : %d \n", h.name, h.namelength);  	system("pause"); 	return 0; }

user: user-5
content: 结构体里不是存储额长度了吗，没听懂你意思
user-0 提问: 关于GCC编译过程中头文件问题

回复:
user: user-1
content: 当然除了手写makefile，有时候还会用CMake等自动化工具来自动生成makefile，比你自己手写要容易多了

user: user-1
content: 1、这根gcc的工作方式有关系，gcc是顺着指定目录去查找相应的头文件，而不是你指定头文件，我就引入该头文件，如果是这样的话，那么对于复杂的工程来说，这个工作量是非常大，而且容易出错。 2、这个还跟C的预编译指令，C在使用#include的时候已经指定了目录，比如<>是环境变量中的C头文件目录（如果查不到才是当前目录），而""只从当前目录查起。 有了这两点，编译时就不需要写头文件了。当然作为代替，有可能需要链接放置于其他位置的第三方库，所以就需要用-I参数指定相应的目录就可以了。当然你要指定.h头文件我也没意见，但项目大了，管理就很麻烦了。  不过真的到了大型项目，一般也不会直接在后面写-I啥的，而是专门定义变量CFLAGS之类的来代替吧。具体我就不说了，你可以看看这里：http://www.chinaunix.net/old_jh/23/408225.html

user: user-2
content: 引用 3 楼 lkt2005 的回复:那我makefile该怎么写呢？   objs = main.o sum.o  main : $(objs)         gcc -o main $(objs)  main.o : main.c //此处是否需要添加sum.h？？？ sum.o : sum.c  .PHONY : clean clean:         -rm main $(objs)   gcc中头文件依赖关系什么时候用写，什么时候不用写？  1. 头文件名称不用写在makefile,  只需要把头文件所在的目录用-i加载编译选项里 2. 依赖关系都可以不写，带来的问题是如果你修改了.h，没有修改.c时，没法使用增量编译。依赖关系主要用于增量编译，检查哪些文件需要重新编译。

user: user-3
content: 是这样的，你是把 gcc main.o sum.o -o main 一起编译的所以不会出问题，  因为在生成.o文件的时候，也就是编译过程中，只是对语法进行了检测，sum这个函数是没有地址的，你可以在编译好了main.o后，使用 nm main.o ，就会发现sum 那个符号的类型是U ，U就是表示没有地址，等连接的时候再去查看，不信的话，你可以直接gcc main.c -o main 就会出错，告诉你sum这个地址没找到（没有定义）。之所以gcc main.o sum.o -o main 会正确，是因为main函数能找到sum的地址。   好吧，回头来说头文件，头文件其实在编译的时候，会将头文件里面的内容给替换到.c文件#include 处 ，因此他也不神秘，在每个头文件开头都有一个   #ifndef _XX_H_ #define _XX_H_  /*内容 */  #endif  这就是为了防止重复包含头文件，对于头文件我没其他好说的了。

user: user-0
content: 引用 2 楼 truelance 的回复:c里在函数没有声明的情况下调用，认为返回值是int类型，形参类型和实参类型相同。你的例子就满足这个假设，所以没有头文件也可以。 你换个例子，比如 double sum(double a, double b) {     return a + b; } 就不行了  确实是这样，不过main.c改为：  #include <stdio.h> #include <sum.h>   int main() {     int a = sum(3);     printf("%d\n", a);     return 0; }   那我makefile该怎么写呢？   objs = main.o sum.o  main : $(objs)         gcc -o main $(objs)  main.o : main.c //此处是否需要添加sum.h？？？ sum.o : sum.c  .PHONY : clean clean:         -rm main $(objs)   gcc中头文件依赖关系什么时候用写，什么时候不用写？

user: user-2
content: c里在函数没有声明的情况下调用，认为返回值是int类型，形参类型和实参类型相同。你的例子就满足这个假设，所以没有头文件也可以。 你换个例子，比如 double sum(double a, double b) {     return a + b; } 就不行了

user: user-0
content: 谢谢各位的回答，明白了很多。

user: user-4
content: x86/debian gnu/linux/gcc  main.c  #include <stdio.h>   int main() {     int a = sum(3);     printf("%d\n", a);     return 0; }  gcc -c main.c [compile c code to asm code to main.o] nm main.o       00000000 T main          U printf          U sum    [sum will be used, but not defined in this file]  sum.c  #include <stdio.h>   int sum(int a) {     if (a <= 1)         return a;     else         return a + sum(a-1); }  gcc  -c sum.c nm sum.o 00000000 T sum  ]in obj file(*.o), there is only smybol(sum) but not address.[/b   gcc sum.o main.o -o main nm main ...... 08048444 T main          U printf@@GLIBC_2.0 08048390 t register_tm_clones [b]0804841c T sum ...... linker modify sum's address to main  first define second use in c language, function will be as return integer type if not declare it. my computer can't support chinese now

user: user-5
content: 问题就是，你用的是C，而且你的sum的返回值什么的都是整数，你应该弄个稍微复杂一个函数。
user-0 提问: c写屏问题

回复:
user: user-1
content: 这也太古老了吧！现在编译器都是32位保护模式的啦，这个得用Turbo C编译运行

user: user-2
content: 在纯DOS下或DosBox环境下运行。

user: user-3
content: 也不一定，还有可能是通信协议错了，I/O口配置问题，还有你的地址都没有置0初始化等，都可能不能读写
user-0 提问: 这个printf的写法有点奇怪啊，看不懂啊。

回复:
user: user-1
content: 再啰嗦两句，如果楼主知道那就当我没说 "abc" "def" "gh" 就等于 "abcdefgh" 比如 printf("abc" "def" "gh\n" ); 还有这个 printf("the source file is: " __FILE__ " abcd\n");

user: user-1
content: https://github.com/OculusVR/RakNet/blob/master/Source/RakNetTypes.h #if defined(_MSC_VER) && _MSC_VER > 0 #define PRINTF_64_BIT_MODIFIER "I64" #else #define PRINTF_64_BIT_MODIFIER "ll" #endif

user: user-1
content: 这里的关键显然是PRINTF_64_BIT_MODIFIER，可能在不同的系统或编译器有不同的定义。 比如，如果 #define PRINTF_64_BIT_MODIFIER "ll" 那么这一行就变成了 printf("ID_ALREADY_CONNECTED with guid %llu\n", p->guid); p->guid应该是个64位整数，这个printf就是要把它按照64位的格式打出来
user-0 提问: 为什么我写出来的控制台程序不支持用鼠标滚轮来上下滑动翻页

回复:
user: user-0
content: 好吧，我已经解决了，不是代码的问题。

user: user-1
content: 试试这个代码#pragma comment(lib,"user32") #include <stdio.h> #include <time.h> #include <sys/timeb.h> #include <windows.h> char datestr[16]; char timestr[16]; char mss[4]; void log(char *s) {     struct tm *now;     struct timeb tb;      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,s); } VOID CALLBACK myTimerProc1(   HWND hwnd, // handle of window for timer messages   UINT uMsg, // WM_TIMER message   UINT idEvent, // timer identifier   DWORD dwTime // current system time ) {  log("In myTimerProc1\n"); } VOID CALLBACK myTimerProc2(   HWND hwnd, // handle of window for timer messages   UINT uMsg, // WM_TIMER message   UINT idEvent, // timer identifier   DWORD dwTime // current system time ) {  log("In myTimerProc2\n"); } int main() {     int i;     MSG msg;      SetTimer(NULL,0,1000,myTimerProc1);     SetTimer(NULL,0,2000,myTimerProc2);     for (i=0;i<20;i++) {         Sleep(500);         log("In main\n");         if (GetMessage(&msg,NULL,0,0)) {             TranslateMessage(&msg);             DispatchMessage(&msg);         }      }     return 0; } //2012-07-26 17:29:06.375 In main //2012-07-26 17:29:06.875 In myTimerProc1 //2012-07-26 17:29:07.375 In main //2012-07-26 17:29:07.875 In myTimerProc2 //2012-07-26 17:29:08.375 In main //2012-07-26 17:29:08.375 In myTimerProc1 //2012-07-26 17:29:08.875 In main //2012-07-26 17:29:08.875 In myTimerProc1 //2012-07-26 17:29:09.375 In main //2012-07-26 17:29:09.890 In myTimerProc2 //2012-07-26 17:29:10.390 In main //2012-07-26 17:29:10.390 In myTimerProc1 //2012-07-26 17:29:10.890 In main //2012-07-26 17:29:10.890 In myTimerProc1 //2012-07-26 17:29:11.390 In main //2012-07-26 17:29:11.890 In myTimerProc2 //2012-07-26 17:29:12.390 In main //2012-07-26 17:29:12.390 In myTimerProc1 //2012-07-26 17:29:12.890 In main //2012-07-26 17:29:12.890 In myTimerProc1 //2012-07-26 17:29:13.390 In main //2012-07-26 17:29:13.890 In myTimerProc2 //2012-07-26 17:29:14.390 In main //2012-07-26 17:29:14.390 In myTimerProc1 //2012-07-26 17:29:14.890 In main //2012-07-26 17:29:14.890 In myTimerProc1 //2012-07-26 17:29:15.390 In main //2012-07-26 17:29:15.890 In myTimerProc2 //2012-07-26 17:29:16.390 In main //2012-07-26 17:29:16.390 In myTimerProc1 //2012-07-26 17:29:16.890 In main //2012-07-26 17:29:16.890 In myTimerProc1 //2012-07-26 17:29:17.390 In main //2012-07-26 17:29:17.890 In myTimerProc2 //2012-07-26 17:29:18.390 In main //2012-07-26 17:29:18.390 In myTimerProc1 //2012-07-26 17:29:18.890 In main //2012-07-26 17:29:18.890 In myTimerProc1 //2012-07-26 17:29:19.390 In main //2012-07-26 17:29:19.890 In myTimerProc2

user: user-0
content: 引用 1 楼 user-3 的回复:你在cmd环境里运行就好，  我想直接运行编译生成的那个exe文件，请问有办法让他支持鼠标的滚轮吗？？

user: user-2
content: 引用 1 楼 user-3 的回复:你在cmd环境里运行就好，+1

user: user-3
content: 你在cmd环境里运行就好，
user-0 提问: float 型变量到底可以提供几位有效数字？

回复:
user: user-1
content: 感謝各位高手了解了解

user: user-2
content: float：    1bit（符号位） 8bits（指数位） 23bits（尾数位） 精度是由尾数的位数来决定的 float：2^23 = 8388608，一共七位，这意味着最多能有7位有效数字， 但绝对能保证的为6位，也即float的精度为6~7位有效数字；

user: user-3
content: 顶楼上的，是这样

user: user-4
content: include\float.h ... #define FLT_DIG         6                       /* # of decimal digits of precision */ #define FLT_EPSILON     1.192092896e-07F        /* smallest such that 1.0+FLT_EPSILON != 1.0 */ #define FLT_GUARD       0 #define FLT_MANT_DIG    24                      /* # of bits in mantissa */ #define FLT_MAX         3.402823466e+38F        /* max value */ #define FLT_MAX_10_EXP  38                      /* max decimal exponent */ #define FLT_MAX_EXP     128                     /* max binary exponent */ #define FLT_MIN         1.175494351e-38F        /* min positive value */ #define FLT_MIN_10_EXP  (-37)                   /* min decimal exponent */ #define FLT_MIN_EXP     (-125)                  /* min binary exponent */ #define FLT_NORMALIZE   0 #define FLT_RADIX       2                       /* exponent radix */ #define FLT_ROUNDS      1                       /* addition rounding: near */ ... http://bbs.csdn.net/topics/390676437

user: user-5
content: 7~8个 vc那个不是按float输出的

user: user-6
content: 你这个结论不严谨吧, float是23位底数位, 换算成10进制不是能以整数对上的, 不是说一个数能精确到8位就所有数都能精确到8位.

user: user-7
user-0 提问: 关于一个插入算法的问题

回复:
user: user-1
content: C语言的基本语法要先搞会。这个算法不算难，再好好调试一下，尽量先不看别人的代码。

user: user-2
content: 顶楼上一个吧，，，，

user: user-3
content: “多一少一”问题占程序员常犯错误的10%以上！ 避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断，搬手指头心算验证一下程序到底应该写为 x、x-1、x+1中的哪个？ <、<=、==、>、>=中的哪个？

user: user-4
content: 1. k[j+1]=k[j--]; 的各步骤顺序和执行结果在c标准中是未定义的，各编译器实现可能不一样。你使用某个编译器结果可能正确，但换一个编译器可能就错了。换成后面的写法结果是确定的。  2. c的数组下标是从0开始的，你的写法都是从1开始的 for (i = 1; i < n; i++)     while ( j >= 0 ...  insertsort(test,7);

user: user-5
content: 仅供参考里面貌似有插入排序 http://pan.baidu.com/s/17yIcQ 突然发现我这代码好万能。。。
user-0 提问: 再发一个多线程的面试题

回复:
user: user-1
content: 信号量的信号数量有意义，读写锁的共享数目一般没有意义  指的是信号量可以允许某个数量的线程同时访问（读，写） 读写锁分读锁和写锁，读锁可以允许无数线程同时去读（如果没有其它线程锁住写锁的话），写锁只允许一个线程去写（如果没有其它线程锁住读锁或写锁的话），所以数量没有意义。

user: user-0
content: 有人知道吗？

user: user-0

user: user-0
content: 引用 3 楼 my3439955 的回复:个人看法：  你没有把握到面试官要考察的点，他考察的点就是说信号量可以多线程同时获取，读写锁也可以多线程同时获取，看起来很类似，有什么区别？  可以从两点作答 1、信号的获得者是彼此平等的，读写锁的获得者有两类，读者和写者，不是平等的  2、信号量的信号数量有意义，读写锁的共享数目一般没有意义 2、信号量的信号数量有意义，读写锁的共享数目一般没有意义   “什么意义？ 是指多个线程可以拥有资源的访问权？  而读写锁不具备访问权概念？  是这样理解吗？”

user: user-2
content: 个人看法：  你没有把握到面试官要考察的点，他考察的点就是说信号量可以多线程同时获取，读写锁也可以多线程同时获取，看起来很类似，有什么区别？  可以从两点作答 1、信号的获得者是彼此平等的，读写锁的获得者有两类，读者和写者，不是平等的  2、信号量的信号数量有意义，读写锁的共享数目一般没有意义

user: user-3
content: 不懂

user: user-0
user-0 提问: C语言实现的二叉树并显示，出不来结果啊，求解

回复:
user: user-1
content: 引用 9 楼 truelance 的回复:这是你自己定义的 lz这代码是你自己写的吗

user: user-2
content: 引用 7 楼 shenlei190810 的回复:[quote=引用 4 楼 truelance 的回复:] createBitaryTree(BinaryTree *binaryTree) 等价于 createBitaryTree(BinaryTreeNode **binaryTree) 要传入的是一个二重指针这里为什么要用二重指针[/quote] 这是你自己定义的

user: user-3
content: http://blog.sina.com.cn/s/blog_62cd3a270100qkcm.html

user: user-0
content: 引用 4 楼 truelance 的回复:createBitaryTree(BinaryTree *binaryTree) 等价于 createBitaryTree(BinaryTreeNode **binaryTree) 要传入的是一个二重指针这里为什么要用二重指针

user: user-0
content: 引用 2 楼 truelance 的回复:在main()里调用 createBitaryTree(&bt);为什么要用指向指针的指针呢？

user: user-4
content: 引用 3 楼 shenlei190810 的回复:[quote=引用 2 楼 truelance 的回复:] 在main()里调用 createBitaryTree(&bt);为什么啊BinaryTree 不就是一个指针嘛[/quote]类型和你定义的不一样，你函数的形参是BinaryTree*，你传的实参是BinaryTree

user: user-2
content: createBitaryTree(BinaryTree *binaryTree) 等价于 createBitaryTree(BinaryTreeNode **binaryTree) 要传入的是一个二重指针

user: user-0
content: 引用 2 楼 truelance 的回复:在main()里调用 createBitaryTree(&bt);为什么啊BinaryTree 不就是一个指针嘛

user: user-2
content: 在main()里调用 createBitaryTree(&bt);

user: user-0
content: 输入ABC##D##E##输入的是对的啊，就是不出结果啊
user-0 提问: const 参数 C++11类型转换,编译不过

回复:
user: user-1
content: C++四个特定显式强制转换， 是各有用途的 不用在对应的地方，对了是凑巧 不对是正常  子类（指针，引用）转换成基类（指针，引用）不需要任何显式强制转换 反之需要 实际上，这个强制转换本来就是错误用法， 因为可以使用虚函数的地方，不需要强制转换  只有为了某种特殊用途（例如MFC框架），才需要dynamic_cast 如果你用了dynamic_cast 大部分情况是，你的设计有问题，而不是你的真的需要dynamic_cast

user: user-0
content: 引用 1 楼 Jenf_Mu 的回复:inline void fun(const A* a) 	{ 		A* a1 = const_cast<A*>(a); 		const B* b = static_cast<B*>(a1); 		cout<<b<<endl; 	}  问一下  struct A 	{ 		int a; 	}; 	struct B : A 	{ 		int b; 		void display() const 		{ 			cout<<b<<endl; 		} 	}; 	struct C : A 	{  	};  	inline void fun(const A* a) 	{ 		const B* b = static_cast<const B*>(a); 		b->display(); 		cout<<b<<endl; 	}  	inline void test() 	{ 		B b; 		b.b = 100; 		fun(&b); 		C c; 		fun(&c); 	} 这种情况下,用 dynamic_cast会报错,因为类B没有虚函数,不是多态的. 但用static_cast的话,像struct C这里就错了,但它不能检测出来,怎么办呢?

user: user-2
content: const B* b = static_cast<const B*>(a);

user: user-3
content: inline void fun(const A* a) 	{ 		A* a1 = const_cast<A*>(a); 		const B* b = static_cast<B*>(a1); 		cout<<b<<endl; 	}

user: user-3
content: 引用 3 楼 oN5GrzoN 的回复:[quote=引用 1 楼 Jenf_Mu 的回复:] inline void fun(const A* a) 	{ 		A* a1 = const_cast<A*>(a); 		const B* b = static_cast<B*>(a1); 		cout<<b<<endl; 	}  问一下  struct A 	{ 		int a; 	}; 	struct B : A 	{ 		int b; 		void display() const 		{ 			cout<<b<<endl; 		} 	}; 	struct C : A 	{  	};  	inline void fun(const A* a) 	{ 		const B* b = static_cast<const B*>(a); 		b->display(); 		cout<<b<<endl; 	}  	inline void test() 	{ 		B b; 		b.b = 100; 		fun(&b); 		C c; 		fun(&c); 	} 这种情况下,用 dynamic_cast会报错,因为类B没有虚函数,不是多态的. 但用static_cast的话,像struct C这里就错了,但它不能检测出来,怎么办呢?[/quote]  基类加虚析构函数

user: user-4
content: //cout<<b<<endl(); cout<<b<<endl;

user: user-4
content: const B* b = reinterpret_cast<B const*>(a);
user-0 提问: ftok产生的key冲突了

回复:
user: user-0
content: 用户a和b 文件i节点及程序调试查看ftok产生的key值如下 用户a： a-/home/a/etc/ipckey>ls -li 2097174 -rwxrw-r--. 1 a a    0 Sep 22  2013 comm 程序调试： 64		sprintf(strPath,"%s/etc/ipckey/comm",getenv("HOME")); (gdb) p strPath $1 = "/home/a/etc/ipckey/comm", '\000' <repeats 91 times> (gdb) n 67		if ((ilShareKey = ftok(strPath,1)) == (key_t)-1) (gdb) p ilShareKey $2 = 16908310  用户b： b-/home/b/etc/ipckey>ls -li 2228246 drwxr-xr-x. 2 b b 4096 Sep 22  2013 trnlog 程序调试： 64		sprintf(strPath,"%s/etc/ipckey/trnlog",getenv("HOME")); (gdb) p strPath $1 = "/home/b/etc/ipckey/trnlog", '\000' <repeats 89 times> (gdb) n 67		if ((ilShareKey = ftok(strPath,1)) == (key_t)-1) (gdb) p ilShareKey $2 = 16908310

user: user-1
content: ftok就是通过文件的一些属性加上id值得到的key值，的确存在不同文件同一id值生成相同key值的可以，比如我遇到的这种情况。

user: user-1
content: 亲，恭喜，恭喜啊！问题解决了！   赞一个！恩，不错！继续努力！

user: user-0
content: 好吧，没人解答我来说说吧！ 翻看了ftok的实现源码，得知ftok就是通过文件的一些属性加上id值得到的key值，的确存在不同文件同一id值生成相同key值的可以，比如我遇到的这种情况。 先列出ftok的实现，精简如下： key = ((st.st_ino & 0xffff) | ((st.st_dev & 0xff) << 16) | ((proj_id & 0xff) << 24)); 用户a： a-/home/a/etc/ipckey>stat -c "%i %d" comm 2097174 64770 用户b： b-/home/b/etc/ipckey>stat -c "%i %d" trnlog 2228246 64770  按照ftok的实现经过计算，的确得出相同的结果。 所以说，ftok的使用不只是大家所说的，如果生成key值的文件在使用，不允许删除重建，否则会出现意想不到的问题；而且，相同的机器，我们也需要注意我遇到的这种情况。  通过以上，我明白了ftok产生的问题，让我纠结了几天的问题。 ～～～结贴～～～
user-0 提问: 怎么  用C 编写 程序 运行的 窗口？

回复:
user: user-1
content: 引用 9 楼 u012421456 的回复:你建的都是win2吧，需要看的还很多，建议先把基础的学扎实再进一步吧，我也是推荐windows程序设计 1600多页阿！看来要挑着学？

user: user-2
content: 你建的都是win2吧，需要看的还很多，建议先把基础的学扎实再进一步吧，我也是推荐windows程序设计

user: user-3
content: 新建Windows项目（非Console项目） #pragma comment(lib,"user32") #pragma comment(lib,"gdi32") #include <windows.h> LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {     PAINTSTRUCT ps;     HDC hdc;     HFONT hfont,ohfont;     RECT r;     COLORREF oc;      switch(message) {     case WM_CLOSE://按Alt+F4退出         PostQuitMessage(0);         break;     case WM_PAINT:         BeginPaint(hWnd, &ps);         hdc = ps.hdc; // the device context to draw in         GetClientRect(hWnd, &r); // Obtain the window's client rectangle         hfont = CreateFont(240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "华文楷体");         ohfont=(HFONT)SelectObject(hdc,hfont);         oc=SetTextColor(hdc,0x00C080FF);         SetBkMode(hdc, TRANSPARENT);         TextOut(hdc,r.left+r.right/2-720, r.top+r.bottom/2-120,"最短画图程序",12);         SelectObject(hdc,ohfont);         SetTextColor(hdc,oc);         DeleteObject(hfont);         EndPaint(hWnd, &ps);         break;     default:         return DefWindowProc(hWnd, message, wParam, lParam);     }     return 0; } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {     MSG msg             = {0};     WNDCLASS wc         = {0};     HBRUSH hbrh;     hbrh=CreateSolidBrush(0x00000000);     wc.lpfnWndProc      = WndProc;     wc.hInstance        = hInstance;     wc.hbrBackground    = hbrh;     wc.lpszClassName    = "minwindowsapp";     wc.hCursor          = LoadCursor(NULL,IDC_ARROW);     if( FAILED(RegisterClass(&wc)) ) return 1;      if(FAILED(CreateWindow(wc.lpszClassName,                         "Minimal Windows Application",                         WS_POPUP|WS_VISIBLE,                         0,                         0,                         GetSystemMetrics(SM_CXSCREEN),                         GetSystemMetrics(SM_CYSCREEN),                         0,                         0,                         hInstance,                         NULL)))         return 2;      while( GetMessage( &msg, NULL, 0, 0 ) > 0 ) {         DispatchMessage( &msg );     }     DeleteObject(hbrh);     return 0; }

user: user-4
content: 你还刚刚起步编程，直接上界面开发，可能会很吃力

user: user-5
content: 要实现你的目的，可以看《windows程序设计》，这本宝典。网上有电子版下。

user: user-6
content: 引用 4 楼 u012903205 的回复:C语言可以用QT吗？有没有中文资料，我英文不会。。。。  QT是C++图形库。  资料的话看《C++ GUI Qt4编程》，PDF下载：http://pan.baidu.com/share/link?uk=3036839225&shareid=2760252208&fid=1758407184  我只能帮你到这了。

user: user-7
content: C语言可以用QT吗？有没有中文资料，我英文不会。。。。

user: user-6
content: 用GUI图形库编程。。。

user: user-8
content: 参考http://blog.csdn.net/liuchao35758600/article/details/7213978  引用 楼主 c704225271 的回复:用 VC  编写程序 都是  黑色的窗口运行的  ，怎么编写 出 我们自己 喜欢的 窗口运行啊，求大神帮忙~~~

user: user-9
content: mfc、win32、qt等。。。
user-0 提问: 分块查找的算法分析ASL为什么我始终算的和书上不一样，大神帮忙看看

回复:
user: user-1
content: 引用 3 楼 u011410413 的回复:[quote=引用 2 楼 user-3 的回复:] 你算的和结论不是一致的吗，没有错啊，难道我眼花了？ 同觉奇怪，你的导数求出来的不就是那极小值么？  只是 s = -根号n代回原函数的得数不对，貌似是 1-根号n。[/quote]  或者在“所以”后面的结论，应该写  因为n很大， 所以f =（ 1-根号n）是没用的。那么只有 s = 根号n的时候，f = 1+根号n。 1是自然数，直接忽略，节点数变成了 根号n

user: user-1
content: 引用 2 楼 user-3 的回复:你算的和结论不是一致的吗，没有错啊，难道我眼花了？ 同觉奇怪，你的导数求出来的不就是那极小值么？  只是 s = -根号n代回原函数的得数不对，貌似是 1-根号n。

user: user-2
content: 路过。。。 最讨厌做数学题了

user: user-3
content: 你算的和结论不是一致的吗，没有错啊，难道我眼花了？
user-0 提问: 新手入门碰到障碍希望高手指点

回复:
user: user-1
content: localtime系列函数，都有对应的线程安全的版本，localtime_r r是指可重入，reentrant

user: user-0
content: 引用 3 楼 BEE_HY 的回复:[quote=引用 1 楼 user-1 的回复:] $ man localtime ...... The return value points to a statically allocated struct which might be overwritten by subsequent calls to any of the date and time functions. 返回值是一个静态指针大哥你能不能讲清楚点，我笨你这样回答我也不知道怎么改。谢谢谢谢在指导下谢谢[/quote]谢谢你

user: user-0
content: 引用 6 楼 user-1 的回复:[quote=引用 4 楼 BEE_HY 的回复:] 嗯试了果然是的，这意思是我调用了localtime就要马上的用，或者就不要在调用这个函数了不然他会影响其他的类似指针么？ 对，就是这样的[/quote]很谢谢你

user: user-0
content: 引用 5 楼 user-1 的回复:稍微改一下： struct  tm  tmp; ...... now = localtime(&calptr); tmp = *now; ...... printf("now_3 is:%d:%d:%d\n",now->tm_hour,now->tm_min,now->tm_sec);//这里时间为什么变了求指点 printf("tmp is:%d:%d:%d\n",tmp.tm_hour,tmp.tm_min,tmp.tm_sec); 你会看到，tmp没有变化。  总结一下：localtime以及类似的一系列函数，返回的指针都是指向同一个公用内存，每次调用这些函数，就把当前时间的内容覆盖那块内存，然后返回一个指向那块公用内存的指针。所以，之前返回的指针的内容会变化。 解决的办法：每次调用之后，马上使用或者保存返回值的内容，否则以后会失效。你好很谢谢你

user: user-1
content: 引用 4 楼 BEE_HY 的回复:嗯试了果然是的，这意思是我调用了localtime就要马上的用，或者就不要在调用这个函数了不然他会影响其他的类似指针么？ 对，就是这样的

user: user-1
content: 稍微改一下： struct  tm  tmp; ...... now = localtime(&calptr); tmp = *now; ...... printf("now_3 is:%d:%d:%d\n",now->tm_hour,now->tm_min,now->tm_sec);//这里时间为什么变了求指点 printf("tmp is:%d:%d:%d\n",tmp.tm_hour,tmp.tm_min,tmp.tm_sec); 你会看到，tmp没有变化。  总结一下：localtime以及类似的一系列函数，返回的指针都是指向同一个公用内存，每次调用这些函数，就把当前时间的内容覆盖那块内存，然后返回一个指向那块公用内存的指针。所以，之前返回的指针的内容会变化。 解决的办法：每次调用之后，马上使用或者保存返回值的内容，否则以后会失效。

user: user-0
content: 引用 2 楼 user-1 的回复:在report函数的最后加上这四行： printf("%p\n", now); printf("%p\n", accesstime); printf("%p\n", lmodifytime); printf("%p\n", lchangetime); 你会发现他们的值全都一样。 所以，每次调用localtime，now的内容都会变化，也就是man里面说的might be overwritten by subsequent calls嗯试了果然是的，这意思是我调用了localtime就要马上的用，或者就不要在调用这个函数了不然他会影响其他的类似指针么？

user: user-0
content: 引用 1 楼 user-1 的回复:$ man localtime ...... The return value points to a statically allocated struct which might be overwritten by subsequent calls to any of the date and time functions. 返回值是一个静态指针大哥你能不能讲清楚点，我笨你这样回答我也不知道怎么改。谢谢谢谢在指导下谢谢

user: user-1
content: 在report函数的最后加上这四行： printf("%p\n", now); printf("%p\n", accesstime); printf("%p\n", lmodifytime); printf("%p\n", lchangetime); 你会发现他们的值全都一样。 所以，每次调用localtime，now的内容都会变化，也就是man里面说的might be overwritten by subsequent calls

user: user-1
content: $ man localtime ...... The return value points to a statically allocated struct which might be overwritten by subsequent calls to any of the date and time functions. 返回值是一个静态指针
user-0 提问: 笔试题目来了，

回复:
user: user-1
content: 引用 7 楼 u012879787 的回复:[quote=引用 5 楼 lovesmiles 的回复:] [quote=引用 3 楼 u012879787 的回复:] [quote=引用 2 楼 Evhung 的回复:] x = 1; 50  100;  为什么x++不是？  还有，为什么是50----100 之间？  [/quote] x++有三条汇编指令 x内存入寄存器 寄存器自加1 寄存器数据放回内存x  多线程可以在这三条指令中间插入其它的指令的，这些指令如果对x有操作，显然结果就不可知了。 tally += 1 一样是分为三条指令，最坏的情况就是线程一读x，线程二也读x，线程一寄存器加一，线程二寄存器加一，放回 x，线程二放加x，这种情况虽然二个线程都对x加1，但显然只加了一次。所以到最后只加50次。  最好的情况就是线程一的for结束，再到线程二的for 一共执行100次 [/quote]  编译器不是有个优化吗？  volatile的问题，是防止编译器优化。 由于 我提供的代码里是没有volatile这个关键字，  你说，会不会因为 没有volatile 影响结果，导致结果最终不会在50---100 以内啊？  [/quote] 已经分析了每次+1都有同时访问冲突和每次+1都没有访问冲突的情况。  你开不开优化都无关要紧了，不会跳出这两个极端情况的。

user: user-0
content: 引用 5 楼 lovesmiles 的回复:[quote=引用 3 楼 u012879787 的回复:] [quote=引用 2 楼 Evhung 的回复:] x = 1; 50  100;  为什么x++不是？  还有，为什么是50----100 之间？  [/quote] x++有三条汇编指令 x内存入寄存器 寄存器自加1 寄存器数据放回内存x  多线程可以在这三条指令中间插入其它的指令的，这些指令如果对x有操作，显然结果就不可知了。 tally += 1 一样是分为三条指令，最坏的情况就是线程一读x，线程二也读x，线程一寄存器加一，线程二寄存器加一，放回 x，线程二放加x，这种情况虽然二个线程都对x加1，但显然只加了一次。所以到最后只加50次。  最好的情况就是线程一的for结束，再到线程二的for 一共执行100次 [/quote]  编译器不是有个优化吗？  volatile的问题，是防止编译器优化。 由于 我提供的代码里是没有volatile这个关键字，  你说，会不会因为 没有volatile 影响结果，导致结果最终不会在50---100 以内啊？

user: user-2
content: 引用 5 楼 lovesmiles 的回复:[quote=引用 3 楼 u012879787 的回复:] [quote=引用 2 楼 Evhung 的回复:] x = 1; 50  100;  为什么x++不是？  还有，为什么是50----100 之间？  [/quote] x++有三条汇编指令 x内存入寄存器 寄存器自加1 寄存器数据放回内存x  多线程可以在这三条指令中间插入其它的指令的，这些指令如果对x有操作，显然结果就不可知了。 tally += 1 一样是分为三条指令，最坏的情况就是线程一读x，线程二也读x，线程一寄存器加一，线程二寄存器加一，放回 x，线程二放加x，这种情况虽然二个线程都对x加1，但显然只加了一次。所以到最后只加50次。  最好的情况就是线程一的for结束，再到线程二的for 一共执行100次 [/quote]1楼牛B,比我想的要多

user: user-1
content: 引用 3 楼 u012879787 的回复:[quote=引用 2 楼 Evhung 的回复:] x = 1; 50  100;  为什么x++不是？  还有，为什么是50----100 之间？  [/quote] x++有三条汇编指令 x内存入寄存器 寄存器自加1 寄存器数据放回内存x  多线程可以在这三条指令中间插入其它的指令的，这些指令如果对x有操作，显然结果就不可知了。 tally += 1 一样是分为三条指令，最坏的情况就是线程一读x，线程二也读x，线程一寄存器加一，线程二寄存器加一，放回 x，线程二放加x，这种情况虽然二个线程都对x加1，但显然只加了一次。所以到最后只加50次。  最好的情况就是线程一的for结束，再到线程二的for 一共执行100次

user: user-3
content: 我还以为是今天阿里的笔试题呢。。。有人分享就好了。。。

user: user-0
content: 引用 2 楼 Evhung 的回复:x = 1; 50  100;  为什么x++不是？  还有，为什么是50----100 之间？

user: user-2
content: x = 1; 50  100;

user: user-1
content: 第一题选d，因为这个操作可以用一条指令实现，是原子操作。 第二题最是50-100之间。
user-0 提问: 跪求大家推荐一款C的编程软件

回复:
user: user-1
content: 又看到推荐vim Emacs的，，，等新人学完，心都扒凉扒凉了，，，，，，，，新手就用vs2008 Express，或者vs2010 Express，VC6太老啦，

user: user-2
content: VC 6或GCC

user: user-3
content: slickedit 和vs

user: user-4
content: win-tc

user: user-5
content: 五花八门，学习了！我偶尔练习的话win下用dev C++,linux下用vi

user: user-6
content: 引用 48 楼 Heaydeny 的回复:又看到推荐vim Emacs的，，，等新人学完，心都扒凉扒凉了，，，，，，，，新手就用vs2008 Express，或者vs2010 Express，VC6太老啦， 有道理。

user: user-7
content: 引用 31 楼 Adol1111 的回复:[quote=引用 30 楼 ping_yourheart 的回复:] 楼主说了只是初学者，各位大神不要推荐什么vi,vim,emacs,刚开始就用这些只会让楼主失去兴趣，建议windows下用VS，linux下用Qt creater 或者 eclips，等楼主熟悉了语言之后再来推荐高大上的工具吧。 vim说实话对于大部分人来说纯粹使兴趣，新手用vim写项目相当吃力，而且非常容易出问题。不过纯粹把vim当成查看代码的工具也没啥问题，前提是配置好。 不过eclipse啥的也同样非常非常的不好用，包括用eclipse写Java，提示什么的非常的鸡肋，appcode和VS+vax/resharper就好很多，可惜都没有linux下的工具。Qt还算不错。还是希望Jetbrains的C++ IDE早点开发好，那才是神器啊（VS虽好，但实在是太大了....）。[/quote]  idea不错，最好用的Java IDE

user: user-7
content: 引用 3 楼 maersi2013 的回复:C语言程序设计 谭浩强，书比较薄，适合初学者，待有点基础之后可以学点进阶的  刚看到有一个人推荐这本书是这么说的：找到这本书里面的错误，然后把它都改正确了，你就差不多了

user: user-8
content: dev cpp

user: user-9
content: Falcon C++  IDE; Falconcpp.sourceforge.net下载。

user: user-10
content: VC++6.0吧，虽然是个比较老的东西，但是足够初学者用了，调试什么的都很方便，初学者要尽快学会调试程序，不然程序出错了都不知道如何查错，很花费时间~

user: user-11
content: DEV C++

user: user-12
content: 我推薦VC6.0 因為它可以看到彙編代碼，幫助你理解整個流程。 http://see.xidian.edu.cn/cpp/html/1117.html

user: user-13
content: vs2010

user: user-14
content: 引用 30 楼 ping_yourheart 的回复:楼主说了只是初学者，各位大神不要推荐什么vi,vim,emacs,刚开始就用这些只会让楼主失去兴趣，建议windows下用VS，linux下用Qt creater 或者 eclips，等楼主熟悉了语言之后再来推荐高大上的工具吧。 vim说实话对于大部分人来说纯粹使兴趣，新手用vim写项目相当吃力，而且非常容易出问题。不过纯粹把vim当成查看代码的工具也没啥问题，前提是配置好。 不过eclipse啥的也同样非常非常的不好用，包括用eclipse写Java，提示什么的非常的鸡肋，appcode和VS+vax/resharper就好很多，可惜都没有linux下的工具。Qt还算不错。还是希望Jetbrains的C++ IDE早点开发好，那才是神器啊（VS虽好，但实在是太大了....）。

user: user-15
content: 楼主说了只是初学者，各位大神不要推荐什么vi,vim,emacs,刚开始就用这些只会让楼主失去兴趣，建议windows下用VS，linux下用Qt creater 或者 eclips，等楼主熟悉了语言之后再来推荐高大上的工具吧。

user: user-16
content: vim 是一个强大的编辑器，不过里面有很多控制命令，如果新手能够坚持的话，那么对你的帮助是很大的，不过对于大一点的程序编程，我推荐source  insight，非常好用。编译器就用gcc吧，很好。 一般C开发公司都会用source insight+gcc开发。

user: user-17
content: 引用 36 楼 mmlinux 的回复:如果是新手，并且希望Windows下编程，我建议用VC++，XP用6.0的，Win7以上用VC2008、VC2010吧。 如果在Linux下，我觉得你应该很清楚，用Vim+GCC就行。  很好

user: user-18
content: 我个人推荐你使用vc++，入门简单

user: user-19
content: c应该是比较基本的，照着书本学也行的啊
user-0 提问: 基于游程编码的二值图像连通区域标记

回复:
user: user-1
content: 我最近也在做方面，楼主有代码吗？能发给我吗？谢谢了 1455727899@qq.com

user: user-2
content: 楼主能否共享下 代码 我最近也在做这方面的东西 万分感谢 564354093@qq.com

user: user-0
content: 谢谢，不过我已经自己写出来了

user: user-3
content: 仅供参考#include <stdio.h> #include <stdlib.h> #include <conio.h> #include <graphics.h> int xs[10000]; int ys[10000]; int i=0,xx,yy; int fc,bc; void push(int x,int y) {     xs[i]=x;     ys[i]=y;     if (i<10000-1) {         i=i+1;     } else {         printf("stack overflow!\n");         exit(1);     } } void pop(void) {     i=i-1;     xx=xs[i];     yy=ys[i]; } int check(int x,int y) {     int c;      c=getpixel(x,y); /* 获取当前点的颜色 */     return ((c!=bc)&&(c!=fc));/* 如果颜色为边界色或填充色则不填充 */ } void seedfilling(int x,int y,int fill_color,int boundary_color) {     fc=fill_color;     bc=boundary_color;     push(x,y);     while (1) {         if (i<=0) return;         pop();         if (check(xx,yy)) {             putpixel(xx, yy, 14);getch();  /* 加上这行显示当前填充状态 */              putpixel(xx, yy, fill_color); /* 画点 */              if (check(xx-1,yy  )) push(xx-1,yy  );             if (check(xx  ,yy+1)) push(xx  ,yy+1);             if (check(xx  ,yy-1)) push(xx  ,yy-1);             if (check(xx+1,yy  )) push(xx+1,yy  );             /* 去掉下面四句就是四连通 */             if (check(xx-1,yy-1)) push(xx-1,yy-1);             if (check(xx-1,yy+1)) push(xx-1,yy+1);             if (check(xx+1,yy-1)) push(xx+1,yy-1);             if (check(xx+1,yy+1)) push(xx+1,yy+1);         }     } } void main() {     int a,b,color;     int gdriver = DETECT, gmode, errorcode;     int poly[10];      initgraph(&gdriver, &gmode, "d:\\bc\\bgi");     a=150;     b=140;     color=4;     poly[0]=110;/* 第一个点的x坐标以及y坐标 */     poly[1]=110;     poly[2]=200;/* 第二点 */     poly[3]=105;     poly[4]=170;/* 第三点 */     poly[5]=120;     poly[6]=150;/* 第四点 */     poly[7]=170;     poly[8]=110;/* 多边形的起点与终点一样 */     poly[9]=110;     drawpoly(5,poly);/* 显示各点连接起来的多边形 */      /* 保证边界对八连通是封闭的 */     setviewport(0,1,600,300,0);     drawpoly(5,poly);/* 显示各点连接起来的多边形 */     setviewport(1,0,600,300,0);     drawpoly(5,poly);/* 显示各点连接起来的多边形 */     setviewport(1,1,600,300,0);     drawpoly(5,poly);/* 显示各点连接起来的多边形 */      /* 恢复默认viewport */     setviewport(0,0,600,300,0);      seedfilling(a,b,color,15);  /* 种子填充多边形 */      getch();     closegraph(); }

user: user-4
content: 我也在找，。。。。。。。
user-0 提问: sscanf 如何得到下面的数据

回复:
user: user-1
content: 仅供参考#include <stdio.h> #include <string.h> #include <time.h> #include <sys/timeb.h>  struct tm st; time_t tt; char mon[4]; char mn[12][4]={"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"}; int i; char timstr[27]; char tmpbuf[128]; struct _timeb tb; int tz; char c;  void main() {     strcpy(timstr,"08/Dec/2011:15:25:03 +0800");     sscanf(timstr,"%2d/%3s/%4d:%2d:%2d:%2d",&st.tm_mday,mon,&st.tm_year,&st.tm_hour,&st.tm_min,&st.tm_sec);     for (i=0;i<12;i++) if (0==stricmp(mn[i],mon)) {st.tm_mon=i; break;}     st.tm_year-=1900;     tt=mktime(&st);     if (-1!=tt) {         strftime(tmpbuf,128,"%Y-%m-%d %H:%M:%S\n",localtime(&tt));         printf(tmpbuf);//2011-12-08 15:25:03     } else {         printf("[%s] is Invalid time string!\n",timstr);     }      _ftime(&tb);     strftime(tmpbuf,128,"%m/%b/%Y:%H:%M:%S",localtime(&tb.time));     tz=-tb.timezone;     c=(tz>0)?'+':'-';     tz=(tz>0)?tz:-tz;     sprintf(tmpbuf,"%s %c%02d%02d\n",tmpbuf,c,tz/60,tz%60);     printf(tmpbuf);//12/Dec/2011:17:36:41 +0800 }

user: user-0
content: 哦，我忘记传值了，难怪

user: user-0
content: 你测试过?....

user: user-2
content: char *str="1988/07/01-22:33:10"; sscanf(str, "%d/%d/%d-%d:%d:%d",nyear,nmouth,nday,ntime,nminitue,nsecond);
user-0 提问: 求大牛帮忙，sscanf中的正则表达式

回复:
user: user-1
content: 仅供参考#include <stdio.h> char s[]="123 ab 4"; char *p; int v,n,k; void main() {     p=s;     while (1) {         k=sscanf(p,"%d%n",&v,&n);         printf("k,v,n=%d,%d,%d\n",k,v,n);         if (1==k) {             p+=n;         } else if (0==k) {             printf("skip char[%c]\n",p[0]);             p++;         } else {//EOF==k             break;         }     }     printf("End.\n"); } //k,v,n=1,123,3 //k,v,n=0,123,3 //skip char[ ] //k,v,n=0,123,3 //skip char[a] //k,v,n=0,123,3 //skip char[b] //k,v,n=1,4,2 //k,v,n=-1,4,2 //End.

user: user-2
content: 引用 1 楼 akirya 的回复:sscanf的正则太弱了，先strstr找到crash再用sscanf+1,c用正则表达式很麻烦。。。

user: user-3
content: 引用 5 楼 truelance 的回复:当然不算。你应该知道什么是正则吧...只知道.net的类库。

user: user-4
content: 引用 3 楼 judwenwen2009 的回复:[quote=引用 2 楼 truelance 的回复:] c的标准库里没有对正则表达式的支持。 你要找第三方库，或者按LS的方法近似处理。  sscanf里的不算正则吗。。。[/quote]  当然不算。你应该知道什么是正则吧...

user: user-0
content: 引用 1 楼 akirya 的回复:sscanf的正则太弱了，先strstr找到crash再用sscanf  嗯，我之前是这种用法，但需要匹配的文本太多了，所以我想直接用sscanf进行的，花了一上午还没调查出结果，难道不可能吗？

user: user-0
content: 引用 2 楼 truelance 的回复:c的标准库里没有对正则表达式的支持。 你要找第三方库，或者按LS的方法近似处理。  sscanf里的不算正则吗。。。

user: user-4
content: c的标准库里没有对正则表达式的支持。 你要找第三方库，或者按LS的方法近似处理。

user: user-5
content: sscanf的正则太弱了，先strstr找到crash再用sscanf
user-0 提问: [菜鸟提问之3]关于C指针，这样在VC6下不能通过，codeblock却是OK的，为何？

回复:
user: user-1
content: 只能说codeblock语法不严谨

user: user-2
content: 引用 6 楼 truelance 的回复:c里对类型转换检查不严格，只会报warning. c++检查严格，会报error.  所以.c文件会报warning编译通过, .cpp文件编译不通过。+1

user: user-3
content: c里对类型转换检查不严格，只会报warning. c++检查严格，会报error.  所以.c文件会报warning编译通过, .cpp文件编译不通过。

user: user-0
content: 引用 4 楼 relaxisland 的回复:编译不过才是对的吧，太危险了 如果你要这么使用， 就用强转吧  #貌似没有设置项  就我目前的知识来说，是的。通不过才是对。我不是要这么使用，只是想知道原因。

user: user-4
content: 编译不过才是对的吧，太危险了 如果你要这么使用， 就用强转吧  #貌似没有设置项

user: user-5
content: 主要是C 和 C++的区别

user: user-6
content: .c和.cpp扩展名的区别

user: user-5
content: VC6 不要后缀.cpp 一样只是警告
user-0 提问: 讨论下下面两个程序的运行速度差异

回复:
user: user-1
content: 我没有时间去弄你这个程序，不过我可以告诉你大概的原因。 C程序在编译连接后，会变成机器码，而汇编语言是最接近机器码的语言，一起我用过汇编编写程序的。  你可以反汇编的打印下这个程序的汇编代码，你会发现，第二个的代码比第一个的代码的汇编指令要少 ，应该就是这个问题。 比如while(1)和for(;;)都是死循环，但是for(;;)的汇编指令数量比whle(1)少，因此我们做死循环的时候，for(;;)要快一些。

user: user-2
content: 这个跟上面那两个比，哪个快一些？ #include <stdio.h>  int main() { 	int m, n; 	int num=0; 	int sum=0; 	int i; 	scanf("%d%d", &m, &n); 	getchar(); 	for (;m<=n;m++) 	{ 		for (i = 2; i*i <= m; i++) 		{ 			if (m%i == 0)goto _NEXT; 		} 		sum = sum + m; 		num++; 	_NEXT:; 	} 	printf("%d\t%d", num, sum);  	return 0; }

user: user-2
content: 靠，贴代码会死啊，可怜我用手机接电脑上网的。。。，打开图片超慢。。。

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

user: user-4
content: 算质数这么算也是醉了。

user: user-5
content: 但当M取负数的时候2比1快，因为循环的条件不一样。 其它情况也很简单。

user: user-5
content: 两段代码主要差异在内部的while循环 但最大执行次数 都是 M-a. 外层N-M次。

user: user-6
content: 提供你的编译器+编译参数，和实际测试数据。 没有具体数据就不要讨论效率问题。
user-0 提问: 字符串指针跟字符串指针赋值问题

回复:
user: user-1
content: 引用 3 楼 lovesmiles 的回复:……p全部是指向const char的指针，它所指的值是不能被改变的，当然会出问题了。 像楼上所说的将p必成指向数组空间才可以+1现在越来越喜欢用 "+1" 了

user: user-0
content: 引用 8 楼 starytx 的回复:[quote=引用 5 楼 happyming0809 的回复:] [quote=引用 3 楼 lovesmiles 的回复:] ……p全部是指向const char的指针，它所指的值是不能被改变的，当然会出问题了。 像楼上所说的将p必成指向数组空间才可以 言之有理哦。但是又想用指针。[/quote]问题根本在于p指向哪里。如果指向一个字符串常量（"xxxxxx"），那么如果通过strcpy等函数往其指向的空间写如数据是不可以的，除非指向的这个空间可写（比如指向一个数组，或者指向动态分配的空间等等都可以）[/quote] 解释的很透彻。学习了。C语言还有很多东西值得去思考。

user: user-2
content: 引用 5 楼 happyming0809 的回复:[quote=引用 3 楼 lovesmiles 的回复:] ……p全部是指向const char的指针，它所指的值是不能被改变的，当然会出问题了。 像楼上所说的将p必成指向数组空间才可以 言之有理哦。但是又想用指针。[/quote]问题根本在于p指向哪里。如果指向一个字符串常量（"xxxxxx"），那么如果通过strcpy等函数往其指向的空间写如数据是不可以的，除非指向的这个空间可写（比如指向一个数组，或者指向动态分配的空间等等都可以）

user: user-3
content: 引用 5 楼 happyming0809 的回复:[quote=引用 3 楼 lovesmiles 的回复:] ……p全部是指向const char的指针，它所指的值是不能被改变的，当然会出问题了。 像楼上所说的将p必成指向数组空间才可以 言之有理哦。但是又想用指针。[/quote]1、字符数组也可以当指针用。2、让p指向内存的堆（使用malloc分配）、3让p指向字符数组（栈）。。。

user: user-3
content: p指向的地址空间“dd”是只读的，所以不能向它指向的内存空间赋值

user: user-0
content: 引用 3 楼 lovesmiles 的回复:……p全部是指向const char的指针，它所指的值是不能被改变的，当然会出问题了。 像楼上所说的将p必成指向数组空间才可以 言之有理哦。但是又想用指针。

user: user-0
content: 引用 2 楼 shenimenyilian 的回复:#include <string.h>  int main(void) {      char p[5];    char *part;     part = "ming";       strcpy(p,part);       printf("%s\n",p);  system("pause");  return 0; }一定要改为数组才行吗？

user: user-4
content: ……p全部是指向const char的指针，它所指的值是不能被改变的，当然会出问题了。 像楼上所说的将p必成指向数组空间才可以

user: user-5
content: #pragma comment(linker,"/SECTION:.rdata,RW") //加这句可以让常量区可写，后果自负！

user: user-6
content: #include <string.h>  int main(void) {      char p[5];    char *part;     part = "ming";       strcpy(p,part);       printf("%s\n",p);  system("pause");  return 0; }

user: user-7
content: strcpy(p,part);    就可以了
user-0 提问: sm2,sm3的问题

回复:
user: user-1
content: 我觉得最好用十六进制吧，这样好区分

user: user-2
content: 你要用16进制数

user: user-3
content: 楼主给的数据用我这边的工具验签不通过

user: user-4
content: 引用 4 楼 Java_Devil 的回复:嗯 这个搞定了，自己写了个函数。  sm2你懂吗？不懂。。。

user: user-0
content: 引用 3 楼 zxhuser-4 的回复:有些字符本来就是打不出来的噻嗯 这个搞定了，自己写了个函数。  sm2你懂吗？

user: user-4
content: 有些字符本来就是打不出来的噻

user: user-0
content: 引用 1 楼 mio__jiang 的回复:楼主给的数据用我这边的工具验签不通过那你那里有sm2的代码或资料可以给我参考下吗？
user-0 提问: 请教关于数组中输入数据自动结束的问题！

回复:
user: user-1
content: 选个不可能的数据作为结束标志，比如需要的数据全是正数，那当输入负数的时候表示输入结束。

user: user-2
content: 我还是楼主，不能连续3次回复，好不方便，我想说二楼不对，c语言支持变长数组

user: user-0
content: 上面掉了输入语句  #include <stdio.h> #include <stdlib.h>  int *array;  int main(void) {     int n,i;     puts("please input the array number:");     scanf("%d",&n);     array=(int *)calloc(n,sizeof(int));      puts("please input the data:");     for(i=0;i<n;i++)     {         printf("%d: ",i+1);         scanf("%d",&array[i]);     }     puts("the data you input is:");     for(i=0;i<n;i++)         printf("%d: %d",i+1,array[i]);     return 0; }

user: user-0
content: 谢谢6楼，先看看行不行

user: user-0
content: 5楼的说法不对，  #include <stdio.h> #include <stdlib.h>  int *array;  int main(void) { int n,i; puts("please input the array number:"); scanf("%d",&n); array=(int *)calloc(n,sizeof(int)); puts("the data you input is:"); for(i=0;i<n;i++) printf("%d: %d",i+1,array[i]); return 0; }

user: user-3
content: 放堆里。malloc（） c++可用new。       vector。 string

user: user-4
content: 可以使用vector动态数组

user: user-5
content: 仅供参考 #include <stdio.h> #include <stdlib.h>  int getnum(int num[], int max) { 	int i; 	char str[100]; 	for (i=0;;i++) 	{ 		scanf("%s", str); 		num[i]=atoi(str); 		if (getchar() == '\n')break; 	} 	return i+1; }  void putnum(int num[], int len) { 	int i; 	printf("\n"); 	for (i = 0; i < len; i++) 	{ 		printf("\t%3d", num[i]); 	} }  int main() { 	int num[100]; 	int len; 	len=getnum(num, 100); 	putnum(num, len); 	getchar(); 	return 0; }

user: user-6
content: 基本数据类型数组是无法实现的，因为楼主的要求是不管输入多少数据。 要么使用容器或自己定义一个数据类型，实现内部动态内存管理， 无论如何，数组的长度在编译期间就应该确定，否则无法通过编译

user: user-7
content: 可能需要用到HASH表

user: user-5
content: 定义一个长一点的数组。。。

user: user-8
content: c里不支持可变长度的数组。尽快c99里定义了，但几乎没有编译器至此。 用c++的话，vector可以起到这个动态数组的作用
user-0 提问: windows下hbase客户端  Will not attempt to authenticate using SASL (unknown error)

回复:
user: user-1
content: 我是来挖坟的

user: user-2
content: 请问楼主这个问题解决了吗？我也遇到同样的问题。442074344这是我的qq，希望您联系我。

user: user-3
content: 引用 8 楼 Sherry10250 的回复:遇到了类似的问题！刚安装好hbase，按照zookeeper》Hadoop》hbase的顺序开启的，开启前两个软件时jps显示都运行正常，可是开启hbase时显示：slave2:regionserver running as process 3491.   slave1:regionserver running as process 3566.   查看日志显示：  不知道到底是什么问题啊！？而且网页60010也打不开，显示无法连接。 求解！求帮助，弄了好几天了也没有搜到解决办法...算是挖坟吗？ 不过呢，既然你配置了外部zookeeper就应该设置Hbase使用外部zookeeper来管理，因为hbase默认带了一个zookeeper。所以日志提示，让你先关闭独立的zookeeper在开启hbase。 4个月了。其实我喜欢瞎看看

user: user-4
content: 遇到了类似的问题！刚安装好hbase，按照zookeeper》Hadoop》hbase的顺序开启的，开启前两个软件时jps显示都运行正常，可是开启hbase时显示：slave2:regionserver running as process 3491.   slave1:regionserver running as process 3566.  查看日志显示：  不知道到底是什么问题啊！？而且网页60010也打不开，显示无法连接。 求解！求帮助，弄了好几天了也没有搜到解决办法...

user: user-5
content: 我本地就是服务器，对hbase还没什么概念，只是想先在自己机子上尝试一下，大师求教啊！

user: user-0
content: 引用 5 楼 user-5 的回复:啊，在Windows系统上有没有什么区别，我还是一直有这个报错 你的服务器也在windows上吗？  首先你要保证的你的服务器启动成功！    在就是在客户端    要在 hosts这个文件下加上服务器的 主机名与ip的映射关系。

user: user-5
content: 啊，在Windows系统上有没有什么区别，我还是一直有这个报错

user: user-0
content: 引用 3 楼 user-5 的回复:啊，怎么弄的，能说详细点吗，还有你是在什么系统上执行的！ 什么意思，。。HBase服务器在 Ubuntu上啊。用eclipse写的客户端。去建表，，等一些操作。

user: user-5
content: 啊，怎么弄的，能说详细点吗，还有你是在什么系统上执行的！

user: user-0
content: 没人回吗。要结贴了。回就给分！！

user: user-0
content: 问题已解决。  在winodws下的 C:\Windows\System32\drivers\etc\hosts文件中    添加服务器端host与ip的映射关系    如： 10.8.1.135 master
user-0 提问: 二分法查找的平均查找长度为log2(n+1)-1,请问这是怎么计算出来的呢？

回复:
user: user-1
content: 也许，ASL == 树深度的值。

user: user-1
content: 引用 7 楼 mortimer7866 的回复: 这是书本上的图，一共有11个结点，第一层结点需要比较1次，第二层需要比较两次，依次类推，那么总的比较次数是1+2*2+3*4+4*4=33，既然ASL是平均比较次数，那么用总次数除以总结点数就是ASL，答案33/11=3=log2(n+1)-1; 只是为什么会是这样呢，看不出来log2(n+1)-1的意义。似乎就只是个求高度的式子  感觉你已经自己说出了 log2(n+1)-1的意义。是我把你带沟里了...Sorry。当时我只想说明深度。

user: user-0
content: 这是书本上的图，一共有11个结点，第一层结点需要比较1次，第二层需要比较两次，依次类推，那么总的比较次数是1+2*2+3*4+4*4=33，既然ASL是平均比较次数，那么用总次数除以总结点数就是ASL，答案33/11=3=log2(n+1)-1; 只是为什么会是这样呢，看不出来log2(n+1)-1的意义。似乎就只是个求高度的式子

user: user-0
content: 感谢五楼，您说的意思我明白了，可是似乎并没有说为什么用高度减1就是ASL呢，刚才又看了一下，知道怎么算这个ASL了，

user: user-1
content: 引用 楼主 mortimer7866 的回复:书本上是这么写的，设内部结点的总数为n=2^n-1,则判定树是深度为h=log2(n+1)的满二叉树（深度为h不计内部结点）。树中第k层上的结点个数为2^(k-1),查找他们所需的比较次数是k.因此在等概率假设下，二分查找成功时的平均查找长度为：ASL约等于log2(n+1)-1  用图示举例法来说说，   说的啰嗦一些，先说二叉树，第一节点其实深度为零，然后往下每走一层则深度增加一。 每层都是2^n个点对吧，但别忘第一层是2^0。所以会有log(n+1)去算它的深度，而这样会多算出一层，比如图片里应该是4层呀，其实也对，只是和编号方式有关。标准编号方式第一层深度是零。

user: user-0
content: google了都没有

user: user-2
content: 百度。。。

user: user-0
content: 刚刚又翻了下严蔚敏的书，是log2(n+1)-1不会错，只是不知道怎么求得的，各路大神快过来帮帮忙吧！小弟感激不尽

user: user-2
content: 不是log2(n)吗？
user-0 提问: 如何快速查找头文件？

回复:
user: user-1
content: 直接man有的找不到的。

user: user-1
content: man 还是挺好用的。  可以看看man man  man 2 fcntl  man 3 fcntl  显示的都不一样。

user: user-2
content: find  好用

user: user-3
content: 直接find

user: user-4
content: 可以用ctags这个东西，在/usr/src下面不是有Linux的源文件么，你到源文件根目录使用ctags -R .  生成索引，以后就可以通过在根目录使用vim命令后，再使用:ta xxxxx 找到对应的关键字了。这个效果更好。

user: user-5
content: 当然是把库函数手册放在离开自己不超过一个手臂的距离！

user: user-6

user: user-7
content: find grep

user: user-8
content: find正解

user: user-9
content: F12...........

user: user-10
content: 根据函数名查找头文件名 。。。查函数库文档啊。。。

user: user-0
content: 头文件放在哪些目录我是知道的，我想知道的是如何根据函数名查找头文件名

user: user-11
content: find / -name "*.h"

user: user-12
content: 直接到include文件夹里查
user-0 提问: 求教VS 中C语言链接失败问题解决方案

回复:
user: user-1
content: 只是打错字而已。。。 # include<stdio.h> # define N 3 struct Student { 	char name[10]; 	int mathS; 	int ChiS; 	int EngS; 	float averS; } ; void inputS(struct Student stu[]); struct Student maxarr(struct Student stu[]); void printS(struct Student stu); int main() { 	struct Student stuArr[N]; 	inputS(stuArr); 	printS(maxarr(stuArr)); 	return 0; } void inputS(struct Student stu[]) { 	printf("input the name and the score:\n"); 	int i = 0; 	for (i = 0; i<N; i++) 	{ 		scanf("%s %d %d %d", stu[i].name, stu[i].ChiS, stu[i].EngS, stu[i].mathS); 		stu[i].averS = (stu[i].ChiS + stu[i].EngS + stu[i].mathS) / 3.0; 	} } struct Student maxarr(struct Student stu[]) { 	int i, m = 0; 	for (i = 0; i<N; i++) 	{ 		if (stu[i].averS>stu[m].averS) 			m = i; 	} 	return stu[m]; } void printS(struct Student stu) { 	printf("%s:%d %d %d %f\n", stu.name, stu.ChiS, stu.EngS, stu.mathS, stu.averS); }

user: user-2
content: 是不是要加上extern "C" 这个函数是不是C语言写的函数  extern "C" struct Student maxaver(struct Student stu[]);
user-0 提问: 这段代码是否有问题？出现非法访问提示

回复:
user: user-0
content: 引用 1 楼 Idle_ 的回复:理论上不能，实践中有可能 -- 主要看你的free是否会引起下层堆管理器释放内存页还给操作系统。 引用 2 楼 brookmill 的回复:这个和返回局部变量指针的性质差不多，属于错误代码，虽然有个别情况能运行正确。 while(current != NULL) { tmp = current->next; free(current); current = tmp; } 引用 4 楼 lixiaobing3000 的回复:对current执行free操作后，之前current指向的内存已经被收回，不能再访问，而current->next是属于这块内存的一部分，所以不能访问。 引用 7 楼 shenimenyilian 的回复:使用一个临时变量先保存current->next   然后再释放current 你这样的结果是未定义的 ok，问题已经解决，散分

user: user-1
content: 你都free掉了current指针，还去用current->next; 会报错的 应该像#2 说的那样，才是正确的

user: user-2
content: 使用一个临时变量先保存current->next   然后再释放current 你这样的结果是未定义的

user: user-3
content: 引用 3 楼 zxh707wk 的回复:[quote=引用 2 楼 brookmill 的回复:] 这个和返回局部变量指针的性质差不多，属于错误代码，虽然有个别情况能运行正确。 while(current != NULL) { tmp = current->next; free(current); current = tmp; }+1[/quote]

user: user-4
content: 不要期望这代码有确定结果。

user: user-5
content: 对current执行free操作后，之前current指向的内存已经被收回，不能再访问，而current->next是属于这块内存的一部分，所以不能访问。

user: user-6
content: 引用 2 楼 brookmill 的回复:这个和返回局部变量指针的性质差不多，属于错误代码，虽然有个别情况能运行正确。 while(current != NULL) { tmp = current->next; free(current); current = tmp; }+1

user: user-7
content: 这个和返回局部变量指针的性质差不多，属于错误代码，虽然有个别情况能运行正确。 while(current != NULL) { tmp = current->next; free(current); current = tmp; }

user: user-8
content: 理论上不能，实践中有可能 -- 主要看你的free是否会引起下层堆管理器释放内存页还给操作系统。
user-0 提问: C语言中scanf输入的问题

回复:
user: user-1
content: 这样？  #include <stdio.h> #include <stdlib.h> #include <string.h>  int main(void) { 	int n; 	scanf("%d", &n); 	int arr[256][256];  	for(int i=0; i<n; i++) { 		for(int j=0; j<n; j++) { 			scanf(" %c", &arr[i][j]); 		} 	}  	for(int i=0; i<n; i++) { 		for(int j=0; j<n; j++) { 			printf("%c", arr[i][j]); 		}  		printf("\n"); 	} 	system("pause");  	return 0; }

user: user-2
content: 永远不要scanf("%c",&ch);

user: user-3
content: 大神好多 学习学习

user: user-4
content: scanf之后用getchar接收'\n'

user: user-5
content: 上代码，vs中不能直接用scanf,要用 scanf_s,scanf()在读取时不检查边界，所以可能会造成内存泄露。所以vc++2005/2008中提供了scanf_s(),在最新的VS2013中也提供了scanf_s()。在调用时，必须提供一个数字以表明最多读取多少位字符。 若一定要使用scanf，在代码最前面接入#define _CRT_SECURE_NO_DEPRECATE

user: user-6
content: while（getchar（）！= '\n'）     continue；

user: user-0
content: 对了，数据之间还要有空格