Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 今年暑假不AC

回复:
user: user-1
content: my method: 0 put all element in result set 1 create a "conflict" table 2 stat which element has the most occurance in "conflict" table 3 remove the element in result set and in "conflict" table 4 repeat step 2-3 until "conflict" table becomes empty. 5 stat the number in result set

user: user-1
content: the algothrim is key factor

user: user-0
content: 引用 3 楼 user-1 的回复:my method: 0 put all element in result set 1 create a "conflict" table 2 stat which element has the most occurance in "conflict" table 3 remove the element in result set and in "conflict" table 4 repeat step 2-3 until "conflict" table becomes empty. 5 stat the number in result set好牛逼啊，可惜英语太渣看不太明白

user: user-0
content: 求大神解答！！
user-0 提问: C求多边形面积

回复:
user: user-1
content: 哦，你直接把a[]定义成float了，那不用再cast, 也可考虑用double, 如果考虑了凹多边形不能解决问题的话。

user: user-1
content: 第二个:   s=(fabs((a[2*i-2]-a[0])*(a[2*(i+1)-1]-a[1]))+fabs((a[2*(i+1)-2]-a[0])*(a[2*i-1]-a[1])))/2;  乘法可能溢出(加减也可能溢出)，可以先cast成float再运算。  inline float _a(int i){ return float(a[i]); }  ... s=(fabs((_a(2*i-2)-a[0])*(_a(2*(i+1)-1)-a[1]))+       fabs((_a(2*(i+1)-2)-a[0])*(_a(2*i-1)-a[1])))/2;

user: user-1
content: 要注意凹多变形的问题。   比如  ---------- |       / |      / |      \ |       \ |---------    你如果从坐上出发，用你的方法得到结果的必定会大得多。不知道题目有没有明确说明是凸多边形。

user: user-2
content: typdef long long int64; 所有中间过程全部用int64.  设这些点是(data[0].x, data[0].y) ... (data[n-1].x, data[n-1].y) 在最后一个点：(data[n].x, data[n].y) = (data[0].x, data[0].y)  然后计算 data[i].x data[i].y data[i+1].x data[i+1].y 的行列式求和得到S，其中i从0到n-1。  S取绝对值。  S为偶数时，答案是[S/2].0 S为奇数时，答案为[S/2].5
user-0 提问: Hanoi递归问题。

回复:
user: user-1
content: 这个肯定会超时的， 你什么编译器

user: user-2
content: “给定一个小点的输入，完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门！ 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出

user: user-0
content: 引用 1 楼 truelance 的回复:你不会单步跟一下么我单步调试的时候，系统就是来回递归。可是我不明白为什么既然来回递归，运行的时候还是会出现Press any key to continue     我用while（1）{;}这个死循环测试的时候    就不会出现上述那句话。

user: user-3
content: 每个递归函数都需要有一个判断结束的分支，比如你的if(number == 1)，就是说你输入一个数字，进入函数后会每次m-1,直到m==1的时候执行move(one,three)之后结束。如果你输入的数字小于1例如（0，-1，-2.。。。）则会出现段错误。

user: user-4
content: 你不会单步跟一下么
user-0 提问: 活到老学到老，我要开始学习C语言了

回复:
user: user-1
content: 以博客的形式写出来，效果会更好，对自己也是一个补充！

user: user-2
content: C不适合作为入门语言，也不适合处理日常事务，因为你需要考虑太多与业务逻辑不相关的机器逻辑。 建议你学Python。

user: user-3
content: 除非你想了解计算机本身，而不是编程，否则用C意义不大，有非常非常多的好的语言可以选择。 学习它们你不会错过任何编程思想的训练，也不必纠结于大量和编程本身无关的东西，更重要的是，它们确实可以让新手编写出有用的程序。这样的语言包括Python C# Ruby Go等等。

user: user-4
content: 先下载Win-TC，然后参考C:\Win-TC\tcstudy.chm  bc++3.1 帮助里面对每个函数都有一小段能拷贝出来运行看效果的例子程序。非常适合初学C语言。相比较而言VC带的帮助MSDN就没有。http://download.csdn.net/source/2805028

user: user-4
content: 计算机组成原理→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对应的汇编并单步执行观察相应内存和寄存器变化。）

user: user-0
content: 引用 8 楼 jiandingzhe 的回复:C不适合作为入门语言，也不适合处理日常事务，因为你需要考虑太多与业务逻辑不相关的机器逻辑。 建议你学Python。Python一点都不了解哇，先把我计划中的学完了再考虑Python吧，哈哈，谢了

user: user-0
content: 引用 7 楼 caozhy 的回复:除非你想了解计算机本身，而不是编程，否则用C意义不大，有非常非常多的好的语言可以选择。 学习它们你不会错过任何编程思想的训练，也不必纠结于大量和编程本身无关的东西，更重要的是，它们确实可以让新手编写出有用的程序。这样的语言包括Python C# Ruby Go等等。 谢谢了，不过我就是想从C入门的，其他的慢慢来嘛，哈哈~

user: user-0
content: 引用 6 楼 zhao4zhong1 的回复:先下载Win-TC，然后参考C:\Win-TC\tcstudy.chm  bc++3.1 帮助里面对每个函数都有一小段能拷贝出来运行看效果的例子程序。非常适合初学C语言。相比较而言VC带的帮助MSDN就没有。http://download.csdn.net/source/2805028多谢了，不过我还是按照我自己的思路来学习吧，因为我是要在linux下用的，哈哈~

user: user-0
content: 引用 3 楼 buyong 的回复:还是学个工作中用得上的比较靠谱。你们白盒测试有什么语言？或者开发个测试工具我是想转行了啊，开发测试工具也要学C啊，C是一切的基础。准备先把C学完了再考虑别的，哈哈

user: user-5
content: 还是学个工作中用得上的比较靠谱。你们白盒测试有什么语言？或者开发个测试工具

user: user-0
content: 引用 1 楼 user-6 的回复:楼主现在做什么工作啊  测试，当初毕业时被坑了啊，一不小心就进入了测试的行业、、

user: user-6
content: 楼主现在做什么工作啊
user-0 提问: 一个c的问题，请大家解答

回复:
user: user-1
content: 引用 10 楼 u013541454 的回复:如果我把static去掉了，能运行就是少了一个答案 我用的编译器是dev-c++ k[n]=i; //这条语句，要求n的值不能大于9，当n大于9，会越界，导致流程异常

user: user-2
content: 取有意义的变量名吧.  多半是因为越界访问.

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

user: user-0
content: 如果我把static去掉了，能运行就是少了一个答案 我用的编译器是dev-c++

user: user-4
content: 看来你没有理解static关键字的意义和作用。static用来声明静态变量，程序中k[10]数组是一个静态局部变量，他的生命周期包括整个程序运行期间，k[10]数组的初始化之在程序开始时执行一次。就是说你的k数组可以在多个函数中使用，并且只需要初始化一次。

user: user-5
content: 静态变量可以保持不变性，你可以认为相当于局部的全局变量。 就你这个程序，不用static也可以

user: user-6
content: 我用CFree测试，不用静态也可以

user: user-7
content: 你的课本太老啦

user: user-8
content: 不用非要static, 你看错了提示吧， 可能是别的地方有问题

user: user-9
content: 就这个程序, 删除static也没有问题

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

user: user-10
content: 可以为非static 不会越界？

user: user-3
content: 局部数组声明的前面加static将其从堆栈数据段挪到全局数据段，从而可以在退出函数上下文后该局部数组的内容保持可用。
user-0 提问: Codeblocks怎么像VC6.0一样建立按钮界面

回复:
user: user-0
content: 引用 3 楼 codewaggon 的回复:建工程的时候选择Win32 GUI Project 就可以了。 已解决，3Q

user: user-0
content: 引用 1 楼 jerry_dqh 的回复:那是使用mfc吧。 codeblocks使用wxWidget吧。 win32编程是MFC？？不是吧

user: user-1
content: 建工程的时候选择Win32 GUI Project 就可以了。

user: user-2
content: 试试QT

user: user-3
content: 那是使用mfc吧。 codeblocks使用wxWidget吧。
user-0 提问: 用宏判断数是不是2的n次幂

回复:
user: user-0
content: 引用 1 楼 IAccepted 的回复:给你找了下，我以前曾经用过一个宏，也是实现这个功能  #define s(x) (!((x-1) & x))  我用的这个宏只能找正数（不包括0），所以你的循环要从0开始谢谢 多了种思路

user: user-0
content: 引用 3 楼 CharlesSimonyi 的回复:按照你这个宏的算法，随便取一个数试试吧 比如6的二进制是00000110 按位取反后是   11111001 加1后          11111010 按位与上6得    00000010 判断结果为真 6这个数是2的n次幂 当然不对恩 谢谢明白了 我看了下算法 发现错了 最后只有一位是1 应该和原数比较才对

user: user-1
content: 按照你这个宏的算法，随便取一个数试试吧 比如6的二进制是00000110 按位取反后是   11111001 加1后          11111010 按位与上6得    00000010 判断结果为真 6这个数是2的n次幂 当然不对

user: user-2
content: 上个回答补充，s（x）返回1为2^n 返回0即不是

user: user-2
content: 给你找了下，我以前曾经用过一个宏，也是实现这个功能  #define s(x) (!((x-1) & x))  我用的这个宏只能找正数（不包括0），所以你的循环要从0开始

user: user-3
content: 引用 1 楼 IAccepted 的回复:给你找了下，我以前曾经用过一个宏，也是实现这个功能  #define s(x) (!((x-1) & x))  我用的这个宏只能找正数（不包括0），所以你的循环要从0开始 正解
user-0 提问: getchar（）输入汉字

回复:
user: user-1
content: 对电脑而言没有乱码，只有二进制字节；对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A

user: user-1
content: getc, getwc, getchar, getwchar Read a character from a stream (getc, getwc), or get a character from stdin (getchar, getwchar).  int getc( FILE *stream );  wint_t getwc( FILE *stream );  int getchar( void );  wint_t getwchar( void );  Routine Required Header Compatibility  getc <stdio.h> ANSI, Win 95, Win NT  getwc <stdio.h> or <wchar.h> ANSI, Win 95, Win NT  getchar <stdio.h> ANSI, Win 95, Win NT  getwchar <stdio.h> or <wchar.h> ANSI, Win 95, Win NT    For additional compatibility information, see Compatibility in the Introduction.  Libraries  LIBC.LIB Single thread static library, retail version  LIBCMT.LIB Multithread static library, retail version  MSVCRT.LIB Import library for MSVCRT.DLL, retail version    Return Value  Each of these functions returns the character read. To indicate an read error or end-of-file condition, getc and getchar return EOF, and getwc and getwchar return WEOF. For getc and getchar, use ferror or feof to check for an error or for end of file.  Parameter  stream  Input stream  Remarks  Each of these routines reads a single character from a file at the current position and increments the associated file pointer (if defined) to point to the next character. In the case of getc and getwc, the file is associated with stream (see Choosing Between Functions and Macros). Routine-specific remarks follow.  Routine Remarks  getc Same as fgetc, but implemented as a function and as a macro.  getwc Wide-character version of getc. Reads a multibyte character or a wide character according to whether stream is opened in text mode or binary mode.   getchar Same as _fgetchar, but implemented as a function and as a macro.  getwchar Wide-character version of getchar. Reads a multibyte character or a wide character according to whether stream is opened in text mode or binary mode.    Generic-Text Routine Mappings  TCHAR.H Routine  _UNICODE & _MBCS Not Defined _MBCS Defined _UNICODE Defined  _gettc getc getc getwc  _gettchar getchar getchar getwchar    Example  /* GETC.C: This program uses getchar to read a single line  * of input from stdin, places this input in buffer, then  * terminates the string before printing it to the screen.  */  #include <stdio.h>  void main( void ) {    char buffer[81];    int i, ch;     printf( "Enter a line: " );     /* Read in single line from "stdin": */    for( i = 0; (i < 80) &&  ((ch = getchar()) != EOF)                          && (ch != '\n'); i++ )       buffer[i] = (char)ch;     /* Terminate string with null character: */    buffer[i] = '\0';    printf( "%s\n", buffer ); }   Output  Enter a line: This is a test This is a test   Stream I/O Routines  See Also   fgetc, _getch, putc, ungetc

user: user-0
content: 还有汉字机内码是什么？谢谢各位

user: user-0
content: 引用 2 楼 buyong 的回复:getline什么意思？

user: user-0
content: 引用 1 楼 user-3 的回复: 汉字不是char吧可如果用getchar输入汉字也可以啊，占两个字节，这里怎么回事，求解答关于一些getchar输入汉字的知识

user: user-2
content: getline

user: user-3
content: 汉字不是char吧
user-0 提问: shell sed 参数问题

回复:
user: user-1
content: 试试循环调用此脚本时让row从大到小变化。

user: user-2
content: bash下是没有问题的 sed -i -e "$row"H  -e "$row"G dialogue.smail sed -i -e "${row}"H  -e "${row}"G dialogue.smail 都OK  可能是你的shell支持有差异。

user: user-3
content: $row ?
user-0 提问: 循环分支问题？

回复:
user: user-1
content: p_arr1<=arr1+2是一个逻辑表达式，其值为1或者0（真或者假），然后再取反（！），作为if分支的条件，如果p_arr1确实小于等于arr1+2，则不会执行打印语句，反之则会打印

user: user-2
content: 看到下划线的code我就感觉头晕。。。

user: user-3
content: if(!(p_arr1<=arr1+2)) 指针对比，先看内部括号，表示p_arr1指向的位置不超过arr1指向的位置2步(含2步)，再加个非，那就是p_arr1超过arr12步之外的位置了

user: user-4
content: p_arr1<=arr1+2 表示前面的循环arr1[]没有遍历完就找到了不一样的字符 !(p_arr1 <= arr1 + 2) 就是反过来， 说明arr1[]完整的匹配了

user: user-5
content: 如果 p_arr1<=arr1+2, 那么三个元素都是匹配的。
user-0 提问: 请问判超时是原因

回复:
user: user-1
content: ^_^，还真是我看错了。那这题也太弱了。连累我把用非波拿起方式产生的串的第n位（n<10^9)问题解决了，那可不是一个数量级的问题 :(

user: user-2
content: 引用 6 楼 ALNG 的回复:上面说重复循环是误解，不存在这样的规律，原题这个地方应该存在录入错误。  我大体搞定了。楼主低估了斐波那契数列的增长速度，它是指数增长的，需要大整数计算。好在因为增长快，10^9蹦蹦跳跳很快就到了。我的程序，在我的机上求一个10^9方位左右的n要5秒左右。花点内存存些中间结果，1000ms应该不难做到。 认真看题目，"如果把数列的前两项写在一行，后面每个数字都是前两个数字的和..",5,8,13在莱不是21，而是1+3=4，不是标准斐波那契...

user: user-1
content: 上面说重复循环是误解，不存在这样的规律，原题这个地方应该存在录入错误。  我大体搞定了。楼主低估了斐波那契数列的增长速度，它是指数增长的，需要大整数计算。好在因为增长快，10^9蹦蹦跳跳很快就到了。我的程序，在我的机上求一个10^9方位左右的n要5秒左右。花点内存存些中间结果，1000ms应该不难做到。

user: user-2
content: 题目描述斐波那契数列，又称黄金分割数列，指的是这样一个数列：0、1、1、2、3、5、8、13、21、…… 在数学上，斐波纳契数列以如下被以递归的方法定义：F0=0，F1=1，Fn=F(n-1)+F(n-2)（n>=2，n∈N*）。鹏鹏最近重新温习了一下斐波那契数列，然后他想到了一个问题，如果把数列的前两项写在一行，后面每个数字都是前两个数字的和，那么数列的第n个数字是几呢？例如，当前两项为0和1的时候，数列可以写成下面形式： 011235813471123581347112358…… 最后那串数列里的1123581347是重复循环的，那么不管多大的项次都能简单快速算出，所以重点不是暴力求解，而是找出循环规律...

user: user-1
content: 判超时就是因为超时了呗。  0<=a,b<10,0<n<10^9,  n最多可达999999999, 不找数论上的特别规律，n=999999999时1秒钟之内一题都未必做得出来，更不用说还有多组测试。  这是一道数学题，不太算编程题，设计到的编程或者算法上的技巧少之又少，大头在数学上。  如果能快速的判定对给定的a,b,第n位是该斐波那契数列的第i项的第j个数位，再根据通项公式求出这个第i项，找出它的第j位，这题就搞定了。

user: user-0
content: B无用啊，这个程序结果是超时，，，，2楼的是一般的斐波那契这个上10位后就要分成两个、   链接http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2764

user: user-3
content: 你也不看看b有多大，就直接这么干……这题算法显然不是这样的

user: user-4
content: #include<stdio.h>   int fib(int n) {   int f[n+1];   int i;     f[0] = 0;   f[1] = 1;     for (i = 2; i <= n; i++)   {       f[i] = f[i-1] + f[i-2];   }     return f[n]; }
user-0 提问: [求助贴] Main函数的疑问

回复:
user: user-1
content: 一个是控制台 一个是GUI应用

user: user-2
content: 引用 3 楼 buyong 的回复:[quote=引用 2 楼 zbplusplus 的回复:] WinMain是VC自定义的，标准的main被隐藏了 main本身只是编译器的规定，应用程序格式则是操作系统规定的。 应用程序总是包含一个入口点和相关的参数，以及环境变量。入口点仅仅表示程序代码总是从这个地址开始执行。 不同语言、编译器生成的可执行程序都遵循相同格式，但是有不同的表现形式。 只有main是最接近原始的（虽然如此也不是真正的最初的应用程序入口）。  误人子弟[/quote] Winmain绝对不是 VC定义的 =_=|| winmain是windows app的入点， main是win console. 两个木有包含关系

user: user-3
content: 引用 2 楼 zbplusplus 的回复:WinMain是VC自定义的，标准的main被隐藏了 main本身只是编译器的规定，应用程序格式则是操作系统规定的。 应用程序总是包含一个入口点和相关的参数，以及环境变量。入口点仅仅表示程序代码总是从这个地址开始执行。 不同语言、编译器生成的可执行程序都遵循相同格式，但是有不同的表现形式。 只有main是最接近原始的（虽然如此也不是真正的最初的应用程序入口）。  误人子弟

user: user-4
content: 1)Win32 Console Application —— main；Win32 Application —— WinMain 2)VS IDE中，在不明白的符号RunUserInterface上点鼠标右键，选转到定义。
user-0 提问: flex和bison想实现一个一元二次方程求根，语法分析报错求解

回复:
user: user-1
content: 语法不能把次序和次数都限死了。  equation: expression '=' '0'  expression: term | term '+' expression | term '-' expression // 好久不用bison了，不知道语法是写成左递归还是右递归好，也可能要这样 // expression : expression '+' term | expression '-' term  term : INTEGER |        INTEGER EKS |        INTEGER EKSSQR

user: user-2
content: LZ计科的啊。
user-0 提问: 打印数组碰到一个问题

回复:
user: user-1
content: 引用 3 楼 sinnay523 的回复:[quote=引用 1 楼 user-1 的回复:] 因为'\0'就是0   想明白了 脑子秀逗了[/quote]

user: user-0
content: 引用 1 楼 user-1 的回复:因为'\0'就是0   想明白了 脑子秀逗了

user: user-0
content: 引用 1 楼 user-1 的回复:因为'\0'就是0   那不是结束符的意思吗？ '\0' 和 0 的acsii码不一样呀

user: user-1
content: 因为'\0'就是0
user-0 提问: raw socket errno = 13

回复:
user: user-1
content: socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP))

user: user-0
content: 引用 1 楼 user-2 的回复:root用户执行程序的？ su root之后也不行，发送不出去，刚才的无权限问题已经解决了是自己的IP越界了，但是IP写正确之后，程序显示发送成功，接收不到，wireshark抓包也没有，不知道为什么 if(setsockopt(g_sctpRawSock, IPPROTO_IP, IP_HDRINCL, (char*)&flag, sizeof(flag)) == ETERROR)//设置socket属性，使得ip头可以自己封装    {          return ETERROR;    } 测试IP_HDRINCL = 3的话发送不出去，IP_HDRINCL=2（TTL）的话是可以的，但是并不是自己定义的IP头，

user: user-0
content: su root之后也不行，发送不出去，刚才的无权限问题已经解决了是自己的IP越界了，但是IP写正确之后，程序显示发送成功，接收不到，wireshark抓包也没有，不知道为什么 if(setsockopt(g_sctpRawSock, IPPROTO_IP, IP_HDRINCL, (char*)&flag, sizeof(flag)) == ETERROR)//设置socket属性，使得ip头可以自己封装    {          return ETERROR;    } 测试IP_HDRINCL = 3的话发送不出去，IP_HDRINCL=2（TTL）的话是可以的，但是并不是自己定义的IP头，

user: user-2
content: root用户执行程序的？
user-0 提问: 清理上网痕迹

回复:
user: user-1
content: 是一组批处理命令 attrib 更改权限 del 删除文件

user: user-2
content: 在cmd窗口中输入 help 或 help 要取得帮助的命令 或 要取得帮助的命令 /?

user: user-3
content: 貌似都是一些批处理命令 上网找一下批处理命令的解释 对应着应该能看懂吧 attrib命令 del命令等 手动删改文件的过程改用了批处理
user-0 提问: 有关一段代码的疑问（指针的）

回复:
user: user-1
content: 引用 8 楼 w82076322 的回复:[quote=引用 6 楼 starytx 的回复:] [quote=引用 5 楼 w82076322 的回复:] [quote=引用 1 楼 starytx 的回复:] p保存着地址，*p就是去这个地址上的内容(值)，很正常啊，有什么疑问呢？ p=&n  这是把n的地址给了p，那么对p取内容的时候就是读取n的数值 *p=&n 我理解的是对p读内容的时候读出来的应该是n的地址才对[/quote]指针类型前边加个*,表示对指针的“解引用”操作，意即取出该指针指向的地址的值[/quote]那这时候p本身就存有n的数值了，n的数值变化还会影响p么？p还能操作n么？[/quote]p本身保存着n这个变量的地址值，n数值的变化不会影响p的值(p本身是一个地址值)，通过*p = xxx;也就相当于n = xxx;修改了n的值

user: user-0
content: 引用 7 楼 truexf 的回复:int n = 2; int *p = &n; //初始化。对p进行定义并初始化为n的地址，相当于 int *p; p = &n;两条语句 *p = n; //赋值。修改p指向的地址的内容为n;  初始化、赋值，是不同的概念，虽然都是一个等号操作符。懂了！谢谢！

user: user-0
content: 引用 6 楼 starytx 的回复:[quote=引用 5 楼 w82076322 的回复:] [quote=引用 1 楼 starytx 的回复:] p保存着地址，*p就是去这个地址上的内容(值)，很正常啊，有什么疑问呢？ p=&n  这是把n的地址给了p，那么对p取内容的时候就是读取n的数值 *p=&n 我理解的是对p读内容的时候读出来的应该是n的地址才对[/quote]指针类型前边加个*,表示对指针的“解引用”操作，意即取出该指针指向的地址的值[/quote]那这时候p本身就存有n的数值了，n的数值变化还会影响p么？p还能操作n么？

user: user-2
content: int n = 2; int *p = &n; //初始化。对p进行定义并初始化为n的地址，相当于 int *p; p = &n;两条语句 *p = n; //赋值。修改p指向的地址的内容为n;  初始化、赋值，是不同的概念，虽然都是一个等号操作符。

user: user-1
content: 引用 5 楼 w82076322 的回复:[quote=引用 1 楼 starytx 的回复:] p保存着地址，*p就是去这个地址上的内容(值)，很正常啊，有什么疑问呢？ p=&n  这是把n的地址给了p，那么对p取内容的时候就是读取n的数值 *p=&n 我理解的是对p读内容的时候读出来的应该是n的地址才对[/quote]指针类型前边加个*,表示对指针的“解引用”操作，意即取出该指针指向的地址的值

user: user-0
content: 引用 1 楼 starytx 的回复:p保存着地址，*p就是去这个地址上的内容(值)，很正常啊，有什么疑问呢？ p=&n  这是把n的地址给了p，那么对p取内容的时候就是读取n的数值 *p=&n 我理解的是对p读内容的时候读出来的应该是n的地址才对

user: user-3
content: int n = 2; int *p = &n; //此时p就是n的地址，而*表示取地址对应的内容，就是2

user: user-4
content: 你可以这么理解。 int *p跟int i是一回事,那么 *p和i都一样是一个int类型。因为你打印i的打印数值，所以*p保存的也是数值！

user: user-5
content: 你想打印地址，就不要加*了，*是取值操作。

user: user-1
content: p保存着地址，*p就是去这个地址上的内容(值)，很正常啊，有什么疑问呢？
user-0 提问: 在C语言的环境下分别用多进程和多线程求素数

回复:
user: user-1
content: #include <stdio.h> #include <stdlib.h> #include <string.h> #ifdef WIN32     #include <windows.h>     #include <io.h> #else     #include <unistd.h>     #include <sys/time.h>     #include <pthread.h>     #define  CRITICAL_SECTION   pthread_mutex_t     #define  _vsnprintf         vsnprintf #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); } #else void Lock(CRITICAL_SECTION *l) {     pthread_mutex_lock(l); } void Unlock(CRITICAL_SECTION *l) {     pthread_mutex_unlock(l); } #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} int main(int argc,char * argv[]) {     int i; #ifdef WIN32     InitializeCriticalSection(&cs_log); #else     pthread_mutex_init(&cs_log,NULL); #endif     for (i=0;i<10000;i++) {         Log("This is a Log %04d from FILE:%s LINE:%d\n",i, __FILE__, __LINE__);     } #ifdef WIN32     DeleteCriticalSection(&cs_log); #else     pthread_mutex_destroy(&cs_log); #endif     return 0; } //1-78行添加到你带main的.c或.cpp的那个文件的最前面 //81-85行添加到你的main函数开头 //89-93行添加到你的main函数结束前 //在要写LOG的地方仿照第87行的写法写LOG到文件MyLog1.log中

user: user-2
content: 2楼说的很正确，就算写出来了，运行正常，结果也会非常接近，根本达不到你的目的。  进程线程效率问题体现在多任务通信的开销上，通信越频繁，效率差距越大。  而你的测试程序，是一个cpu消耗型任务，根本没牵扯到任务间通信，性能不会差太多。

user: user-3
content: 貌似你这个没有什么意义啊，算素数这个和进程线程也没关系，进程只是浪费点内存。切换浪费点点时间，和你的运算素数的数量级比，可以忽略。

user: user-4
content: C语言这个环境太大啊。要求的线程库，进程间通信的机制都是操作系统相关的。你说的求素数是怎么个求法，从2开始一直往上尽可能多地找素数吗？这些都要搞清楚。  如果是从2开始尽可能多地找素数，你可以先写一个单进程单线程的，看看应该怎么在进程/线程间分配计算任务。

user: user-5
content: 不知道楼主要 在 unix系统 还是 win系统的测试？

user: user-6
content: 为什么要为难自己

user: user-1
content: Finding prime numbers - Kenneth Haugland Different schemas for finding prime numbers explained with code http://www.codeproject.com/Article.aspx?tag=198374988322054872&
user-0 提问: Opencv进行图像匹配的问题

回复:
user: user-1
content: opencv自带例子？

user: user-2
content: opencv对算法好的封装，最好学习相关的算法理论，匹配有好多种的，基于质心的 模板的 直方图的 轮廓等等，每个算法都有依据的。

user: user-3
content: 先编译链接调试OpenCV自带的相关例子代码？
user-0 提问: 一事不明，关于main函数return 0

回复:
user: user-1
content: 引用 12 楼 pathletboy 的回复:这其实是一个宏定义值，只是人家一般未使用宏定义，直接数字了，定义在stdlib.h中 /*  * These values may be used as exit status codes.  */ #define	EXIT_SUCCESS	0 #define	EXIT_FAILURE	1 标准写法应该是 return EXIT_SUCCESS; 当然这需要include上stdlib.h 您说的才是重点，解决了我的问题。thanks

user: user-2
content: 人家喜欢返回0咋的了 人家有没有说不许你返回false 你完全可以返回任何你喜欢的数

user: user-3
content: 自己编写的程序 main()是主函数， 实际上这个main是要被系统函数调用的，main函数 的返回值 是 这个系统函数 查看 你写的这个程序 的退出 状态的。 你可以看看return（）和 _exit（）的区别 ， 你对这个问题的理解。

user: user-4
content: 这其实是一个宏定义值，只是人家一般未使用宏定义，直接数字了，定义在stdlib.h中 /*  * These values may be used as exit status codes.  */ #define	EXIT_SUCCESS	0 #define	EXIT_FAILURE	1 标准写法应该是 return EXIT_SUCCESS; 当然这需要include上stdlib.h

user: user-5
content: 。。。楼主你想太多了

user: user-6
content: 0 标识 false  非0 true 函数返回值要匹配函数的原型的！ main函数是程序的入口函数，返回会给系统的，0表示正常吧

user: user-7
content: 负数一般是false 其他是true

user: user-8
content: windows用0表示正常、成功，非0就表示相应的失败error

user: user-9
content: c语言没有布尔型这个概念，c语言的真和假用0和非0表示，0为假，非0为真。至于man函数返回0，是因为规定main函数为int型的，而int型的函数必须返回int型的数据，而返回0一般表示函数正常结束，返回其他值有其他含义。

user: user-10
content: 成功运行了的程序只有一种可能----返回0 失败的程序则各有各的失败----返回各种非0

user: user-11
content: 返回值类型是int，所以建议返回正确写return 0，而不是return true。 至于c语言中 1等于true，0等于false，你这个说法也是不正确的，true和false的值不是在任何地方都等于1和0的。   很多时候函数正常返回0，异常返回-1

user: user-12
content: 返回的其实是一个int值，参考下面的文章就会很清楚了： http://blog.csdn.net/fangfei_119/article/details/2256656 http://blog.csdn.net/piaojun_pj/article/details/5986516  引用 楼主 u013457767 的回复:c语言中 1等于true，0等于false，那么main函数中为嘛要返回0而不是1呢？ 这种规定有问题吗  #include "stdafx.h" int main( int argc, char *argv[] )  { 	return ( int )true; }

user: user-13
content: return ( int )true;   这返回的是int类型啊,没bool啥事吧。

user: user-14
content: 因为他是main 木有问题，不好理解的话，这就是规定

user: user-15
content: main的返回值不是bool，是int，一般int类型的返回值，返回0表示正常，其他值表示其他意义
user-0 提问: codeblocks单步调试求助

回复:
user: user-1
content: 走到这一步时，这一句还没有执行，而程序进程是被挂起的。所以你的输入没有立即显示到程序上。  再往下走一步再输入就行了

user: user-2
content: 不要使用 while (条件) 更不要使用 while (组合条件) 要使用 while (1) {  if (条件1) break;  //...  if (条件2) continue;  //...  if (条件3) return;  //... } 因为前两种写法在语言表达意思的层面上有二义性，只有第三种才忠实反映了程序流的实际情况。 典型如： 下面两段的语义都是当文件未结束时读字符 while (!feof(f)) {  a=fgetc(f);  //...  b=fgetc(f);//可能此时已经feof了！  //... } 而这样写就没有问题： while (1) {  a=fgetc(f);  if (feof(f)) break;  //...  b=fgetc(f);  if (feof(f)) break;  //... } 类似的例子还可以举很多。

user: user-0
content: 就是影响啊，万一输入错误怎么办

user: user-3
content: 不影响调试就OK了啊。  引用 楼主 u013545836 的回复:我写了一个简单的程序如下，用codeblocks进行单步调试，但走到while（（ch=getchar())!=EOF)这一步的时候，那个黑窗口一弹出就立马最小化，而且输入时完全没反应，点击下一步后再看黑窗口，上面就就显示了刚才输入的，这是怎么情况
user-0 提问: c main () ;获取函数值的问题？

回复:
user: user-1
content: 引用 3 楼 xihu1364 的回复:char ntop[NI_MAXHOST];  是临时变量，过了生命域，就还给系统了  2种解决办法  1.将char*以函数的参数传进去  2.别用临时变量，去堆上申请，用完就释放 还有static

user: user-2
content: char ntop[NI_MAXHOST];  是临时变量，过了生命域，就还给系统了  2种解决办法  1.将char*以函数的参数传进去  2.别用临时变量，去堆上申请，用完就释放

user: user-3
content: 引用 1 楼 vipcxj 的回复: const char * ntop = get_socket_address(socket, remote, flags); //socket，remote，flags是什么我也不知道，这个问你~ sprintf(buf,"%s",ntop); ... //此时ntop已经不需要了 xfree(ntop);  我觉得LZ你应该去多看看书，把基础搞好再说，你就初学水平，竟然还搞网络变成~ 纸上得来终觉浅，绝知此事要躬行。 个人觉得

user: user-4
content: const char * ntop = get_socket_address(socket, remote, flags); //socket，remote，flags是什么我也不知道，这个问你~ sprintf(buf,"%s",ntop); ... //此时ntop已经不需要了 xfree(ntop);  我觉得LZ你应该去多看看书，把基础搞好再说，你就初学水平，竟然还搞网络变成~

user: user-5
content: 拷贝值  struct ntop {   char v[NI_MAXHOST] };  static struct ntop get_socket_address(...)

user: user-0
content: 昨晚做了一晚自己搞定，多楼上几位朋友指点了，用main()调用函数就可以解决了。谢了
user-0 提问: 大家帮忙看下什么原因

回复:
user: user-1
content: 引用 5 楼 huang369509940 的回复:[quote=引用 4 楼 u013537217 的回复:] [quote=引用 1 楼 huang369509940 的回复:] 中文乱码。。。编码方式的问题吧 用的是VC么？ 使用WIN-TC编写的 [/quote] 可能是这个平台不支持中文 换个吧 用VC++或devc++[/quote] 没用过TC 你看看这个管用不 http://zhidao.baidu.com/link?url=ruso4UeqLymakIqcpeiYK_wk2cDeHfI4t-xmaHjOGAvO7qtXF9Rtu9ZtT0bFAl6hUUXve0YDUv8I9t80uvX4Kq

user: user-1
content: 引用 4 楼 u013537217 的回复:[quote=引用 1 楼 huang369509940 的回复:] 中文乱码。。。编码方式的问题吧 用的是VC么？ 使用WIN-TC编写的 [/quote] 可能是这个平台不支持中文 换个吧 用VC++或devc++

user: user-0
content: 引用 1 楼 huang369509940 的回复:中文乱码。。。编码方式的问题吧 用的是VC么？ 使用WIN-TC编写的

user: user-0
content: 使用WIN-TC编写的

user: user-2
content: 没见过，不科学

user: user-1
content: 中文乱码。。。编码方式的问题吧 用的是VC么？

user: user-3
content: wintc 工具里面 有一个 中文界面的 你找找

user: user-4
content: 引用 楼主 u013537217 的回复: 运行结果后  不显示汉字   不知道为啥??????  你得先setlocale，然后用wprintf输出。字符串字面量得用前缀L。

user: user-5
content: winTC不支持中文，建议使用vc或者vs
user-0 提问: 新人，望各位大大指教代码。

回复:
user: user-1
content: 单步调试 慢慢看就懂了

user: user-2
content: F10、F10、F10

user: user-3
content: 可以这样理解，当i=1的时候，进入第二层循环，j<=i则执行1次，输出1个*,然后出循环，输出一次换行（\n），再继续第一层循环i=2时，进入第二层循环，j<=i则输出2个*，然后出循环，输出一次换行（\n），依次类推，直到i=8的时候，进入第二层循环输出8个*,之后整个循环结束。于是打印成这个上下下大的图案 #include <stdio.h>  int main() {    int i,j;        for(i=1;i<=8;i++)//i可以控制*的行数      {          for(j=1;j<=i;j++)//j可以控制每行*的个数        {          printf("*");                      }             printf("\n");//i每循环一次输出一次换行，一共8行                 }          return 0; }

user: user-4
content: 说是一物即不中！

user: user-5
content: 引用 楼主 u011565490 的回复:#include <stdio.h>  int main() {    int i,j;        for(i=1;i<=8;i++)      {          for(j=1;j<=i;j++)        {          printf("*");                      }             printf("\n");                 }          return 0; }      * ** *** **** ***** ****** ******* ********   求详解，新人看不懂啊，喷子请点右（左）上角红叉  谢谢！  已经定义了整型变量i、j，下面执行第一个for语句： 首先执行的是i = 1，之后判断i是否小于等于8（即执行的是for中间的那个语句），因为i的确小于8，所以i<=8成立，于是开始执行for控制的语句，即第二个for语句； 第二个for语句，首先执行的是j = 1，之后判断j是否小于等于i，因为此时i = 1，j = 1，所以j<=i成立，于是开始执行下一个语句（即第二个for语句控制的那个printf语句），输出了一个*，之后j++，j就变成了2，而此时i的值仍是1，所以j<=i不成立，第二个for循环结束，继续执行下一个语句（因为下一个printf语句和第二个for语句都被第一个for语句所控制），即printf("\n")，进行了换行，然后返回执行第一个for语句的第三个，即i++，此时i = 2，再执行第一个for的第二个，即判断i是否小于等于8，是，于是执行第一个for控制的语句，即第二个for语句，还是先执行j = 1，然后判断j是否小于等于i，是则执行第二个for语句控制的语句，即printf（"*"），然后j++，j变成2，再判断j是否小于等于i，是，则再次执行printf（"*"），然后j++，j变成了3，判断j是否小于等于i，此时i仍是2，所以循环条件不在满足，第二个fou语句结束，继续执行下一个语句，即printf("\n")，进行了换行，再然后执行第一个for语句的第三个，即i++，此时i = 3，接着再执行第一个for的第二个，即判断i是否小于等于8.....如此反复循环执行直至执行完i++后i = 9，即i不再满足i<=8这个条件，循环就此结束最终输出了楼主下边输出的结果。

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

user: user-6
content: #include <stdio.h>  int main() {    int i,j;        for(i=1;i<=8;i++)//控制行数      {          for(j=1;j<=i;j++)//控制*号的个数        {          printf("*");//打印*                      }             printf("\n");//每循环一次换行                 }          return 0; }

user: user-7
content: 这是一个双重的嵌套循环。外层i从1到8(1,2,3,4,5,6,7,8)正好8次，这是八行的来历  内层循环打印每行的*字符。  如果把内层循环写成 for(j=1; i<=8;++)...这样会打印出一个方方正正的8x8的矩阵。但它采用了变上界i。i这个变量每次进入for-j循环时的值比前一次大1，从1开始，这样第一行i=1，打印的*的个数也是1，第二行i=2，打印*的个数也是2，以此类推，到第八行打印出了8个*。  for循环的语法你应该知道吧，由分号分隔成3部分，第一部分通常称为初始化块，一般用于初始化循环计数器，在进入循环体前执行。第二部分为条件判断块，仅当该逻辑表达式(或其它可以隐式地转化为boolean值的表达式。第三部分是更新块，它会在循环体的后面执行，设计的目的用于更新计数器。以上各块都可以为空，为空时相应的；分隔符还是要保留。  以for(int i=0; i<2; ++i) {     循环体 }  1. 初始化    int i=0; 2. 条件检查 如果 i<2，进入循环体3， 否则跳出循环去到5 3. 循环体 4. 更新计数器 ++i，跳转到2; 5. 循环后的第一个语句  开始，执行1， i为0； 2. i==0 <2 成立，进入3 3. 第一次执行循环体 4. 更新计数器 ++i, i变成了1，跳转到2 2. i为1， 小于2成立，进入3 3. 第二次执行循环体 4. 更新计数器 ++i, i变成了2，跳转到步骤2 2. i为2，小于2不亨利，跳转到5，循环结束。  可以看到初始化块执行了1次，循环体和更新块各执行了2次，结束循环的时候i为2，但因为我们声明i的方式，这个变量在循环外不可见了。

user: user-8
content: http://www.tutorialspoint.com/cprogramming/c_loops.htm
user-0 提问: 请问高手，谁用c语言和go语言做过比较？

回复:
user: user-1
content: IT界可以没有go语言，但绝不能没有c语言！

user: user-2
content: http://www.douban.com/note/240554759/

user: user-0
content: 引用 15 楼 ForestDB 的回复:[quote=引用 14 楼 king_2007 的回复:] [quote=引用 13 楼 ForestDB 的回复:] 中文和英语有区别吗？ 汇编和C有区别吗？ C和go有区别吗？你怎么不看我的引用就发言呢？[/quote] 那请看我7L的发言。 [/quote] 我看你还是完整的看完go再发言吧！

user: user-3
content: 引用 14 楼 king_2007 的回复:[quote=引用 13 楼 ForestDB 的回复:] 中文和英语有区别吗？ 汇编和C有区别吗？ C和go有区别吗？你怎么不看我的引用就发言呢？[/quote] 那请看我7L的发言。

user: user-0
content: 引用 13 楼 ForestDB 的回复:中文和英语有区别吗？ 汇编和C有区别吗？ C和go有区别吗？你怎么不看我的引用就发言呢？

user: user-3
content: 中文和英语有区别吗？ 汇编和C有区别吗？ C和go有区别吗？

user: user-0
content: 引用 10 楼 gavin_8724 的回复:两种应用于不同目标环境中的语言放在一起比较毫无意义！针对不用的应用环境具体分析吧！  什么是不同目标环境？？这两种语言有什么区别吗？

user: user-4
content: 两种应用于不同目标环境中的语言放在一起比较毫无意义！针对不用的应用环境具体分析吧！

user: user-5
content: c 和 go 的共同点 Thompson

user: user-0
content: 具体的比较，请问有谁做过？对比一下。

user: user-3
content: 个人还没有真正完整去看go 但是觉着Google是在做互联网环境中的C 就像面向机器的C一样  即 CPU -> C 互联网 -> go

user: user-6
content: 不同语言不同用途，就像有C\C++\Java。。。

user: user-7
content: 系统底层开发？ ==> c /C++

user: user-8
content: http://benchmarksgame.alioth.debian.org/u32/compare.php?lang=go

user: user-9
content: 引用 1 楼 ForestDB 的回复:简言之，目标不同，谈何比较？ 板凳已准备 准备看评论

user: user-0
content: 那目标不一样，你对c语言和go语言有什么体会？？随便谈谈。

user: user-3
content: 简言之，目标不同，谈何比较？
user-0 提问: c语言 malloc疑问

回复:
user: user-1
content: 我考研的考试题就有一个这样的，明显有溢出，但是可以输出的

user: user-2
content: 溢出了！不安全的，下次当你程序使用内存较多的时候就容易出问题了！

user: user-3
content: 引用 24 楼 lyramilk 的回复:malloc是每次分配的内存是一个小块，并不是真给的参数，而是更大一些的整块。你malloc(1)还是malloc(4)都是一样的。我没记错的话这个粒度好像是32个字节，你malloc32个字节以内都是一样的。你的分配没有任何问题。  在application verifier中配置好内存检查之后，系统会在malloc分配之后的精确位置上映射一页不可写的内存强制安置一个边界帮助你检查泄露。误导别人了 malloc 分配的内存块 只有参数指定的那么大一块可以保证安全的使用 malloc 分配比参数多的部分 你怎么知道能用 实现可能是实现 用来存储调试信息 内存保护之类的 别胡乱去改

user: user-4
content: 引用 24 楼 lyramilk 的回复:malloc是每次分配的内存是一个小块，并不是真给的参数，而是更大一些的整块。你malloc(1)还是malloc(4)都是一样的。我没记错的话这个粒度好像是32个字节，你malloc32个字节以内都是一样的。你的分配没有任何问题。  在application verifier中配置好内存检查之后，系统会在malloc分配之后的精确位置上映射一页不可写的内存强制安置一个边界帮助你检查泄露。 刚才试了一下，貌似应该是8个字节。 malloc(1) === malloc(8)

user: user-4
content: malloc是每次分配的内存是一个小块，并不是真给的参数，而是更大一些的整块。你malloc(1)还是malloc(4)都是一样的。我没记错的话这个粒度好像是32个字节，你malloc32个字节以内都是一样的。你的分配没有任何问题。  在application verifier中配置好内存检查之后，系统会在malloc分配之后的精确位置上映射一页不可写的内存强制安置一个边界帮助你检查泄露。

user: user-5
content: http://bbs.csdn.net/topics/390699362?page=1#post-396668053

user: user-6
content: 有溢出，推荐用strncpy，就像少用strcat，多用strncat，少用gets,多用fgets一样。

user: user-7
content: 举个例子，两个人坐一张桌子，因为某种原因对方小妹妹给你分了三八线，严正声明：超过三八线的是小狗！ 可是你趁他不注意的时候超过线了。。。她不知道吧。但是万一你动作过大或者某种未知原因，不幸被她发现了，那就。。。越界了必然造成溢出，只不过你的溢出是造成简单的数据覆盖，还是直接适用了未分配的内存。不崩不代表就没溢出。  再举个例子: struct Test {   char szData[4];   char cType; }  Test t; t.szData[4] = 'e';//单看这个数组的定义和适用你能说没溢出吗？确实越界溢出了 但是，这里结构体两个成员后面还有一个，由于结构体内存连续，t.szData[4]实际上已经是cType这个变量了

user: user-8
content: 已经溢出了  内存是“平坦”的，连续的，给了你两个字节的空间，但是这两个字节是和别的空间连在一起的。 请注意：strcpy是不会帮你做越界检查的，整个C都不会，那是你自己的责任。

user: user-9
content: 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

user: user-10
content: 溢出了，只是没有崩溃而已，楼上说得对！

user: user-11
content: 已经溢出 运气好而已

user: user-12
content: 肯定内存溢出了，这又是个蛋疼的问题，输出是有可能可以输出。如果name分配的内存(2个字节)后面刚好是编译器不允许你操作的内存，就会报段错误，如果允许你操作，你的操作就会覆盖你没有操作权限的内存，影响其它程序段的运行。

user: user-13
content: 运气好没挂掉，正好申请的2个字节内存后面没有被其它程序占用。

user: user-14
content: 能打印不等于没溢出，不能用偶然的正确去推导出必然的正确。 引用 楼主 biangren 的回复:比如下面一段代码: char *name=(char *)malloc(2*sizeof(char)); strcpy(name,"binjing"); printf("name=%s",name); 输出：name=binjing  有一点疑问 char *name=(char *)malloc(2*sizeof(char)); 这段执行的时候，分配了两个字节的内存空间，此时name为这段内存空间的首地址 strcpy(name,"binjing"); 这段执行的时候，把"binjing"复制给了这段内存空间，但是内存空间一开始只分配了2个字节，这样为什么不会导致”溢出“?

user: user-15
content: 谁说不安全的操作就一定会马上死的？

user: user-16
content: 未定义行为.

user: user-17
content: 同意楼上说的，其实这个程序已经溢出了

user: user-18
content: 运行的结果正确不能代表程序没有问题，这句话应该知道吧，你自己都知道内存溢出了，问题都知道了，解决它

user: user-9
content: 其实电脑开机后物理内存的每个字节都是可读写的，区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。
user-0 提问: 帮忙写个C程序

回复:
user: user-0
content: 引用 1 楼 ganpengjin1 的回复:程序意思明白，但是不知道有何用 没什么用，但是很想知道这样的程序怎么写。

user: user-1
content: 写一个数组存1～9,定义一个变量(i)用来存你获取的次数,每获取一次,i++  然后用9-i来替换你取出的值。

user: user-2
content: 程序意思明白，但是不知道有何用
user-0 提问: printf %lf %f修饰符问题

回复:
user: user-1
content: %lf据cpp这本书上说，在scanf里面是输入double，因为printf会把float转换成double,所以只有%f，没有%lf，想输入和输出long double,是%Lf

user: user-2
content: 引用 楼主 u013529726 的回复:不是 %lf %f都可以打印 double么？  但是在我这里 #include<stdio.h> int main() {     double i=0.5;     printf("%f %lf",i,i);     return 0; }  这个程序的输出是  0.500000 0.000000  为什么第二个%lf 不输出正确的值？  查到的资料 c99标准 %lf等价于%f。。。 c99标准（编译器设置为 -std=c99 )楼主的代码在我的编辑器dev c++ 5.5.3上是正常输出的

user: user-3
content: 貌似默认-std=gnu90，试试-std=gnu99或gnu11...

user: user-4
content: %f对应double，而%Lf对应long double。且有%lf等效于%f。  依据如下 C语言标准中有如下的信息： l      It has no effect on a following a, A, e, E, f, F, g, or G        conversion specifier . 在linux下man 3 printf可以得到如下的信息： L      A following a, A, e, E, f, F, g, or G conversion corresponds  to        a long double argument.  (C99 allows %LF, but SUSv2 does not.)

user: user-5
content: 不知道为什么，不选C90了，也是这个样子！

user: user-5
content: C90 不会改成 %hf--->flaot,%f -->double, %lf--> long double 了吧 code::block 12.11 输出如下选上 C90。  #include<stdio.h>  int main() {     float f=0.5;     double d =0.5 ;     long double ld=0.5;      printf("size of float,double,long double %d,%d,%d\n",sizeof(f),sizeof(d),sizeof(ld));     printf("f = %hf d = %f ld = %lf\n",f,d,ld); //选上 C90。 是这种格式；     //printf("f = %f d = %lf ld = %Lf\n",f,d,ld); 通常是这种格式；     return 0; } 结果： size of float,double,long double 4,8,12 f = 0.500000 d = 0.500000 ld = 0.500000

user: user-6
content: c99中应该是一样的，我在mingw gcc上执行的结果是一样的，不知道是否你编译器的问题。

user: user-7
content: 貌似没有%lf  http://www.cplusplus.com/reference/cstdio/printf/

user: user-7
content: %f ---- double %Lf ----- long double

user: user-7
content: 引用 楼主 u013529726 的回复:查到的资料 c99标准 %lf等价于%f。。。 c99标准（编译器设置为 -std=c99 )  什么资料?

user: user-0
content: 引用 3 楼 user-8 的回复:不要在只试了一个编译器后就急着求助。 ...可是我问的是为什么啊~ 应该是可以的 c99中 %lf应该等价于%f啊~  如果在设置中删掉这句【-std=c99】 输出就是0.500000 0.500000

user: user-8
content: 不要在只试了一个编译器后就急着求助。

user: user-0
content: 引用 1 楼 user-8 的回复:楼主试过几个编译器？ 用的codeblocks gcc

user: user-8
content: 楼主试过几个编译器？
user-0 提问: 有啥区别？

回复:
user: user-0
content: 引用 3 楼 KenZhang1031 的回复:linklist相当于listnode *；比如 listnode * head和linklist head是一样的。   是不是意味着我可以将上面的修改为如下：  typedef struct lnode {    char name[20];    char addr[20;    struct lnode *nest; }listnode;//*linklist;  listnode  * head = NULL, *r = NULL; listnode  *p_creat,*p_save;

user: user-1
content: 上述中的listnode与*linklist有哈区别的,分别具体指什么意思呢？ 简单的理解 listnode就是该结构体类型的变量 ，可以直接用；*linklist是该结构体类型的指针，必须指向有效地址空间才能正确使用 例如：linklist=&listnode .或者动态开辟一块内存，然后用该指针进行操作。

user: user-2
content: 没错，可以，少打了一个括号外，char addr[20];其它没问题。 引用 6 楼 learner520 的回复:[quote=引用 3 楼 KenZhang1031 的回复:] linklist相当于listnode *；比如 listnode * head和linklist head是一样的。   是不是意味着我可以将上面的修改为如下：  typedef struct lnode {    char name[20];    char addr[20;    struct lnode *nest; }listnode;//*linklist;  listnode  * head = NULL, *r = NULL; listnode  *p_creat,*p_save;[/quote]

user: user-3
content: 主要区别是 一条声明（定义）语句，可能会声明（定义）若干变量。 linklist 不需要每次都加个*号 ，定义的只能是指针。 listnode 可以定义节点或者，节点指针，定义指针每次都要加个*号，定义节点不需要。  listnode 定义指针，漏了* 就是错误，linklist没有这个问题。  其次，linklist 表示链表，意义明确。 listnode 只是链表一个节点的数据结构，同样意义明确。//就是说，名副其实  C中 struct lnode 是类型的完整名字，lnode 不是（只是类型名字的一部分）， 所以定义另一个名字listnode 替换 struct lnode ，表示节点的数据类型。  对于C++，这个listnode是多余的，lnode就可以了。  C的链表是非常简洁的，不过链表和节点的两个层次，纠缠到一起了  实际上应该这么定义  struct LinkList{ struct lnode *head; };  这样的链表，层次才清晰，不会和节点混淆。 不过，C追求简洁，高效，所以一般都不会这么干。

user: user-4
content: 改成这样,也许你就懂了.  struct lnode {    char name[20];    char addr[20;    struct lnode *nest; }; typedef struct lnode listnode; typedef struct lnode *linklist;

user: user-2
content: linklist相当于listnode *；比如 listnode * head和linklist head是一样的。

user: user-5
content: listnode类型是lnode类型，linklist类型是lnode*类型

user: user-6
content: listnode代表的结构体struct Inode的类型名，而linklist代表的是struct Inode *的类型名。 关于结构体指针类型的重定义，这是规定的。 下面代码完全等价 listnode *p; 和linklist p; 上述代码都是定义了一个struct Inode类型的结构体指针p.
user-0 提问: 程序运行后 进程负载过高

回复:
user: user-1
content: linux下还可以用top命令吧。

user: user-2
content: 线程内 死循环 不让出时间片会导致cpu占用过高，大量申请内存没有合理释放掉会导致占用内存过高

user: user-3
content: 引用 4 楼 boyhailong 的回复:[quote=引用 3 楼 zhuobattle 的回复:] CPU过高，下个相关工具，比如ProcessExplorer，可以查看到每个线程的cpu及相应堆栈，就能定位问题出在哪里。 内存过高，有可能是内存泄漏，也有可能是对象管理不当，这个可以用windbg结合相关命令查看。 百度搜索下windbg 内存泄漏，它其实是可以找出运行一段时间后，相关内存分配（可以查看分配最多）的对应代码。 linux下呢？[/quote] linux下要使用oprofile，不过要内核打开支持。

user: user-4
content: 用oprofile统计每个函数/每行代码的执行时间, 看是哪里的问题

user: user-0
content: 引用 3 楼 zhuobattle 的回复:CPU过高，下个相关工具，比如ProcessExplorer，可以查看到每个线程的cpu及相应堆栈，就能定位问题出在哪里。 内存过高，有可能是内存泄漏，也有可能是对象管理不当，这个可以用windbg结合相关命令查看。 百度搜索下windbg 内存泄漏，它其实是可以找出运行一段时间后，相关内存分配（可以查看分配最多）的对应代码。 linux下呢？

user: user-5
content: CPU过高，下个相关工具，比如ProcessExplorer，可以查看到每个线程的cpu及相应堆栈，就能定位问题出在哪里。 内存过高，有可能是内存泄漏，也有可能是对象管理不当，这个可以用windbg结合相关命令查看。 百度搜索下windbg 内存泄漏，它其实是可以找出运行一段时间后，相关内存分配（可以查看分配最多）的对应代码。

user: user-6
content: 内存使用过高  内存泄漏

user: user-6
content: cpu利用率过高  死循环
user-0 提问: 我写了一个求方差的C程序，但是在输完数据时，程序就出错退出，希望大家看一下哪里出错了！谢谢

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

user: user-2
content: 1.i一直没加，输入永远放在第一个数组，也就是i一直是0 2.所以导致j那个循环不会进去，直接发生除0异常，程序肯定crash了  可能隐患： 另外你这些除法要判断下是否可能发生除0的问题，比如 average = sum*1.0/(i-1);

user: user-3
content: http://sourceware.org/gdb/current/onlinedocs/gdb/

user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。 我是直接用Mingw来编译的，这个也可以么？

user: user-1
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。

user: user-0
content: 请问，出现这种情况是因为什么原因？

user: user-4
content: sum += number[i++];
user-0 提问: 最小公倍数

回复:
user: user-1
content: #include <stdio.h> int gcd(int v1,int v2) { 		while(v2) { 				int temp = v2; 				v2 = v1 % v2; 				v1 = temp; 		} 		return v1; } int main() {           int a,b,n;            n=gcd(a,b);           printf("%d\n",n); }

user: user-2
content: 最大公倍数就是两数相乘再除以最大公约数，比如12、8，最大公约数是4，那么他们最小公倍数就是28*8/4=24。  最大公约数用碾转相除法，大的数除以小的数，如果能整除，则为小的那个数，如果不能，则以小的那个数为大数，余数为小的数，继续作此运算。  最好用循环，递归效率低些。   //a>b int GetGCD(int a, int b) {     int remainder = a % b;     while(remainder > 0)     {         a = b;         b = remainder;         remainder = a % b;     }      return b; }

user: user-3
content: #include<stdio.h>  int lcm(int,int);  int main(){           int a,b,l;      printf("Enter any two positive integers ");     scanf("%d%d",&a,&b);       if(a>b)          l = lcm(a,b);     else          l = lcm(b,a);         printf("LCM of two integers is %d",l);      return 0; }  int lcm(int a,int b){        int temp = a;      while(1){          if(temp % b == 0 && temp % a == 0)              break;          temp++;     }     return temp; }

user: user-4
content: 比如x,y,z的最小公倍数，先求其中两个的最小公倍数，比如x,y最小公倍数得到是m,再求m,z的最小公倍数。n个数也是一样的道理。 引用 4 楼 u013337743 的回复:n个数怎么求

user: user-4
content: 比如x,y,z的最小公倍数，先求其中两个的最小公倍数，比如x,y最小公倍数得到是m,再求m,z的最小公倍数。n个数也是一样的道理。 引用 3 楼 truelance 的回复:已知m,n 1. 用辗转相除法求最大公约数 2. 最小公倍数 = m*n/最大公约数

user: user-5
content: 引用 4 楼 u013337743 的回复:n个数怎么求 比如求两个数的int foo(int x, int y) { .. } 那么如果你要求3个数就是 int foo3(int x, int y, int z) {     int t = foo(x, y);     return foo(t, z); } 如果求n个数(n >= 2) int foon(int x[], int n) {     int t = foo(x[0], x[1]);     for (int i = 2; i < n; i++)         t = foo(t, x[i]);     return t; }

user: user-0
content: n个数怎么求

user: user-5
content: 选择一个数，从1到另一个数穷举倍数，找到第一个可以整除另一个数的值，返回。代码如下： int foo(int x, int y) {     for (int i = 1; i < y; i++)         if (x * i % y == 0) return x * i;     return x * y; }

user: user-6
content: 已知m,n 1. 用辗转相除法求最大公约数 2. 最小公倍数 = m*n/最大公约数

user: user-4
content: 已知m,n均为正整数，试用C语言写出求m与n的最小公倍数的算法，算法的步骤为(该算法的好处是只需用一次乘法)： （1） 计算m*n的积，送临时变量r。 （2） 若m等于n，则输出最小公倍数r/m，算法结束。 （3） 若m大于n，计算m-n，结果送m，否则，计算n-m，结果送n。(即max = max - min) （4） 转到（2）或者（3）。  在已知最大公约数的前提下，另一个方法：最小公倍数=m*n/最大公约数
user-0 提问: 大一新生求助！！

回复:
user: user-1
content: 引用 4 楼 max_min_ 的回复:好好看看你手上的那本书呗，敲下例程！  嗯，好好看书，还要多加练习

user: user-2
content: 对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和 寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时 候。

user: user-3
content: 好好看看你手上的那本书呗，敲下例程！

user: user-4
content: 编程需要灵活的实践方法，多试试用不同的方法解决问题。

user: user-5
content: 多上论坛混混，也会有很大帮助

user: user-6
content: 学编程，多实践才是王道。多练习。多敲代码，切忌好高骛远。不要一开始就想着弄个图形界面的软件出来。先打磨语言功底。 基础的东西学完了，可以学习数据结构，慢慢的你的编码能力会再有提升。 有点数据结构和算法基础可以去做acm的题目。比如杭电OJ上的题目。

user: user-7
content: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  先下载Win-TC，然后参考C:\Win-TC\tcstudy.chm

user: user-0
content: 引用 5 楼 SKATE11 的回复:对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和 寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时 候。看不懂哈。。。。。
user-0 提问: 如何去掉全角的空格？

回复:
user: user-0
content: void Trim(char *s) { for(; *s; s++) if(*s == -95) break; *s = 0; }  我把-95改为全角空格，还是一样~他居然把我所有的字符都KO了~~

user: user-1
content: -95应该是全角空格的内码。 如果不是，你可以直接写'　'

user: user-0
content: 这个帖子我看过啦~-95是什么？？

user: user-1
content: http://bbs.csdn.net/topics/80149893

user: user-2
content: #pragma comment(lib,"gdi32") #include <windows.h> #include <stdio.h>  int main() {     const DWORD uWidth = 18 + 17 * 256, uHeight = 18 + 17 * 128;      PBITMAPINFO pbmi = (PBITMAPINFO) LocalAlloc (LPTR, sizeof (BITMAPINFOHEADER) + sizeof (RGBQUAD) * 2);     pbmi->bmiHeader.biSize = sizeof (BITMAPINFOHEADER);     pbmi->bmiHeader.biWidth = uWidth;     pbmi->bmiHeader.biHeight = uHeight;     pbmi->bmiHeader.biPlanes = 1;     pbmi->bmiHeader.biBitCount = 1;     pbmi->bmiHeader.biSizeImage = ((uWidth + 31) & ~31) / 8 * uHeight;     pbmi->bmiColors[0].rgbBlue = 0;     pbmi->bmiColors[0].rgbGreen = 0;     pbmi->bmiColors[0].rgbRed = 0;     pbmi->bmiColors[1].rgbBlue = 255;     pbmi->bmiColors[1].rgbGreen = 255;     pbmi->bmiColors[1].rgbRed = 255;      HDC hDC = CreateCompatibleDC (0);     void * pvBits;     HBITMAP hBitmap = CreateDIBSection (hDC, pbmi, 0, &pvBits, NULL, 0);     SelectObject (hDC, hBitmap);     HFONT hFont = CreateFont (16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "宋体"); //  HFONT hFont = CreateFont (16, 0, 0, 0, 0, 0, 0, 0, SHIFTJIS_CHARSET, 0, 0, 0, 0, "宋体");     SelectObject (hDC, hFont);     BitBlt (hDC, 0, 0, uWidth, uHeight, NULL, 0, 0, WHITENESS);      char c[4];     int i, j;     for (i = 128; i < 256; i++) {         sprintf (c, "%02X", i);         TextOut (hDC, 1, (i - 127) * 17 + 1, c, 2);     }     for (j = 0; j < 256; j++) {         sprintf (c, "%02X", j);         TextOut (hDC, (j + 1)* 17 + 1, 1, c, 2);     }     for (i = 128; i < 256; i++) {         for (j = 0; j < 256; j++) {             c[0] = (char) i;             c[1] = (char) j;             TextOut (hDC, (j + 1) * 17 + 1, (i - 127) * 17 + 1, c, 2);         }     }     for (i = 0; i < 130; i++) {         MoveToEx (hDC, 0, i * 17, NULL);         LineTo (hDC, uWidth, i * 17);     }     for (j = 0; j < 258; j++) {         MoveToEx (hDC, j * 17, 0, NULL);         LineTo (hDC, j * 17, uHeight);     }      BITMAPFILEHEADER bmfh;     bmfh.bfType = *(PWORD) "BM";     bmfh.bfReserved1 = 0;     bmfh.bfReserved2 = 0;     bmfh.bfOffBits = sizeof (BITMAPFILEHEADER) + sizeof (BITMAPINFOHEADER) + sizeof (RGBQUAD) * 2;     bmfh.bfSize = bmfh.bfOffBits + pbmi->bmiHeader.biSizeImage;      HANDLE hFile = CreateFile ("goal.bmp", GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0);     if (hFile != INVALID_HANDLE_VALUE) {         DWORD dwWritten;         WriteFile (hFile, &bmfh, sizeof (BITMAPFILEHEADER), &dwWritten, NULL);         WriteFile (hFile, pbmi, sizeof (BITMAPINFOHEADER) + sizeof (RGBQUAD) * 2, &dwWritten, NULL);         WriteFile (hFile, pvBits, pbmi->bmiHeader.biSizeImage, &dwWritten, NULL);          CloseHandle (hFile);     }      DeleteObject (hFont);     DeleteObject (hBitmap);     DeleteDC (hDC);     LocalFree (pbmi);      return 0; }  看一下上面代码生成的文件goal.bmp，里面显示为全角空格的GBK字符总共多少个！

user: user-3
content: 先确定你用的是什么编码，不同编码，值不一定都一样。
user-0 提问: 分布式服务器学习

回复:
user: user-0
content: 引用 5 楼 emailtome 的回复:分布式服务器编程（语言主要考虑C++,lua python  perl c js ...，平台考虑linux） 为毛排除C++，lua

user: user-1
content: 分布式服务器编程（语言主要考虑C++,lua python  perl c js ...，平台考虑linux）

user: user-2
content: Distributed Systems: Concepts and Design, 5th Edition

user: user-3
content: 眼见为实，耳听为虚。书的好坏在于是否适合自己，不是适合别人

user: user-2
content: http://www.google.co.uk/books?id=Kd5QAAAAMAAJ&hl=zh-CN&sitesec=reviews

user: user-0
content: 引用 1 楼 derekrose 的回复: Distributed Systems: Concepts and Design, 5th Edition 这本书您读过没，我看到豆瓣上评价不好。。。。
user-0 提问: C语言传字符数组，求解

回复:
user: user-1
content: 为什么不用参数传递整个互联网内容呢？ 矫枉必须过正！

user: user-2
content: 数组退化成指针了。

user: user-0
content: 为什么会退化成指针，C++ 也是这样的吗？

user: user-3
content: 引用 4 楼 u013470052 的回复:数组名作为函数形参的时候会退化为指针！就是这个原因。 void test(char array[])跟void test(char * array)是完全等价的 而任何指针都是一个十六进制的无符号长整型数，所以任何指针的长度都是4.所以你求得肯定是4. 你可以把char 换成其他类型，比如说int 或者double试试，肯定都是4.

user: user-3
content: 数组名作为函数形参的时候会退化为指针！就是这个原因。

user: user-4
content: 数组在作为函数参数的时候，和指针的效果是一样的！所以最好把长度也得传进来作为参数的！

user: user-5
content: 数组除了在初始化之外，不能整体操作，当然也不能整个复制到函数中 函数传递时，传递的是指向数组首元素的指针 顺便说一句，[]是指针的操作符，数组使用[]也是通过隐式转化为指针才能使用

user: user-0
content: 谢谢大家

user: user-6
content: 因为在test中，array看上去虽然是数组，其实就是指针
user-0 提问: 请教未来的学习指导

回复:
user: user-0
content: 引用 1 楼 zhuobattle 的回复: 引用 4 楼 max_min_ 的回复: 引用 2 楼 xihu1364 的回复: 引用 6 楼 zhao4zhong1 的回复: 谢谢

user: user-1
content: 作为学生  已经很厉害了

user: user-2
content: 1 如果条件好的话，建议考研吧 2 c/c++的成熟期本来就是比java要长很多，c++是最复杂的语言了，没有之一的 3 静下心，沉住气，打算学了，就好好学！   后期可以看看Effective c++ , more effective c++ ,深入探讨c++对象模型这些，深入学习下   C++的一些机制。后面再看看重构，代码大全这些！

user: user-0
content: 顶！！！

user: user-3
content: 考研吧...

user: user-4
content: 1.你情况适合考研，因为你出去工作可能竞争力不够 2.打好基础才是王道，做项目也是从基础开始的，做项目过程中要总结，不断提高 3.找家还算可以的公司实习下

user: user-5
content: 下载研究eMule源代码。
user-0 提问: 关于变长数组 c中为何不能定义成全局变量？

回复:
user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:个人意见： malloc realloc free 这才叫变长数组。 那个是动态数组。具体看这里http://baike.baidu.com/link?url=bRob39mFcApY27G3sPW-cB43LQ8YSQSRjzs67i6TACCR4RIOIwXb3sBcgRGi7Kx9sPGL7wX0T4hQIZEju9g4k_

user: user-1
content: 什么叫变长数组

user: user-2
content: const int maxn=10; int f[maxn];  这不是变长数组啊，在常量折叠的情况下，不就相当于  #define maxn 10 int f[maxn];

user: user-3
content: C99定义的这种变长数组的使用是有限制的，不能像在C++等语言中一样自由使用 变长数组有以下限制： 1、变长数组必须在程序块的范围内定义，不能在文件范围内定义变长数组； 2、变长数组不能用static或者extern修饰； 3、变长数组不能作为结构体或者联合的成员，只能以独立的数组形式存在； 4、变长数组的作用域为块的范围，对应地，变长数组的生存时间为当函数执行流退出变长数组所在块的时  你是放在文件块范围内定义了，放到函数内部定义就可以了。

user: user-4
content: 请问C语言为什么叫C语言？

user: user-5
content: 引用 5 楼 zhao4zhong1 的回复:个人意见： malloc realloc free 这才叫变长数组。 +1

user: user-6
content: 因为const的语义在C和C++里不完全一样

user: user-7
content: 第一个问题: c/c++中全局变量的存储空间是编译器分配的, 不是在运行期分配的, 大小必须在编译期能确定, 因此变长数组不能是全局变量. 2楼说的几种情况都同理.  第二个问题: const在c++里是常量, 在c里是只读变量. 因此这个定义在c++里是固定长度的全局数组变量, 是允许的; 在c里是变长数组, 是不允许的.

user: user-3
content: void test(n) {   int a[n]; } 他其实想说的是这类变长数组，提醒别用vs编译器去编译哦，

user: user-8
content: 个人意见： malloc realloc free 这才叫变长数组。
user-0 提问: c 打开一个地址获取数据

回复:
user: user-0
content: 能举个例子不

user: user-1
content: 不行！fopen需要本地的文件！需要建立连接的，具体的参考socket吧！

user: user-0
content: 各位能举个简单的例子吗

user: user-2
content: libcurl

user: user-3
content: windows平台可以看下Winhttp库，里面包含了get,post等等功能的函数

user: user-4
content: 建立短连接，直接发送http请求获取就行。看下socket通信资料。

user: user-0
content: 引用 1 楼 mujiok2003 的回复:使用http库  请问怎么用，我想打开一个地址，然后接收返回的数据。。。

user: user-5
content: 使用http库

user: user-6
content: wininet libcurl

user: user-7
content: 参考 MSDN98\SAMPLES\VC98\MFC\INTERNET\STOCKTICKER\STOCKQUOTES\*.* MSDN98\SAMPLES\VC98\MFC\INTERNET\TEAR\*.* ？

user: user-7
content: 参考 MSDN98\SAMPLES\VC98\MFC\INTERNET\STOCKTICKER\STOCKQUOTES\*.* MSDN98\SAMPLES\VC98\MFC\INTERNET\TEAR\*.*？ ？

user: user-0
content: 求举个简单的例子，我打开一个网址，接收返回的字符窜就好了
user-0 提问: MSP430F247串口发送问题，求高手帮忙看一下，谢谢，实在是弄不出来了~

回复:
user: user-1
content: while (!(IFG2&UCA0TXIFG)); UCA0TXBUF = 0xab;  改成  while (!(IFG2&UCA0TXIFG)) UCA0TXBUF = 0xab;  试试。

user: user-2
content: 我怀疑你的程序没有执行到while（1）一直发送的地方，那个循环是发送0xab的，是不是程序卡在哪里了？比如do...while循环那里。

user: user-3
content: 参考http://blog.csdn.net/lyj636588/article/details/9626517  引用 楼主 u013447015 的回复:我的程序是这样的： #include  void delay_us(int n) { for(int i=0; i<n; i++) for(int j=0; j<8; j++); } void UartInit() {  UCA0CTL1 |= UCSWRST; P3SEL |= 0x30; // P3.4,5 = USART0 TXD/RXD UCA0CTL1 |= UCSSEL1; //8Mhz, 115200 UCA0CTL0 = 0; // UCA0CTL0 &= ~UC7BIT; //no parity, 8-bit data, uart mode UCA0BR0 = 69;  UCA0BR1 = 0;  UCA0MCTL |= UCBRS2;  UCA0CTL1 &= ~UCSWRST;  IE2 |= UCA0RXIE; // Enable USCI_A0 RX interrupt }  int main( void ) { volatile unsigned int i; // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; //clock set BCSCTL1 &= ~XT2OFF; // XT2on BCSCTL2 |= SELM1 + SELS + DCOR; do { IFG1 &= ~OFIFG; // Clear OSCFault flag delay_us(50); }while((IFG1 & OFIFG));  // BCSCTL3 |= XT2S1;  //uart init UartInit(); //spi init // SpiInit(); _BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt  while(1) { while (!(IFG2&UCA0TXIFG)); UCA0TXBUF = 0xab; } }  #pragma vector=USCIAB0RX_VECTOR __interrupt void USCI0RX_ISR(void) { while (!(IFG2&UCA0TXIFG)); // USCI_A0 TX buffer ready? UCA0TXBUF = UCA0RXBUF; // TX -> RXed character }  实在是弄不明白为什么每次启动单片机就发送了个0xE0然后就没了，但是我的while里面是一直发送的啊，而中断程序里的发送是正常的，也就是当pc给单片机发送的时候单片机将收到的字节发送回来是可以的，怎么调都是这样的，求大神指点一二，谢谢了~

user: user-4
content: 发到 http://bbs.21ic.com/iclist-124-1.html 吧,那上面讨论这个的比较多。