Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 关于循环语句

回复:
user: user-1
content: //e是循环执行条件，满足继续执行，不满足结束循环。 do {   s; }while(e); //为了和while循环区别开来， // do 。。。while循环的 while语句， //直接写在大括号后面,是个好习惯。 //

user: user-2
content: 1.一般的情况是：在循环次数已经知道的情况下，都可用。而在循环次数未知，但结束循环的条件知道的情况下，一般用while。 2.如果想在判断条件之前，先执行一次，就可用do  while 3.至于花括号，如果你的语句不止一句，则需要花括号，否则不需要，很好判断的。

user: user-1
content: 挑选循环类型，可以通过以下方法：  1）执行前，要做一点初始化的，用 for  2）不做初始化，上来就判断是否可以执行的,用 while //先判断，后执行。  3）不做初始化，上来就执行一次，才开始判断是否可以继续执行的用 do{ s ;}while(e);////先执行，后判断，

user: user-1
content: 不知道，怎么用循环，一律带大括号即可。  //  e2 是循环执行条件，满足执行，不满足结束循环。 //  e1 在循环开始，执行一些代码。 //  e3;循环体，执行后；在执行一些代码，一般是自增，自减等等。  for(e1;e2;e3){    s; } //e是循环执行条件，满足执行，不满足结束循环。 while(e){   s; } //e是循环执行条件，满足继续执行，不满足结束循环。 do {   s; }while(e);

user: user-1
content: //1)用while 实现 for 的功能。    for(e1;e2;e3)s;    //while 实现 for 的功能     {        e1;//       while(e2){         s;         e3;       }    } //2)用while 实现 do ...while(); 的功能。      do s while(e);     //while 实现 do ...while(); 的功能     s;     while(e)s; 3)用 for 实现 do ...while(); 的功能。     do s while(e);     //for 实现 do ...while(); 的功能    s;    for(;e;)s;        4)用 for 实现 while(); 的功能。     while(e)s;     //for 实现 do ...while(); 的功能     for(;e;)s;   5) 用do ... while(); 实现 while(); 的功能。    while(e) s;    do ... while(); 实现 while(); 的功能。     {       bool started =false;       do {       if (!started){started =true;}       else s ;      }while(e);    } 6）用do ... while(); 实现for; 的功能。    for(e1,e2,e3) s;    do ... while(); 实现for; 的功能。          {       bool started =false;       e1;         do {       if (!started){started =true;}       else s ;       e3;       }while(e2);    }  PS： C,C++ 三种循环，几乎是一样的。 区别很小，都是当型循环。

user: user-3
content: 差别不大，并且可以互相转换，语句格式有所差别而已，正常使用下 for和while、do while(....){...}都是先判断条件是否成立而做块的操作 do { }while(...) 这种形式是先干一下，再由while决定是否继续干

user: user-4
content: 一般情况都是可以通用的！用那个主要是个人习惯而已， 可能有些特定的语境需要才有细微的区别！ 个人习惯：无限循环一般都是while，条件循环用for，do while很少用，除非特别需要，什么先运行再判断的

user: user-5
content: 花括号在C语言里是一个语句块的标示，就是说花括号括起来的语句是一个语句快，在循环里称之为循环体，就是每次循环都会执行的语句。

user: user-6
content: 条件具有不确定性，条件不成立不执行的用while,给出明确条件的用for,条件具有不确定性但必须执行的用do{}while,

user: user-7
content: 花括号对称就好

user: user-8
content: 等你用多了，你就知道用哪个了。循环都差不多的。多敲几遍代码，自然就明白了

user: user-9
content: 都是循环，想用那个就用那个。关于总是写错的问题， 1.你写的太少了 2.你编程习惯不怎么好，注意书写格式和排版问题就可以了

user: user-10
content: 我觉得do-while语句基本上可以不用，因为while语句完全可以取代 主要是用for和while 其次for也可以取代while for( ; ; ) {  } 其实就相当于 while(1) {     }  格式其实就是: 关键字 (条件) {   循环体 }  do-while特别一点 do {  } while (); //分号不能忘
user-0 提问: 动态分配内存这样做出问题了？想了很久，求解！

回复:
user: user-1
content: 引用 5 楼 CCZZGG1111 的回复:按你的讲的，改了是对的？但想不清楚哪里搞错了。这里是指针函数，返回值是个地址，p指向这个地址？怎么会编译出错？  函数返回的是一个指针的值，然后用一个同类型的指针变量去接收一下就好了。 就相当于一个赋值。所以int*那里是多余的。  类比一下普通的，比如下面：  int num = fun();  int fun(){ 	int temp = 10086; 	return temp; } 不可能写成int num = int fun();这个样子吧。。。

user: user-0
content: 按你的讲的，改了是对的？但想不清楚哪里搞错了。这里是指针函数，返回值是个地址，p指向这个地址？怎么会编译出错？

user: user-1
content: 此外，malloc后分配的空间，记得在程序最后要free掉~~~ 还有就是美观上再看看。

user: user-1
content: 你进行编译时，编译器肯定会提示你错误的位置吖~~ 这个地方p=int*pSt(&n)，int*是多余的。

user: user-2
content: p=int*pSt(&n);  这里写错了吧，你是想 (int*)pSt(&n);吧

user: user-3
content: 最好避免分配0个字节的内存，VS2008在调试版本下分配0个字节会成功，但在释放的时候会由于断点挂掉。
user-0 提问: 新人求助，关于 Tiny C Compiler如何配置

回复:
user: user-1
content: http://blog.csdn.net/shania_wang/article/details/5966492

user: user-2
content: 而且，TCC很小，你把他放到VC里编译吧，很容易的。

user: user-2
content: TCC的所谓效率，是指“编译效率”，编译速度快。并不是说，它编译生成的代码真比VC或者GCC快。

user: user-3
content: 其实，效率概念对于编译器来说，是个很不确定性的概念。比如说memcopy这样的函数，对于常量长度，它会给你转换成指令序列，对于变量会转换成循环。对于特别高性能英语，你会发现一段特别没意思的代码，那是为常量准备的。不管你是初学还是什么学，gcc足够你用了。

user: user-0
content: 我下载了winGL，但是……晕了

user: user-4
content: 参考：C:\Tiny C Compiler\Tiny C Compiler Reference Documentation.mht

user: user-5
content: 这个我也想研究下。
user-0 提问: typedef的用法

回复:
user: user-1

user: user-2
content: 引用 3 楼 liuhongwei110 的回复:[quote=引用 楼主 qdlgdx_lsy 的回复:] 下面的代码来自《unix环境高级编程》中一个关于“遍历文件层次结构，得到各种类型的文件数”的程序。下面是声明部分：  typedef int Myfunc(const char *, const struct stat *, int) static Myfunc myfunc; static int myftw(char *, Myfunc *); static int dopath(Myfunc *); 不知道typedef在这里是什么意思？并且有什么好处？  typedef int Myfunc(const char *, const struct stat *, int) 这里typedef的意思是申明一个Myfunc函数类型，它的返回类型为int ,参数有三个，第一个为const char*,第二个为const struct stat*,第三个为int.  谭浩强的C语言上关于typedef讲得很详细，建议去看看。  [/quote]  这里typedef的意思是申明一个Myfunc函数类型，它的返回类型为int ,参数有三个，第一个为const char*,第二个为const struct stat*,第三个为int.  ++

user: user-3
content: typedef主要就是把复杂的类型声明变成简单的名称，方便以后使用。还有一点就是可以方便修改，比如：typedef long long Long; Long A(Long){}如果我有很多地方使用了这个类型，但我突然发现我现在想改成unsigned long，那我只要修改typedef就可以了。 typedef int Myfunc(const char *, const struct stat *, int);//这里声明的是一个函数指针类型 static Myfunc myfunc;//用新定义的类型，声明一个变量 static int myftw(char *, Myfunc *);//用该类型的变量做参数 static int dopath(Myfunc *);看下这里一个简单的函数指针的例子

user: user-4
content: 接下来就可以用Myfunc去申明变量了，如下面的一句static  Myfunc myfunc;

user: user-4
content: 引用 楼主 qdlgdx_lsy 的回复:下面的代码来自《unix环境高级编程》中一个关于“遍历文件层次结构，得到各种类型的文件数”的程序。下面是声明部分：  typedef int Myfunc(const char *, const struct stat *, int) static Myfunc myfunc; static int myftw(char *, Myfunc *); static int dopath(Myfunc *); 不知道typedef在这里是什么意思？并且有什么好处？  typedef int Myfunc(const char *, const struct stat *, int) 这里typedef的意思是申明一个Myfunc函数类型，它的返回类型为int ,参数有三个，第一个为const char*,第二个为const struct stat*,第三个为int.  谭浩强的C语言上关于typedef讲得很详细，建议去看看。

user: user-5
content: 好处就是简洁，明了

user: user-6
content: 用途四：   为复杂的声明定义一个新的简单的别名。方法是：在原来的声明里逐步用别名替换一部  分复杂声明，如此循环，把带变量名的部分留到最后替换，得到的就是原声明的最简化  版。   http://www.cnblogs.com/csyisong/archive/2009/01/09/1372363.html  用在这里使得后来的开发者可以通过替换myfunc来改变这个函数的实现。自定义功能。
user-0 提问: 写一程序判断栈是否破坏

回复:
user: user-1
content: 引用 4 楼 worldy 的回复:栈破坏了，程序还能运行？还能有机会检查是否被破坏？ 栈可以自行设置，虽然我们一般都不设置。  你在调用某个函数前，把堆栈切换到一个专用堆栈； 可以用这个专用堆栈，检测栈破坏问题。  因为你可以通过捕获异常，检测堆栈破坏。  这是只是一种测试技巧，而不是通用技术。

user: user-2
content: 栈破坏了，程序还能运行？还能有机会检查是否被破坏？

user: user-3
content: 引用 2 楼 lm_whales 的回复:假设栈空间大小为 x个页面， 申请x+2个页面 并设置page 0,page x+1 的属性为警戒页面  如果有警戒异常发生，则为栈被破坏 你貌似解决了我无法检测的问题，我要去实践一下。

user: user-1
content: 假设栈空间大小为 x个页面， 申请x+2个页面 并设置page 0,page x+1 的属性为警戒页面  如果有警戒异常发生，则为栈被破坏

user: user-3
content: 栈被破坏的标准是什么呢？ 我谈谈自己的看法吧：假如入栈的顺序是a,b,c,d.则出栈的顺序应该有：d,c,b,a ; a,b,c,d; b,c,d,a; c,d,b,a;  现在你可以用一道程序判断，使得当前栈中的元素全部出栈，然后看看是否匹配预期的出栈方式中的一种，假如不匹配的话说明栈被破坏了。 还有一种破坏是栈使用的空间不合法，比如开辟包含了比本身所能容纳的更多元素，这中破坏我没办法检测。
user-0 提问: 关于for循环的一个很奇怪的问题，望大神解决~~

回复:
user: user-0
content: 引用 13 楼 Adol1111 的回复:[quote=引用 4 楼 u011248694 的回复:] [quote=引用 2 楼 user-6 的回复:] The c programming language里面有这样一段话：In C, all variables must be declared before they are used, usually at the beginning of the function before any executable statements.   变量的声明要在一个函数可执行语句的前面。或者是在语句块（被{}包括的一段代码）的最前面（同样也是在可执行语句的前面）。 但是我并没有在最前面也可以啊，就是在strcpy函数前面就可以了啊。[/quote] 变量声明、定义不是执行语句，函数调用，赋值操作（定义时赋值不算）、for、while等等都是执行语句。  只要执行语句一出现，后面就不能再定义和声明对象了。第一句执行语句之前的都算最前面...[/quote] 非常感谢，我现在懂了。

user: user-1
content: 引用 4 楼 u011248694 的回复:[quote=引用 2 楼 user-6 的回复:] The c programming language里面有这样一段话：In C, all variables must be declared before they are used, usually at the beginning of the function before any executable statements.   变量的声明要在一个函数可执行语句的前面。或者是在语句块（被{}包括的一段代码）的最前面（同样也是在可执行语句的前面）。 但是我并没有在最前面也可以啊，就是在strcpy函数前面就可以了啊。[/quote] 变量声明、定义不是执行语句，函数调用，赋值操作（定义时赋值不算）、for、while等等都是执行语句。  只要执行语句一出现，后面就不能再定义和声明对象了。第一句执行语句之前的都算最前面...

user: user-0
content: 引用 10 楼 baichi4141 的回复:[quote=引用 4 楼 u011248694 的回复:] [quote=引用 2 楼 user-6 的回复:] The c programming language里面有这样一段话：In C, all variables must be declared before they are used, usually at the beginning of the function before any executable statements.   变量的声明要在一个函数可执行语句的前面。或者是在语句块（被{}包括的一段代码）的最前面（同样也是在可执行语句的前面）。 但是我并没有在最前面也可以啊，就是在strcpy函数前面就可以了啊。[/quote] 如果你知道什么叫可执行语句[/quote] 好吧，我错了。

user: user-1
content: VS下.c文件默认调用的是C编译器，.cpp默认调用C++编译器  C89标准不支持任意位置定义变量，只能定义在函数的开头。C99可以定义在任意位置，不过目前只有CLang是默认C99的编译器，gcc要加-std=c99编译选项，比如gcc -std=c99 tset.c -o test，VS下还不支持C99标准。不过听说VS2013已经完全支持C99了，不过我没试过。

user: user-2
content: 引用 4 楼 u011248694 的回复:[quote=引用 2 楼 user-6 的回复:] The c programming language里面有这样一段话：In C, all variables must be declared before they are used, usually at the beginning of the function before any executable statements.   变量的声明要在一个函数可执行语句的前面。或者是在语句块（被{}包括的一段代码）的最前面（同样也是在可执行语句的前面）。 但是我并没有在最前面也可以啊，就是在strcpy函数前面就可以了啊。[/quote] 如果你知道什么叫可执行语句

user: user-3
content: 引用 8 楼 u012503290 的回复:在C89标准中，变量声明语句必须放在在执行语句前，否则会报错。  C99标准中以支持变量声明语句放在函数中任意位置(使用前)，但是VS/VC++6.0对C99并不是很兼容，so~

user: user-3
content: 在C89标准中，变量声明语句必须放在在执行语句前，否则会报错。

user: user-4
content: 引用 5 楼 u011248694 的回复:[quote=引用 3 楼 worldy 的回复:] 你用的c编译器，不是c++，c变量必须在可执行语句之前定义好 c/c++的编译器怎么区分的呢？[/quote] 保存为cpp吧

user: user-5
content: 引用 3 楼 worldy 的回复:你用的c编译器，不是c++，c变量必须在可执行语句之前定义好 ++ 应该是应该是是c文件文件引起的吧！c语言不支持在函数中间定义变量的！ 所以把文件改成cpp文件吧！

user: user-0
content: 引用 3 楼 worldy 的回复:你用的c编译器，不是c++，c变量必须在可执行语句之前定义好 c/c++的编译器怎么区分的呢？

user: user-0
content: 引用 2 楼 user-6 的回复:The c programming language里面有这样一段话：In C, all variables must be declared before they are used, usually at the beginning of the function before any executable statements.   变量的声明要在一个函数可执行语句的前面。或者是在语句块（被{}包括的一段代码）的最前面（同样也是在可执行语句的前面）。 但是我并没有在最前面也可以啊，就是在strcpy函数前面就可以了啊。

user: user-4
content: 你用的c编译器，不是c++，c变量必须在可执行语句之前定义好

user: user-6
content: The c programming language里面有这样一段话：In C, all variables must be declared before they are used, usually at the beginning of the function before any executable statements.   变量的声明要在一个函数可执行语句的前面。或者是在语句块（被{}包括的一段代码）的最前面（同样也是在可执行语句的前面）。

user: user-0
content: 环境是vs2010的。
user-0 提问: 请教：这个代码中有些地方看不明白

回复:
user: user-0
content: 引用 1 楼 user-1 的回复:搜赵老师名言：程序的功能不是看出来的.... 谢谢，我已看明白是怎么回事了。还是那句话，书读百遍，其义自现。

user: user-1
content: 搜赵老师名言：程序的功能不是看出来的....
user-0 提问: 遇到C语言编程中的一个问题。代码如下。

回复:
user: user-1
content: 引用 10 楼 gaohuaid 的回复:[quote=引用 4 楼 u012804737 的回复:] 首先我要感谢你们，其次，我是想知道，为什么char * ptr  ptr定义在常量区是什么意思？还有就是，内存地址也可以比较大小吗？内存地址是以二进制存储在内存中的，是不是二进制转换为10进制在比较？万分感谢！ 引用 3 楼 mars_tl 的回复:char *ptr = "how are you"; ptr定义在常量区，不可更改。用字符串数组 ， 1L正解。  这个并不是ptr不可更改，而是"how are you" 不可更改，因为它是字符串常量。也就是说当前ptr的值为字符串常量的首地址。 [/quote] 恩，是这个意思，我没有表达清楚。

user: user-2
content: 引用 4 楼 u012804737 的回复:首先我要感谢你们，其次，我是想知道，为什么char * ptr  ptr定义在常量区是什么意思？还有就是，内存地址也可以比较大小吗？内存地址是以二进制存储在内存中的，是不是二进制转换为10进制在比较？万分感谢！ 引用 3 楼 mars_tl 的回复:char *ptr = "how are you"; ptr定义在常量区，不可更改。用字符串数组 ， 1L正解。  这个并不是ptr不可更改，而是"how are you" 不可更改，因为它是字符串常量。也就是说当前ptr的值为字符串常量的首地址。

user: user-3
content: 引用 8 楼 u012804737 的回复:谢谢了，虽然我对那个只读（linux）数据段不是太明白，因为没接触过，不过到时候找点资料看看。谢谢大家。明天结贴。看来我的C语言之路还很漫长。顺便问一句，如果学习数据结构，看什么书比较好 看看内存管理这块吧！就是知道静态区的内容只是可读不可更改的！ 分很多找点资料看阿卡呢！至于书嘛，看看这个链接 http://bbs.csdn.net/topics/390638386

user: user-0
content: 谢谢了，虽然我对那个只读（linux）数据段不是太明白，因为没接触过，不过到时候找点资料看看。谢谢大家。明天结贴。看来我的C语言之路还很漫长。顺便问一句，如果学习数据结构，看什么书比较好

user: user-4
content: 首先字符串常量在只读（linux）数据段，所以不可修改。 其次是，while中的判断是比较的地址值，由于字符串的首地址小于指向字符串末尾的地址，所以比较是有效的。

user: user-5
content: [quote=引用 1 楼 lg1544650023 的回复:] 首先你的程序编译出错是应为你没有在调用函数之前声明函数 然后你不能用char *ptr定义字符串，应该用数组 代码修改如下: [code=c]#include <stdio.h> int main() { 	void reverse_string(char *string)

user: user-5
content: 引用 1 楼 lg1544650023 的回复:首先你的程序编译出错是应为你没有在调用函数之前声明函数 然后你不能用char *ptr定义字符串，应该用数组 代码修改如下: #include <stdio.h> int main() { 	void reverse_string(char *string); 	char ptr[500] = "how are you"; 	reverse_string(ptr); 	printf("%s\n", ptr); } void reverse_string(char *string) { 	char * last_string; 	for (last_string = string; *last_string != '\0'; last_string++) 		; 	last_string--; 	while (string < last_string) 	{ 		char temp; 		temp = *string; 		*string++ = *last_string; 		*last_string-- = temp; 	} }  说明： while(string < last_string)是比较的地址大小 在for循环结束时last_string指向字符串的最后一个字符，也就是'\0' 所以后面要执行last_string--， 让last_string指向字符串的倒数第二个字符，也就是我们可见的最后一个字符，然而string仍然是指向字符串的第一个字符的。 while(string < last_string)表示当string还在last_string前面的时候执行循环 循环体的内容是就是交换字符串前后的内容实现倒转 注意每次交换要移动指针，代码中的string++,和last_string--的作用就在此+1

user: user-0
content: 首先我要感谢你们，其次，我是想知道，为什么char * ptr  ptr定义在常量区是什么意思？还有就是，内存地址也可以比较大小吗？内存地址是以二进制存储在内存中的，是不是二进制转换为10进制在比较？万分感谢！

user: user-1
content: char *ptr = "how are you"; ptr定义在常量区，不可更改。用字符串数组 ， 1L正解。

user: user-2
content: while语句中比较的就是地址的大小。。

user: user-6
content: 首先你的程序编译出错是应为你没有在调用函数之前声明函数 然后你不能用char *ptr定义字符串，应该用数组 代码修改如下: #include <stdio.h> int main() { 	void reverse_string(char *string); 	char ptr[500] = "how are you"; 	reverse_string(ptr); 	printf("%s\n", ptr); } void reverse_string(char *string) { 	char * last_string; 	for (last_string = string; *last_string != '\0'; last_string++) 		; 	last_string--; 	while (string < last_string) 	{ 		char temp; 		temp = *string; 		*string++ = *last_string; 		*last_string-- = temp; 	} }  说明： while(string < last_string)是比较的地址大小 在for循环结束时last_string指向字符串的最后一个字符，也就是'\0' 所以后面要执行last_string--， 让last_string指向字符串的倒数第二个字符，也就是我们可见的最后一个字符，然而string仍然是指向字符串的第一个字符的。 while(string < last_string)表示当string还在last_string前面的时候执行循环 循环体的内容是就是交换字符串前后的内容实现倒转 注意每次交换要移动指针，代码中的string++,和last_string--的作用就在此
user-0 提问: [咨询]关于不同类型之间使用memcpy

回复:
user: user-0
content: 引用 3 楼 akirya 的回复:[quote=引用 2 楼 u010102271 的回复:] [quote=引用 楼主 u010102271 的回复:] 比如我想将char*拷贝到unsigned long  unsigned long ulVar = 0;      memcpy((char*)(&ulVar),"00000001",8);  实际打印的值是：3544385890265608240  ps：按照我之前的理解，还以为是按位copy了，那么得到的值就是1了  重新算了下： ‘0’为00110000 ‘1’为00110001 “00000001”就应该为:0011000000110000001100000011000000110000001100000011000000110001 计算的结果为：3472328296227680305（10进制）[/quote] 你忽略了大小端问题[/quote] 受教，确实是这样的

user: user-1
content: 引用 2 楼 u010102271 的回复:[quote=引用 楼主 u010102271 的回复:] 比如我想将char*拷贝到unsigned long  unsigned long ulVar = 0;      memcpy((char*)(&ulVar),"00000001",8);  实际打印的值是：3544385890265608240  ps：按照我之前的理解，还以为是按位copy了，那么得到的值就是1了  重新算了下： ‘0’为00110000 ‘1’为00110001 “00000001”就应该为:0011000000110000001100000011000000110000001100000011000000110001 计算的结果为：3472328296227680305（10进制）[/quote] 你忽略了大小端问题

user: user-0
content: 引用 楼主 u010102271 的回复:比如我想将char*拷贝到unsigned long  unsigned long ulVar = 0;      memcpy((char*)(&ulVar),"00000001",8);  实际打印的值是：3544385890265608240  ps：按照我之前的理解，还以为是按位copy了，那么得到的值就是1了  重新算了下： ‘0’为00110000 ‘1’为00110001 “00000001”就应该为:0011000000110000001100000011000000110000001100000011000000110001 计算的结果为：3472328296227680305（10进制）

user: user-1
content: 的确是按位拷贝 3544385890265608240对应的16进制值是 3130303030303030 '0'对应的ascii字符是0x30
user-0 提问: SIGSEGV

回复:
user: user-1
content: 你的字符串是常量，无法使用 *(str-sublen*sizeof(char *))=*str;

user: user-0
content: 源代码 #include "62.h" int del_substr(char *str,char const *substr) { 	int flag=0; 	int sublen=0; 	char *start2=str; 	char const *start=substr; 	while(*substr++!='\0') 		sublen++; 	char const*end=(substr-1); 	substr=start; 	while (*str!='\0') 	{ 		if(*substr!=*end&&*str==*substr) 		{ 			substr++; 			flag++; 		} 		else if(*substr==*end) 		{ 			char const *end2=str; 			break; 		} 		else 		{ 			substr=start; 			flag=0;  		} 		str++; 	} 	if(sublen==flag) 	{ 		prstr(str,sublen,start2); 		return 1; 	} 	else 		return 0; } void prstr(char *str,int sublen,char *start2) { 	*(str-sublen*sizeof(char *))=*str; 	puts(start2); } #include <stdio.h> int main(void) { 	char *str="ABCDEFG"; 	char const *substr="CDE"; 	printf("%d\n",del_substr(str,substr)); 	return 0; }

user: user-0
content: 引用 2 楼 skysoshy 的回复:*(str-sublen) = *str 这句： str地址是0x400781 sublen=3 *str的值是'F’. 所以上述语句试图给 (0x400781 - 3)的地址设置为'F'。  这么说应该明白了吧？ 明白了点，但我应该怎么做呢？

user: user-2
content: *(str-sublen) = *str 这句： str地址是0x400781 sublen=3 *str的值是'F’. 所以上述语句试图给 (0x400781 - 3)的地址设置为'F'。  这么说应该明白了吧？

user: user-3
content: SIGSEGV ,这里可能是操作了无效的指针吧！ 源码贴出看看字符串“ABCDEFG" 是如何定义的呢？ 是不是修改了可读区间？或者访问越界？
user-0 提问: 简单问题：如何使用c语言中的变长数组

回复:
user: user-1
content: 变长数组只是声明时可以用变量指定大小，一旦指定，就不能变了，否则就是动态数组了。

user: user-2
content: 如果输入前已知数量，malloc申请该数量长度的内存存放输入数值 如果输入前不知数量，malloc申请一定长度的内存存放输入数值，超了就申请一段更长长度的内存，再把已经存放的那些数值复制过去  数组的长度必须在源代码编译成可执行程序时已确定。 C语言中哪来的vector？

user: user-3
content: 这个确实不能用数组来实现，因为数组的大小是固定的 所以要么用数据结构动态分配内存，要么用一个很大的数组

user: user-4
content: 使用链表， 或者树等等动态数据结构来存放。 数组是在编译时已经固定了大小， 为了足够用要定一很大的数组。当输入的数量少的时候，浪费内存， 输入多的时候， 又会越界破坏其他数据。

user: user-5
content: 引用 8 楼 u012857025 的回复:[quote=引用 7 楼 angel_su 的回复:] 不行吧，除非你要求用户第一次输入是代表有几个数据，而不是以最后输入0来判断...  我看书上的例题貌似是这样的 所以我来问一问。。[/quote]  malloc是可以输入指定长度大小的数组！但是想要同时把数据存在数组里面就不适合用数组了！ 因为你是要在知道总数之后才能知道数组大小，这个时候动态分配了数组长度，但是想要同时存储数据的话，就比较困难了！ 所以建议你用vector向量，你不知道，我和你提了，你也应该区查一下资料吧！艾，学习的积极性真心不高。。

user: user-0
content: 引用 7 楼 angel_su 的回复:不行吧，除非你要求用户第一次输入是代表有几个数据，而不是以最后输入0来判断...  我看书上的例题貌似是这样的 所以我来问一问。。

user: user-6
content: 不行吧，除非你要求用户第一次输入是代表有几个数据，而不是以最后输入0来判断...

user: user-7
content: malloc...

user: user-0
content: 我想把10000换成n怎么做？

user: user-0
content: 引用 1 楼 max_min_ 的回复:用vector吧！输入一个丢进来一个，判断0结束！  vector是？  我知道可以定义一个数组长度很大的数组，譬如a[10000] 然后写一个丢一个进去，但是我想知道可不可以用变长数组？

user: user-0
content: 引用 2 楼 szllong123 的回复:很显然直接写死一个常量在里边是不行的。所以就用动态数组吧。  我想的是括号里面能不能用到变量？譬如说int n 然后在用n++循环录入新的数。

user: user-8
content: 很显然直接写死一个常量在里边是不行的。所以就用动态数组吧。

user: user-5
content: 用vector吧！输入一个丢进来一个，判断0结束！
user-0 提问: vs和constexpr

回复:
user: user-1
content: 引用 4 楼 lg1544650023 的回复:vs2012确实是把constexpr拒绝了，但是为什么2013又能够识别但是不能实现功能 正在开发中吧。

user: user-0
content: vs2012确实是把constexpr拒绝了，但是为什么2013又能够识别但是不能实现功能

user: user-2
content: 引用 1 楼 user-3 的回复:很少用这么偏僻的关键字的了，而且通常情况下 const已经能满足需求了！ vs之前是不支持此关键字的！ C++11还没普及开来，普及开来的话constexpr就不会是偏门的关键字了。

user: user-2
content: 2013不支持. http://msdn.microsoft.com/en-us/library/vstudio/hh567368.aspx

user: user-3
content: 很少用这么偏僻的关键字的了，而且通常情况下 const已经能满足需求了！ vs之前是不支持此关键字的！
user-0 提问: 都是常量指针

回复:
user: user-1
content: 你的Stu_pst应该是下面这样的吧？  typedef type *Stu_pst;  然后Stu_pst就是(type *)，即编译器将Stu_pst解释为(type *)这个整体。  那么const (type *) stu3; he (type *) const stu4;中const修饰的是（type *）这个整体。  也即是说这两个表达式是一样的咯，stu3和stu4都是指向type类型的const指针。

user: user-2
content: Stu_ps是怎么定义的？  你说的是指针常量和常量指针么？
user-0 提问: 分享我写的2D格斗游戏，C语言实现

回复:
user: user-1
content: 大三学生能把握上万行代码的开发，已经非常棒了。你在小学或者初中高中是不是有了基础？参加过ACM或者数学建模竞赛不？ 如果真正爱编程，就要找一个可以自己把握需求，并可以充分发挥想象力的行业作为自己的人生规划。 一，避免选择做直接与不懂计算机的最终用户打交道的项目。在甲方不懂计算机，乙方又执着于技术的情况下，会因为理解不同，产生误会。在被迫屈从甲方时，原本享受开发的你会暴跳如雷，从而渐渐失去兴趣。二，选择一门学科做主业，并充分发挥编程能力，如虎添翼。建议选择一门学科，比如信号处理，通信，图像处理，人工智能为主业，在研究生阶段好好精深专业知识，毕业后，你会发现身边的人很会理论，但大多无法独立实现，而实现能力不是一两天具备的。三，建议先进入大公司干。风雨飘摇得小公司为了生存，容易急功近利，大公司，会有一定的实力让你自己完成本职的同时去发挥。

user: user-2
content: 新手学习下，谢谢楼主

user: user-3
content: 不错，支持。我要加油了！

user: user-4
content: 谢谢分享谢谢分享

user: user-5
content: 厉害！赞一下！！

user: user-6
content: 谢谢楼主分享！！！

user: user-7
content: 非常不错，支持

user: user-8
content: 厉害，要向楼主学习！！！

user: user-9
content: 大三啊，当年我在干嘛呢？？？？？我在玩别人的游戏，LOL。。。。。

user: user-10
content: LZ牛逼

user: user-11
content: 感谢楼主分享!!!!!

user: user-12
content: 厉害啊，不错不错！

user: user-13
content: 不错，赞一个，值得学习！

user: user-14
content: 求好心人发一份给我，没分了，810544912@qq.com，先谢谢了！

user: user-15
content: 楼主大神级别啊

user: user-16
content: 大神！

user: user-17
content: 楼主好厉害。。。

user: user-18
content: 楼楼牛

user: user-19
content: 支持楼主,现在工作找到了吗？

user: user-20
content: 厉害！楼主加油~
user-0 提问: c语言

回复:
user: user-1
content: 嗯！严蔚敏的不错，而且网上有对应的视频。

user: user-2
content: 其实网上很多的，哪本数据结构都差不多内容。你找C语言版的就行了。

user: user-3
content: 清华大学出版社，严蔚敏那本，虽然看起来很枯燥，但是你可以下与那本书对应的视频来看 最好是自己用Ｃ语言把书上面的算法都用程序来实现

user: user-4
content: c语言版 数据结构！
user-0 提问: anyview系统题，无需输入与输出，求指教

回复:
user: user-1
content: int main() {     int i = 0;     intc[26] = {0};     char *s = "AbcijKaBcdEXyzuvwx";     while(s[i]!='\0')     {         if (s[i]>='a'&& s[i]<='z')         c[s[i]-'a']++;         if (s[i]>='A' && s[i]<='Z')         c[s[i]-'A']++;     }     return 0; }
user-0 提问: 求两个日期的天数，刚学C语言，求帮助

回复:
user: user-1
content: #include <stdio.h>  int mon[12]={31,28,31,30,31,30,31,31,30,31,30,31};                  /*储存12个月的天数*/ void main() {  int spec_year(int);  void scan(int *year,int *month,int *day);  long com_year(int y1,int y2);  int com_month(int y1,int m1,int y2,int m2);  int com_day(int y1,int m1,int d1,int y2,int m2,int d2);   int year1,month1,day1;  int year2,month2,day2;   long sum=0;  int k=0;   /*输入两个日期，做合法性检查*/   printf("Enter the first date,like 1988 11 30:");  scan(&year1,&month1,&day1);  printf("Enter the second date,like 1988 11 30:");  scan(&year2,&month2,&day2);   /*当输入的第一个日期比第二个日期大时，将二者对换*/   if((year1>year2)||((year1==year2)&&(month1>month2))||((year1==year2)&&(month1==month2)&&(day1>day2)))  {   int temp;   temp=year1;year1=year2;year2=temp;   temp=month1;month1=month2;month2=temp;   temp=day1;day1=day2;day2=temp;  }   /*计算两个日期之间的天数*/  sum+=com_year(year1,year2);                                /*计算两个年份之间的天数*/  sum+=com_month(year1,month1,year2,month2);                 /*计算两个月份之间的天数*/  sum+=com_day(year1,month1,day1,year2,month2,day2);         /*计算两天之间的天数*/   /*输出*/  printf("There are %ld days between them.\n",sum); }  void scan(int *year,int *month,int *day)                          /*输入日期函数，合法性判断*/ {  int k=0;  do  {   if(k!=0)    printf("\nWrong date!\n");   k++;   /*printf("Please write down the day,like 1988 11 30:");*/   scanf("%d%d%d",year,month,day);   if(spec_year(*year))    mon[1]=29;  }while(*day>mon[*month-1]||*month>13||*year<1900||*year>3000);  mon[1]=28; }  long com_year(int y1,int y2)                                      /*计算两个年份之间的天数*/ {  int i;  long sum=0;   for(i=y1+1;i<y2;i++)  {   if(spec_year(i))    sum+=366;   else    sum+=365;     }  return sum;  }  int com_month(int y1,int m1,int y2,int m2)                       /*计算两个月份之间的天数*/ {  int i;  int sum=0;  if(y1!=y2)  {   if(spec_year(y1))   {    mon[1]=29;   }   if(m1!=m2)   {    for(i=m1;i<12;i++)   {    sum+=mon[i];       }   mon[1]=28;    if(spec_year(y2))   {    mon[1]=29;   }    for(i=0;i<m2-1;i++)   {    sum+=mon[i];      }   mon[1]=28;   }   else   {   for(i=m1-1;i<12;i++)   {    sum+=mon[i];       }   mon[1]=28;    if(spec_year(y2))   {    mon[1]=29;   }    for(i=0;i<m2-1;i++)   {    sum+=mon[i];      }   mon[1]=28;   }  }  else  {    if(spec_year(y1))   {    mon[1]=29;     }   for(i=m1;i<m2-1;i++)   {    sum+=mon[i];   }     mon[1]=28;  }   return sum;  }  int com_day(int y1,int m1,int d1,int y2,int m2,int d2)             /*计算两天之间的天数*/ {  int i;  int sum=0;    if(m1!=m2)  {   if(spec_year(y1))   {    mon[1]=29;     }       sum+=(mon[m1-1]-d1);       sum+=d2;      mon[1]=28;   }  else  {   sum+=d2-d1;     }    return sum; }  int spec_year(int year)                                           /*判断是否为闰年*/ {  if((year%400==0)||((year%4==0)&&(year%100!=0)))   return 1;  else   return 0; }

user: user-1
content: 引用do    {printf("\nd1="); scanf("%d",&d1);    if(d1>cmonth(b)) printf("\nerror");    }while(cmonth(b)<d1);  实在看不出LZ这个cmoth(b)参数是什么
user-0 提问: DEV-C++问题

回复:
user: user-0
content: 感谢版主的回复，对我很有用哦，第一个问题我自己已经解决了，第二个灰常感谢。

user: user-1
content: 点击菜单帮助，查看其功能说明

user: user-2
content: 菜单栏里,工具-->编辑器选项-->编辑器属性-->显示-->行号.  至于你说的改成c文件，这个没改过。。
user-0 提问: 多线程编程的面试题

回复:
user: user-1
content: 但是妈妈先做好饭就比较麻烦了，小明要不断的检查一个标志位，看妈妈是否叫了他。感觉很浪费资源。有没有好办法？  为什么要这样做？没别的办法？

user: user-2
content: 考线程的同步，可以用信号量实现

user: user-3
content: 考的是线程的同步异步

user: user-4
content: 其实没明白楼主写的意思！ 这里两个线程无非就是同步问题了！  注意一点就是：妈妈煮好饭，小明才可以吃饭，所以这里同步下就没什么吧！

user: user-5
content: 不太清楚这个题的考点，LZ可以看看我这个角度是否对：饭是共享内存，做饭是写内存，吃饭是读内存，而小明的玩耍就是访问属于小明的独享内存。小明去玩耍时给“饭”加读锁，由于妈妈给“饭”加了写锁，因此小明无法读。如果小明的独享内存已经操作完了，写锁还没释放，证明饭还没做好，继续试图加读锁。而妈妈和小明一块吃饭就是一同给“饭”加了读锁。当然在小明玩的过程中，也需要不断地试图给“饭”加读锁，所以也会浪费资源，所以。。。
user-0 提问: 问个问题，关于全局变量和局部静态变量

回复:
user: user-0
content: 不过按这么说，七楼的理解也有偏差啊！

user: user-0
content: 好吧，看来我是被度娘误导了，一搜一大堆这种说法，搞得我晕头转向！那就是说编译的时候程序还没形成，更没执行，只有编译结束后，形成目标文件执行的时候才会给全局变量和静态变量分配空间！是吗？

user: user-1
content: 引用 10 楼 hanhuiyu2012 的回复:那个经常说的全局变量和局部静态变量在编译的时候值就定下来了是什么意思？  我怎么从来没听过类似的话……

user: user-0
content: 那个经常说的全局变量和局部静态变量在编译的时候值就定下来了是什么意思？

user: user-0
content: 还是不太懂，头都大了！

user: user-1
content: 编译时哪来的赋值一说

user: user-2
content: 引用 楼主 hanhuiyu2012 的回复:全局变量是什么时候赋初值的，是预编译的时候还是编译的时候还是执行的时候？ 还有个就是局部静态变量是什么时候初始化的？ 全局变量在编译的时候在对应的存储位置填入初始值 局部变量由于创建在栈上，每次进入时初始化 局部静态变量是建立在数据区，也是在编译的时候初始化，不需要代码

user: user-0
content: 加下Q吧，大神，详细聊下！45442017

user: user-0
content: 理解了，赋初值不代表就开了内存，编译的时候是确定了程序执行时变量的存放位置！

user: user-3
content: 引用 10 楼 hanhuiyu2012 的回复:那个经常说的全局变量和局部静态变量在编译的时候值就定下来了是什么意思？ 你制定了明年去美国的计划，你明年身处的位置就已经定了，但那不代表你现在就在美国 全局变量和局部静态变量的初始值是在代码里确定的，编译的时候代码已经不会再更改所以已经可以知道其在内存中出现后的初始值，但那不代表它们已经在内存中出现，直到这个程序被执行

user: user-3
content: 引用 12 楼 hanhuiyu2012 的回复:好吧，看来我是被度娘误导了，一搜一大堆这种说法，搞得我晕头转向！那就是说编译的时候程序还没形成，更没执行，只有编译结束后，形成目标文件执行的时候才会给全局变量和静态变量分配空间！是吗？ 对

user: user-4
content: 编译的时候就已经赋值

user: user-3
content: 引用 4 楼 hanhuiyu2012 的回复:恩，这个答案比较靠谱，不过我想说的跟你说的不是一个过程。我说的是程序写好了，进行预处理或者编译的时候，会不会就已经对局部静态变量和全局变量初始化了？ 预处理和编译是“把文本代码变成机器命令”的过程，程序尚未形成，自然没有分配任何资源，连内存都不存在，更不用提内存中的变量了 你想说什么我不清楚，我只知道“编译”和“变量”完全不是一个领域内的概念

user: user-0
content: 恩，这个答案比较靠谱，不过我想说的跟你说的不是一个过程。我说的是程序写好了，进行预处理或者编译的时候，会不会就已经对局部静态变量和全局变量初始化了？

user: user-3
content: 引用 2 楼 hanhuiyu2012 的回复:额。楼上的没听懂我的意思呀，我是想说我在main函数外定义了一个全局变量，想知道他是什么时候被赋值的。因为程序执行肯定是从main进去呀。 全局变量在进入main函数之前初始化 局部静态变量在第一次进入该函数的时候初始化

user: user-0
content: 额。楼上的没听懂我的意思呀，我是想说我在main函数外定义了一个全局变量，想知道他是什么时候被赋值的。因为程序执行肯定是从main进去呀。

user: user-5
content: 一般变量的定义时就要初始化，这是个好习惯。
user-0 提问: 这个括号匹配程序怎么改啊？我做不出来了

回复:
user: user-1
content: 贼长的代码，受不了

user: user-2
content: 先搞清楚你的括号是否只有小括号，如果是的话是不需要这么多代码的，三五行代码就够了，如果还有中括号和大括号另当别论。

user: user-3
content: i=0, 遇到（ i++ 遇到 ) i--  最后看i是否为0
user-0 提问: C语言的操作符中有这个符号吗？是什么意思？

回复:
user: user-0
content: 引用 5 楼 worldy 的回复:指针相减求出小的指针块的大小吧 是啊！谢谢！在做一个题时参考《C函数速查》，一下子没往那上面去想！

user: user-1
content: 指针相减求出小的指针块的大小吧

user: user-0
content: 引用 2 楼 max_min_ 的回复:ptr-string 指针相减啊！ 这里表示中间相差多少个字符！ 多谢，多谢！哈哈，闹笑话了！昏了，昏了！

user: user-0
content: 引用 1 楼 user-3 的回复:减号啊  指针相减 哈哈，这些天事情多，都昏头了！多谢提醒！

user: user-2
content: ptr-string 指针相减啊！ 这里表示中间相差多少个字符！

user: user-3
content: 减号啊  指针相减
user-0 提问: c语言课程设计封装

回复:
user: user-1
content: 可以到我QQ空间中看一下一篇文章  写代码学习Win32编程之动态链接库   应该可以解决你的问题 因为是很久之前写的了 没有放到CSDN博客里... 扣扣：284941821
user-0 提问: C语言菜鸟一个小小问题

回复:
user: user-1
content: 引用 6 楼 junlinfushi 的回复:[quote=引用 4 楼 mcmay 的回复:]     printf()和putchar，scanf和getchar()的一个最明显区别在于，printf()除了可以输出单个字符之外，还可以为该字符的输出规定一些格式（这也是为什么printf()和scanf()这两个I/O函数被称为格式化输出、输入函数的原因）。例如：     用printf("%c\n", 'h');，你可以输出字母h（这里的h是一个字符常量，当然h所在的位置也可以是字符变量），但屏幕上的光标会移动到下一行（以为有了\n这个具有换行功能的转义字符）。而putchar('h');只能一行之中输出字母h，而无法给它规定任何输出格式。要实现输出后换行的效果，就要再写一个putchar('\n');才能实现。     假设a是一个字符变量，用scanf("%c\t", &a); 就表示要求用户除了从键盘上输入一个字符之外还要再按下一个TAB键，然后按Enter键才能成功完成输入。而getchar();没有这样的规定，只用输入一个字母然后按下Enter键就可以完成输入。     printf()和scanf()能完成的输出、输入功能很多很多，总体比putchar()和getchar()要强大多了。建议像楼上各位提出的那样，多看看相关参考资料。还真耐心[/quote] 呵呵，一方面看看能不能帮到楼主，另一方面也是看看自己能不能把概念讲清楚。

user: user-2
content: 引用 4 楼 mcmay 的回复:printf()和putchar，scanf和getchar()的一个最明显区别在于，printf()除了可以输出单个字符之外，还可以为该字符的输出规定一些格式（这也是为什么printf()和scanf()这两个I/O函数被称为格式化输出、输入函数的原因）。例如：     用printf("%c\n", 'h');，你可以输出字母h（这里的h是一个字符常量，当然h所在的位置也可以是字符变量），但屏幕上的光标会移动到下一行（以为有了\n这个具有换行功能的转义字符）。而putchar('h');只能一行之中输出字母h，而无法给它规定任何输出格式。要实现输出后换行的效果，就要再写一个putchar('\n');才能实现。     假设a是一个字符变量，用scanf("%c\t", &a); 就表示要求用户除了从键盘上输入一个字符之外还要再按下一个TAB键，然后按Enter键才能成功完成输入。而getchar();没有这样的规定，只用输入一个字母然后按下Enter键就可以完成输入。     printf()和scanf()能完成的输出、输入功能很多很多，总体比putchar()和getchar()要强大多了。建议像楼上各位提出的那样，多看看相关参考资料。还真耐心

user: user-3
content: scanf(),printf(); //格式化输入输入函数 ，格式化 getchar(); //在标准输入流中取出一个字符 putchar; // 在标准输出流中取出一个字符  // 再不懂的话，找一个基础的书籍看看理论基础知识吧！

user: user-1
content: printf()和putchar，scanf和getchar()的一个最明显区别在于，printf()除了可以输出单个字符之外，还可以为该字符的输出规定一些格式（这也是为什么printf()和scanf()这两个I/O函数被称为格式化输出、输入函数的原因）。例如：     用printf("%c\n", 'h');，你可以输出字母h（这里的h是一个字符常量，当然h所在的位置也可以是字符变量），但屏幕上的光标会移动到下一行（以为有了\n这个具有换行功能的转义字符）。而putchar('h');只能一行之中输出字母h，而无法给它规定任何输出格式。要实现输出后换行的效果，就要再写一个putchar('\n');才能实现。     假设a是一个字符变量，用scanf("%c\t", &a); 就表示要求用户除了从键盘上输入一个字符之外还要再按下一个TAB键，然后按Enter键才能成功完成输入。而getchar();没有这样的规定，只用输入一个字母然后按下Enter键就可以完成输入。     printf()和scanf()能完成的输出、输入功能很多很多，总体比putchar()和getchar()要强大多了。建议像楼上各位提出的那样，多看看相关参考资料。

user: user-4
content: 引用 2 楼 AnYidan 的回复:先别管这些，先把基本概念搞清楚 ++，确实意义不大。学习一些基本概念先

user: user-5
content: 先别管这些，先把基本概念搞清楚

user: user-6
content: 看到这种贴。。 翻翻书或者度娘就可以解决的问题就不要来这里了，没有其他意思~~~
user-0 提问: c 与语言静态数组

回复:
user: user-1
content: 引用 13 楼 lin5161678 的回复:[quote=引用 6 楼 mujiok2003 的回复:] static int a[10] =  {1, 2, 3, 4, 5, 6, 7, 8, 9};  这个没有运行的计算，直接从image读入内存。前提：你不需要运行时计算。对于C来说 用于static 初始化的 只能的编译期常量  所以你的前提 是不存在的 写一个运行时计算 是Error[/quote]  不需要运行时计算的初始化的情况是存在的，比如:ascii table

user: user-2
content: 引用 6 楼 mujiok2003 的回复:static int a[10] =  {1, 2, 3, 4, 5, 6, 7, 8, 9};  这个没有运行的计算，直接从image读入内存。前提：你不需要运行时计算。对于C来说 用于static 初始化的 只能的编译期常量  所以你的前提 是不存在的 写一个运行时计算 是Error

user: user-3
content: 1.静态区的生命周期在程序结束时才能被系统释放，如果想自己手动释放，不应该在静态区声明，而应该在堆区声明数组变量。 2.关于初始化，如果想初始化指定的值，必须通过循环赋值。如果只是初始化，随意值都可以，系统会自动给静态区的未初始化值自动赋0。

user: user-4
content: 引用 1 楼 turingo 的回复:函数内的static int num[100],内存如何手动释放。 何谓高效的初始化？初始化一般不涉及到效率的问题。  [quote=引用 楼主 makezwl 的回复:] 函数内的static int num[100],内存如何手动释放？ static int *num[100]，如何高效的初始化？[/quote]+1

user: user-5
content: 1. 无需释放 2。 无需初始化（自动全0）

user: user-6
content: 函数内的static变量等同于全局变量，无法手动释放的。还有它们都是在分配空间时就初始化了，如果你想初始化为0的话就不需要多余的操作了。 如果要初始化为其他的值，都会写内存，应该不存在效率高低的问题。。

user: user-7
content: 引用 3 楼 JiMoKuangXiangQu 的回复:这些是操作系统进程管理以及编译器的事情，就不要自己操心了。 引用 4 楼 baichi4141 的回复:第一，数组内存不能手动释放。 第二，要简写的话，memset一条语句就可以，至于效率，不管你怎么写都基本一样。+1

user: user-8
content: 位于静态区无需释放。

user: user-1
content: static int a[10] =  {1, 2, 3, 4, 5, 6, 7, 8, 9};  这个没有运行的计算，直接从image读入内存。前提：你不需要运行时计算。

user: user-9

user: user-10
content: 第一，数组内存不能手动释放。 第二，要简写的话，memset一条语句就可以，至于效率，不管你怎么写都基本一样。

user: user-11
content: 这些是操作系统进程管理以及编译器的事情，就不要自己操心了。

user: user-12
content: 静态数组存在全局数据区,无法手动释放. 想手动释放用动态内存: int *p = malloc (100 * siezof(int));  static一般初始化为0.不需要你显示地初始化.

user: user-13
content: 函数内的static int num[100],内存如何手动释放。 何谓高效的初始化？初始化一般不涉及到效率的问题。  引用 楼主 makezwl 的回复:函数内的static int num[100],内存如何手动释放？ static int *num[100]，如何高效的初始化？
user-0 提问: invalid conversion from ‘unsigned char*’ to ‘const char*’

回复:
user: user-0
content: 木有错  是日志打印格式的问题，

user: user-1
content: unsigned char ascii[10] = {0}; 	//... 	char szBuf[128] = {0}; 	memcpy(szBuf,ascii,10);  这样不一了百了...

user: user-0
content: 我是想做个 普通字符转换为%ASCII码的格式  char ascii[],可以但是输出不对，   第一钟还是同样的问题， C语言可以通过编译 改成.CPP就报错了，晕死，求指点，，，，

user: user-2
content: 引用 3 楼 hanzhaoshuai 的回复:[quote=引用 2 楼 mujiok2003 的回复:] 1.  char const* t = reinterpret_cast<char*>(static_cast<unsigned char*>(ascii)); strncpy(result,t,sizeof(ascii));  2.  //unsigned char ascii[10];  char ascii[10];  没用呀，，[/quote] 同样的问题？别的问题？

user: user-0
content: unsigned char ascii[10];  。。。。。。 sprintf(ascii,"%%%X",*start); strncpy(result,ascii,strlen(ascii));

user: user-0
content: 引用 2 楼 mujiok2003 的回复:1.  char const* t = reinterpret_cast<char*>(static_cast<unsigned char*>(ascii)); strncpy(result,t,sizeof(ascii));  2.  //unsigned char ascii[10];  char ascii[10];  没用呀，，

user: user-2
content: 1.  char const* t = reinterpret_cast<char*>(static_cast<unsigned char*>(ascii)); strncpy(result,t,sizeof(ascii));  2.  //unsigned char ascii[10];  char ascii[10];

user: user-3
content: 参数类型不匹配
user-0 提问: 初学C关于指针数组参数

回复:
user: user-0
content: 我把改好的例子也发下 有同样疑问的同志可快速参考下 void a_init(int *len,int **a) { 	*a=(int*)malloc(2*sizeof(int)); 	(*a)[0]=1; 	(*a)[1]=2; 	*len=2; }  int main(int arg) { 	 	int *a; 	int len; 	a_init(&len,&a); 	printf("len=%d\n",len); 	for(int i=0;i<len;i++){ 		printf("a[%d]=%d\n",i,a[i]); 	} 	free(a);     return 0;   }

user: user-0
content: 首先说明下我的代码本来是用char**的 为了发例子简单临时改了下 1楼发现了问题 但这不是我想要的结果，还有就是本来2楼应该是全额分的 但是我作为一个新人刚才刷帖子没有3楼的时候 看到2楼的结果还是没开窍 我想这样的结贴结果应该说得过去吧 谢谢各位

user: user-1
content: 参考一下： #include <cstdlib> #include <cstdio>  void a_init(int *len,int **a) { 	*a=(int*)std::malloc(2*sizeof(int)); 	(*a)[0]=1; 	(*a)[1]=2; 	*len=2; }  int main(int arg) {  	int *a; 	int len; 	a_init(&len,&a); 	for(int i=0;i<len;i++){ 		printf("%d-->%d\n",len,a[i]); 	} 	free(a);  	return 0;   }  函数a_init()中: *a[0]=1; *a[1]=2; 修改为： (*a)[0]=1; (*a)[1]=2;  函数main()中： printf("%d-->%s\n",len,a[i]);修改为： printf("%d-->%d\n",len,a[i]);  增加头文件包含： #include <cstdlib> #include <cstdio>  函数 int main(int arg)最好修改为： int main(int argc, char *argv[])

user: user-2
content: 貌似运算符优先级有误(*a)[0]=...

user: user-3
content: printf("%d-->%s\n",len,a[i]);   int 型数据 你干嘛要用%s呢？
user-0 提问: void(*x(int,void(*y)(int)))(int);是个什么东西。。

回复:
user: user-1
content: x是函数x的参数很好理解就是一个int，一个函数指针，不好理解的可能呢void（*x）（int），这里用来声明其中x的返回类型，就是参数里的函数指针，两者必须一致

user: user-2
content: 4楼写的很清楚啦，是个函数来的，lz的没有函数体就是一个函数声明，指针的话应该是void(*（*x）(int,void(*y)(int)))(int)。到底不是给人看的，还是typedef简化吧，不然死晕...

user: user-3
content: 引用 11 楼 dengxu11 的回复:[quote=引用 8 楼 nadleeh123 的回复:] [quote=引用 楼主 u012846723 的回复:] void(*x(int,void(*y)(int)))(int); void(*x(int,void(*y)(int)))(int) = 0;  编译器是报的err[/quote] x显然是一个函数[/quote]  我的意思是x是指针的话，编译器应该报的是警告，报err就不是指针了

user: user-4
content: 引用 楼主 u012846723 的回复:void(*x(int,void(*y)(int)))(int); 首先里面是一个y类型的函数指针，把它作为参数传递给x类型的函数指针！ 两个函数指针的参数都是int类型，返回值为void

user: user-5
content: void(*x(int,void(*y)(int)))(int); 	//x为函数指针，该指针指向的函数有两个参数，参数1 为int，参数2是另个函数指针（参数为int，返回void）

user: user-6
content: 当然 NULL后面少了分号

user: user-6
content: void(*x(int,void(*y)(int)))(int) {return NULL}

user: user-6
content: 引用 8 楼 nadleeh123 的回复:[quote=引用 楼主 u012846723 的回复:] void(*x(int,void(*y)(int)))(int); void(*x(int,void(*y)(int)))(int) = 0;  编译器是报的err[/quote] x显然是一个函数

user: user-7
content: 引用 9 楼 whizer 的回复:函数指针 void(*x(int,void(*y)(int)))(int);  void(*y)(int) ----> typedef void(*y)(int) funcy;  void(*x(int,void(*y)(int)))(int) ---> funcy(*x(int,funcy));  funcy是一个函数指针, 第一个参数是int,返回值是void. x是函数指针,第一个参数是int, 第二个参数是funcy,返回值是funcy. typedef void(*funcy)(int);

user: user-7
content: 函数指针 void(*x(int,void(*y)(int)))(int);  void(*y)(int) ----> typedef void(*y)(int) funcy;  void(*x(int,void(*y)(int)))(int) ---> funcy(*x(int,funcy));  funcy是一个函数指针, 第一个参数是int,返回值是void. x是函数指针,第一个参数是int, 第二个参数是funcy,返回值是funcy.

user: user-3
content: 引用 楼主 u012846723 的回复:void(*x(int,void(*y)(int)))(int); void(*x(int,void(*y)(int)))(int) = 0;  编译器是报的err

user: user-2
content: 嗯typedef一下，不然会晕...

user: user-8
content: x是函数指针，该函数返回值是个函数指针，指向void(*y)(int)) 这种函数的指针 参数是（int，void(*y)(int))）

user: user-9
content: #include <stdio.h>   typedef void (*func_t)(int);  void func(int i) { 	printf("%d\n", i); }  void ( * x(int i, void(*y)(int)) ) (int) //func_t x(int i, func_t y) { 	y(i); 	return y; }  int main(void) { 	x(5, func);  	getch(); 	return 0; }  不好意思，写错一行。 typedef void (*func_t)(void);修改为： typedef void (*func_t)(int);

user: user-9
content: 函数x。 参考如下代码： #include <stdio.h>   typedef void (*func_t)(void);  void func(int i) { 	printf("%d\n", i); }  void ( * x(int i, void(*y)(int)) ) (int) //func_t x(int i, func_t y) { 	y(i); 	return y; }  int main(void) { 	x(5, func);  	getch(); 	return 0; }

user: user-10
content: 搜索:c++ 左右法则

user: user-0
content: 引用 1 楼 szy202436 的回复:函数指针吧~  求详细一点

user: user-8
content: 函数指针吧~
user-0 提问: 自己写的C语言简易版扫雷。但是有一个小BUG....

回复:
user: user-1
content: 引用 5 楼 qq695181966 的回复:[quote=引用 3 楼 bdyz1016 的回复:] for(i=0;i<N;i++) { for(j=0;j<M;j++) { if(a[j][i]=='*') { printf("%c",a[j][i]); continue;//采用continue函数实现雷的输出与周围雷存在的个数的输出// } printf("%d",b[j][i]); } printf("\n"); } continue使循环跳到递增循环变量的部分，也就是不判断j<M而直接j++。同学，还没学函数吗。 你把我的代码拷进VC6.0实现一下 只有几种情况有问题 而不是所有情况都出现越界问题。 如果按你这么说，运行出来的结果不能有对的呀~[/quote]你没发现只有在最后一个是*的时候不正确吗，你都没考虑过为什么越界的会输出出来吗

user: user-0
content: 还有~~输出的结果和扫雷游戏的规则是一样的。雷旁边的数字表示有效监测范围内存在雷的个数。 若有对规则不明白的可以再问问。我尽量说清楚~~

user: user-0
content: 第二个图为有效输出~忘记注明了~本人才大一 学习了1个月C语言，跟着老师一步一步走，发现自己可以超前的课程，所以就自己研究了这个。之前没有任何计算机语言的基础，所以这个错误找起来实在费劲TAT 找了一个早上了~找不懂了才来求助~~大神赐教啊！

user: user-0
content: 引用 4 楼 user-2 的回复:以下代码中有数组下标越界的问题:            b[j][i+1]++;           b[j][i-1]++;           b[j][i]++;           b[j+1][i]++;           b[j+1][i+1]++;           b[j+1][i-1]++;           b[j-1][i]++;           b[j-1][i-1]++;           b[j-1][i+1]++; 要改为:            if ((i + 1) < N) b[j][i+1]++; //b[j][i+1]++;           if (i > 0) b[j][i-1]++; //b[j][i-1]++;           b[j][i]++;           if ((j + 1) < M) b[j+1][i]++; //b[j+1][i]++;           if ((j + 1) < M && (i + 1) < N) b[j+1][i+1]++; //b[j+1][i+1]++;           if ((j + 1) < M && i > 0) b[j+1][i-1]++; //b[j+1][i-1]++;           if (j > 0) b[j-1][i]++; //b[j-1][i]++;           if (j > 0 && i > 0) b[j-1][i-1]++; b[j-1][i-1]++;           if (j > 0 && (i + 1) < N) b[j-1][i+1]++; //b[j-1][i+1]++;对了！ 谢谢您啊！ 这论坛真管用~咔咔咔！

user: user-0
content: 引用 3 楼 bdyz1016 的回复:for(i=0;i<N;i++) { for(j=0;j<M;j++) { if(a[j][i]=='*') { printf("%c",a[j][i]); continue;//采用continue函数实现雷的输出与周围雷存在的个数的输出// } printf("%d",b[j][i]); } printf("\n"); } continue使循环跳到递增循环变量的部分，也就是不判断j<M而直接j++。同学，还没学函数吗。 你把我的代码拷进VC6.0实现一下 只有几种情况有问题 而不是所有情况都出现越界问题。 如果按你这么说，运行出来的结果不能有对的呀~

user: user-2
content: 以下代码中有数组下标越界的问题:            b[j][i+1]++;           b[j][i-1]++;           b[j][i]++;           b[j+1][i]++;           b[j+1][i+1]++;           b[j+1][i-1]++;           b[j-1][i]++;           b[j-1][i-1]++;           b[j-1][i+1]++; 要改为:            if ((i + 1) < N) b[j][i+1]++; //b[j][i+1]++;           if (i > 0) b[j][i-1]++; //b[j][i-1]++;           b[j][i]++;           if ((j + 1) < M) b[j+1][i]++; //b[j+1][i]++;           if ((j + 1) < M && (i + 1) < N) b[j+1][i+1]++; //b[j+1][i+1]++;           if ((j + 1) < M && i > 0) b[j+1][i-1]++; //b[j+1][i-1]++;           if (j > 0) b[j-1][i]++; //b[j-1][i]++;           if (j > 0 && i > 0) b[j-1][i-1]++; b[j-1][i-1]++;           if (j > 0 && (i + 1) < N) b[j-1][i+1]++; //b[j-1][i+1]++;

user: user-1
content: for(i=0;i<N;i++) { for(j=0;j<M;j++) { if(a[j][i]=='*') { printf("%c",a[j][i]); continue;//采用continue函数实现雷的输出与周围雷存在的个数的输出// } printf("%d",b[j][i]); } printf("\n"); } continue使循环跳到递增循环变量的部分，也就是不判断j<M而直接j++。同学，还没学函数吗。
user-0 提问: PROC动态执行SQL，多次执行报错...

回复:
user: user-1
content: 楼主，我也遇到了跟你差不多的问题 ，按照你说的把ROLLBACK 去掉，但是还是有错！ http://bbs.csdn.net/topics/390672352 帮忙看一下，谢谢！

user: user-0
content: 由于连接数据库的代码相对比较简单，所以就没有贴，动态执行select的代码中有些是对select语句的处理，大家不必关心。。。

user: user-0
content: 问题解决 由于之前代码中存在EXEC SQL COMMIT/ROLLBACK RELEASE;本来是想到这种语句导致了数据库断开连接的，后来注释掉了，可是问题还是存在，刚才把这种代码删除了之后，问题解决。真是个奇怪啊 好吧，没人参与问题，结贴了

user: user-0
content: gdb调试跟踪到EXEC SQL PREPARE s_sql FROM :sql;处开始出错了，实在不知是什么原因引起的了，哪位高手帮忙啊？？
user-0 提问: 为什么运行不出结果，是因为数据太大了吗

回复:
user: user-0

user: user-0
content: 引用 2 楼 gqjjqg 的回复:7 的结果是 61479419904000， 用long long 不够的。 不是这个问题，答案是100多亿，我的够的啊

user: user-0
content: 引用 1 楼 user-2 的回复:下个断点调试有助你解决问题.  程序员遇到执行结果跟自己想的不同, 那么调试就是最好的做法, 而不是去阅读代码,或者让别个帮你阅读代码来找错. 嗯，我调了的，但是到dfs里出不来。。关键有几千万种，不知道哪里出错了。。

user: user-1
content: 7 的结果是 61479419904000， 用long long 不够的。

user: user-2
content: 下个断点调试有助你解决问题.  程序员遇到执行结果跟自己想的不同, 那么调试就是最好的做法, 而不是去阅读代码,或者让别个帮你阅读代码来找错.

user: user-1
content: 引用 4 楼 zwfars 的回复:[quote=引用 2 楼 gqjjqg 的回复:] 7 的结果是 61479419904000， 用long long 不够的。 不是这个问题，答案是100多亿，我的够的啊[/quote]  参考资料： http://oeis.org/A002860  n阶拉丁方 数量 没有公式， 极大可能是你的搜索效率太低，需要等比较长的时间。
user-0 提问: 关于指针函数的问题

回复:
user: user-1
content: #include "stdafx.h"  int *shuru(int *p) { int i; for (i = 0; i < 10; i++) { scanf ("%d,",&p[i]); return (p);       ///////////看下是不是return 的位置写错了  这样写就只能指向一个数据 } }  int *chuli (int a[10]) { int min, max, k, j, n; for (k = 0, j = 0, n = 0; n < 10; n++)           ///你这又循环10次，肯定出错 { if (a[k] < a[n]) k = n; if (a[j] > a[n]) j = n; } max = a[k]; a[k] = a[9]; a[9] = max; min = a[j]; a[j] = a[0]; a[0] = min; return (a); }  void shuchu(int *p) { int j; for (j = 0; j < 10; j++) { printf ("%d",p[j]); } } void main() { int a[10], *q; q = a; shuru(q); printf ("eee\n"); printf ("%d\n",*q); //	q = a; chuli(a); printf ("eee\n"); printf ("%d\n",*q); //	q = a; shuchu(q); }

user: user-2
content: 最后还有就是你的标题，嘻嘻！你的程序里面并没有指针函数，指针函数的形式是这样子滴：返回值 （*函数名）（形参表）；上面所写的函数只不过是返回指针类型的函数而已。

user: user-2
content: 我觉得吧！首先你需要看一下你的第一个函数shuru（），在for循环里面返回，意思是需要返回10次吗？，还有就是在这个函数中其实传进来是数组的话，数组名就是首地址，是按地址传递的，并不需要返回，按地址传递的参数属于传入传出参数。我想你理解了这两点之后，应该就可以做出来了

user: user-1
content: 引用 4 楼 user-3 的回复:[quote=引用 3 楼 N_sev7 的回复:]  #include "stdafx.h"  int *shuru(int *p) { int i; for (i = 0; i < 10; i++) { scanf ("%d,",&p[i]); return (p);       ///////////看下是不是return 的位置写错了  这样写就只能指向一个数据 } }  int *chuli (int a[10]) { int min, max, k, j, n; for (k = 0, j = 0, n = 0; n < 10; n++)           ///你这又循环10次，肯定出错 { if (a[k] < a[n]) k = n; if (a[j] > a[n]) j = n; } max = a[k]; a[k] = a[9]; a[9] = max; min = a[j]; a[j] = a[0]; a[0] = min; return (a); }  void shuchu(int *p) { int j; for (j = 0; j < 10; j++) { printf ("%d",p[j]); } } void main() { int a[10], *q; q = a; shuru(q); printf ("eee\n"); printf ("%d\n",*q); //	q = a; chuli(a); printf ("eee\n"); printf ("%d\n",*q); //	q = a; shuchu(q); }  格式也调下嘛！亲[/quote] 直接Ctrl C  +  Ctrl V过来的

user: user-3
content: 引用 3 楼 N_sev7 的回复: #include "stdafx.h"  int *shuru(int *p) { int i; for (i = 0; i < 10; i++) { scanf ("%d,",&p[i]); return (p);       ///////////看下是不是return 的位置写错了  这样写就只能指向一个数据 } }  int *chuli (int a[10]) { int min, max, k, j, n; for (k = 0, j = 0, n = 0; n < 10; n++)           ///你这又循环10次，肯定出错 { if (a[k] < a[n]) k = n; if (a[j] > a[n]) j = n; } max = a[k]; a[k] = a[9]; a[9] = max; min = a[j]; a[j] = a[0]; a[0] = min; return (a); }  void shuchu(int *p) { int j; for (j = 0; j < 10; j++) { printf ("%d",p[j]); } } void main() { int a[10], *q; q = a; shuru(q); printf ("eee\n"); printf ("%d\n",*q); //	q = a; chuli(a); printf ("eee\n"); printf ("%d\n",*q); //	q = a; shuchu(q); }  格式也调下嘛！亲
user-0 提问: C语言新手问题（十位数计算器，不考虑优先）

回复:
user: user-1
content: #include<stdio.h> #include<stdlib.h>  #define    N    1024 #define    M    1024  char a[N]; int b[M];    int main (void)  { 	int i, j, k; 	char c[100]; 	char d[100];    //存放运算符  	scanf ("%s", a); 	for (i = 0, j = 0, k = 0; i < N; i++)     { 		if (a[i] > 47 && a[i] < 58) 		{ 			c[j] = a[i]; 			j++; 		}       else 		{ 			d[k] = a[i]; 			c[j] = '\0'; 			j = 0; 			b[k] = atoi (c); 			k++; 			if (a[i] == '\0') 	   			 break; 		} 	}    	int result = b[0]; 	for (i = 0; i < k; i++)     { 		switch (d[i]) 		{ 			case '+': 	  		result = result + b[i + 1]; 			break;	  			case '-': 	  			result = result - b[i + 1]; 			break;  			case '*': 	  			result = result * b[i + 1]; 			break; 	 			case '/': 	  			result = result / b[i + 1]; 			break; 		} 	}    	printf ("%d\n", result);    	return 0; } 简单的修改了一下你的程序，不过不知道你是如何测试的。

user: user-2
content: for(i=0;i<k;i++) {     switch(d[i])     {     case '+':             result = result + b[i+1];            break;     case '-': result = result - b[i+1];            break;     case '*': result = result * b[i+1];            break;     case '/': result = result / b[i+1];            break;     default:  }

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

回复:
user: user-1
content: 也就是说a=a->next;语句必须在insert()函数之前，仔细分析insert()函数， 你传入的第二个参数p,在insert函数中修改了p的next指针， 在resolve函数中，如果a=a->next放在里面，也就是insert()函数前面，就会被你在insert()中修改，返回时就找不到原来的链表，所以会陷入死循环。  http://www.onestraw.net
user-0 提问: 再次求人传道授业解惑！！

回复:
user: user-1
content: int *p=malloc(10),i;修改为 int *p=malloc(10*sizeof(int)),i;

user: user-1
content: 操作p指向的内存块越界了，即你分配了10个int，操作的p的时候出现了p[10],p[11]的类似状况。

user: user-2
content: int *p=malloc(10) 这句话有问题，你的意思是要分配10个int大小的空间，但是malloc(10)只能分配10个Byte，所以后面的代码肯定有段错误。 改成：int *p = malloc(sizeof(int) * n);   建议你的全局变量换个定义方式： int a[]={5,4,2,1,53,5,3,5,54,7}; const int n = sizeof(a) / sizeof(a[0]);

user: user-1
content: 引用 5 楼 loveice582 的回复:万分感谢 不过我之前写的是int *p=(int *)malloc(10）也报错 改成你这样就不报错了：int *p=malloc(10*sizeof(int))  请问这2句不是一个意思么？  [quote=引用 4 楼 JiMoKuangXiangQu 的回复:] int *p=malloc(10),i;修改为 int *p=malloc(10*sizeof(int)),i; 引用 2 楼 zhou19891113 的回复:int *p=malloc(10) 这句话有问题，你的意思是要分配10个int大小的空间，但是malloc(10)只能分配10个Byte，所以后面的代码肯定有段错误。 改成：int *p = malloc(sizeof(int) * n);   建议你的全局变量换个定义方式： int a[]={5,4,2,1,53,5,3,5,54,7}; const int n = sizeof(a) / sizeof(a[0]);[/quote]  malloc()的参数是字节数。 现在你的目的是分配是个整形的空间，需要字节数为：10 * sizeof(int)； 而当形式 malloc(10) 调用，只向堆上申请了 10 个字节，而不是10个int需要的空间 10 * sizeof(int)。

user: user-0
content: 万分感谢 不过我之前写的是int *p=(int *)malloc(10）也报错 改成你这样就不报错了：int *p=malloc(10*sizeof(int))  请问这2句不是一个意思么？  引用 4 楼 JiMoKuangXiangQu 的回复:int *p=malloc(10),i;修改为 int *p=malloc(10*sizeof(int)),i; 引用 2 楼 zhou19891113 的回复:int *p=malloc(10) 这句话有问题，你的意思是要分配10个int大小的空间，但是malloc(10)只能分配10个Byte，所以后面的代码肯定有段错误。 改成：int *p = malloc(sizeof(int) * n);   建议你的全局变量换个定义方式： int a[]={5,4,2,1,53,5,3,5,54,7}; const int n = sizeof(a) / sizeof(a[0]);

user: user-3
content: 在 free 前检查 p 的值是否与 malloc 的返回值一致
user-0 提问: 关于使用循环读写文件问题，不懂，求大神解答。。。

回复:
user: user-0
content: 引用 3 楼 lm_whales 的回复:[quote=引用 楼主 zaixiankaifa 的回复:]  问题： 标注为红色的代码中： if(read(rfd,&c,1)!=1) 			return 1; 		write(wfd,&c,1); 一旦 if(read(rfd,&c,1)!=1) return 1; 那么就不可能去写：write(wfd,&c,1);(因为前面都已经return 1了）。这样还能循环从前一个文件读取字符，然后写入到下一个文件里面吗？  这个代码是不是有问题？ 没有任何问题。 read(rfd,&c,1)==1 表示读到数据。可以写文件。 read(rfd,&c,1)!=1 表示没有读到数据，所以不用写。  而且，一旦read(rfd,&c,1)!=1  就是文件读出错了，或者读到文件结束了。  所以写文件也可以结束了。 [/quote]  那read(rfd,&c,1)==1读到数据的时候，也要把“读”这个操作写上去才行呀？  不然，只把读不到的情况写上去，那么读的到数据的情况不写，如何读到哦？

user: user-1
content: 引用 楼主 zaixiankaifa 的回复:问题： 标注为红色的代码中： if(read(rfd,&c,1)!=1) 			return 1; 		write(wfd,&c,1); 一旦 if(read(rfd,&c,1)!=1) return 1; 那么就不可能去写：write(wfd,&c,1);(因为前面都已经return 1了）。这样还能循环从前一个文件读取字符，然后写入到下一个文件里面吗？  这个代码是不是有问题？ 没有任何问题。 read(rfd,&c,1)==1 表示读到数据。可以写文件。 read(rfd,&c,1)!=1 表示没有读到数据，所以不用写。  而且，一旦read(rfd,&c,1)!=1  就是文件读出错了，或者读到文件结束了。  所以写文件也可以结束了。

user: user-0
content: 我明白了，没有问题的，谢谢大神指点

user: user-2
content: 就这3行代码来看，应该没什么问题的。。。

user: user-3
content: 补充一下，感觉fork子进程，没有必要。还有就是没有close两个文件

user: user-4
content: ssize_t read(int filedes, void *buf, size_t nbytes);   Returns: number of bytes read, 0 if end of file, -1 on error  When reading from a regular file, if the end of file is reached before the requested number of bytes has been read. For example, if 30 bytes remain until the end of file and we try to read 100 bytes, read returns 30. The next time we call read, it will return 0 (end of file).  When reading from a terminal device. Normally, up to one line is read at a time. (We'll see how to change this in Chapter 18.)  When reading from a network. Buffering within the network may cause less than the requested amount to be returned.  When reading from a pipe or FIFO. If the pipe contains fewer bytes than requested, read will return only what is available.  When reading from a record-oriented device. Some record-oriented devices, such as magnetic tape, can return up to a single record at a time.

user: user-5
content: 代码是应该有问题的！ 而且中间的fork函数你没有处理父子进程呢！
user-0 提问: 某大公司的笔试题，单单是看代码可以得出结果，但是写代码验证的时候老是通不过编译，细细一看，感觉题目有错，请指教。

回复:
user: user-1
content: 这是MFC里的CString类型的方法. 之前还真没看到过。。。哎~~查了MSDN才知道的

user: user-2
content: 面试题不要纠结于能不能编译过，只要能说出结果就可以了。

user: user-3
content: 而且没见过 c++ string 类有大写字母开头的成员函数(Left,Mid,GetLength)。

user: user-3
content: 有问题啊，string是c++类，c++中main()可以没有返回值的吗？

user: user-0
content: 没关return的事的。。

user: user-0
content: 谢谢大家。。可能我太执着要验证，我也查过CString，没用过。Left,Mid,GetLength貌似也在MFC中使用，要联合CString一起用，可能是编译环境问题造成错误。

user: user-4
content: 看这函数的调用，应该是MFC的CString才对，没想到还有大公司笔试MFC的…… 不太记得了，帮你搜了一下，看看应该有帮助： http://hi.baidu.com/drunkdream/item/d6c2fb0c5ea84ccf75cd3cd9

user: user-5
content: 这个编译不过，就是表达一下语意

user: user-0
content: C++环境下编译我也试过了。。。。。

user: user-0
content: 这个我知道。。@N_sev7

user: user-6
content: C语言中没有string类 在C++中才有
user-0 提问: 外部函数 与 include的区别

回复:
user: user-1
content: 楼主，其实这是编译器干的事情。 我简单随性点说吧：  #include “A.h” 这个宏告诉编译器，这个文件要把A.h 中的内容全部复制过来。  extern int fun 告诉编译器： 有这个函数，你在这个文件里可以使用这个函数，但是这个函数是在另外一个文件中定义的。

user: user-2
content: #include 可以看做是接口的组织方式。

user: user-3
content: 各有优劣，适用于不同的场合。就extern而言，因为C++支持分离式编译，声明和定义可分开进行，声明只是使得名字为程序所知，就像知道有这么个人而且他是美国人就可以了，一个文件如果想使用别处定义则必须包含对那个名字的声明，就像我们需要一个美国外教，他不一定非得呆在我们学校，而定义是创建了这样一个实体。定义出现在他该出现的地方，但别处需要时需要只需要声明，像个客座教授，在别的学校只挂了名，人家有需求要去时才去，平日就呆自己学校。

user: user-4
content: extern 用多了，会造成整个程序的架构的混乱，include就比较清晰了。建议少用extern

user: user-5
content: 函数默认链接属性是 extern。  这里显示的使用 extern 关键字，是因为该函数是非 c 的，需要链接器进行特别的处理。   如；汇编或其他编译器生成的函数。   头文件其实就是交叉引用表。也就是说，你需要在两个以上的文件中使用该表格，才能起到交叉引用的作用。 否则，你是不需要这份表格的。 #include

user: user-6
content: 因为include方便管理, extern一般只是用于在某个头文件中声明其对应cpp中定义的变量, 方便被其它头文件包含而不会重定义.  extern一般写在头文件中, 要用extern声明的变量的时候, 包含头文件即可.  你说的include会重现重定义, 是因为你把 变量的定义 或者 函数的实现写在了头文件中, 而这些变量一般应该写在.cpp中, 除非你自己能保证这个头文件不会出现重复包含.  不过, 在头文件中也有解决变量重定义的问题.  __declspec(selectany) int g_val = 0;

user: user-7
content: 工程大文件多，你就会乖乖#include...

user: user-8
content: extern是外部的意思。 这是一个储存类型~但是如果函数定义前加上extern或缺省，表示该函数可以被其它源文件的函数所调用（但在那个源文件中必须对该函数先进行声明，进行作用域扩展），叫外部函数。

user: user-9
content: 一个头文件可以包含很多（函数原型和类型）声明. 推荐使用#include 头文件，不要总是使用前显示声明：避免重复代码， 也避免风险。

user: user-10
content: 如果只是用函数的话，一般情况下是不用include的，因为函数的实现在.c文件中，如果你要include的话还得把函数的声明写到.h文件中，使用extern效果一样。使用include的话一般是为了使用这个.h文件的结构体或者宏定义，因为宏没法extern。

user: user-11
content: 函数原型声明的extern 可以省略。 因为函数的存储类型，缺省是extern 。 头文件里的函数，一般不写extern 。 外部变量声明，一般不能省略extern。

user: user-0
content: 引用 1 楼 N_sev7 的回复:extern只是告诉编译器有这个函数，用就行了 但是当连接的时候，如果在不同的工程里面 若不包含定义此函数的头文件则会报错  详细解析可以参考如下 http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777431.html 这篇文章介绍挺详细的，谢谢

user: user-12
content: 引用 2 楼 max_min_ 的回复:#include 和外部函数完全不同的东西，那里有什么可比性啊！ 如果有N个函数，N个结构体 ，你一个一个extern么？  如果有N个函数，N个结构体 在 M 个 c 文件中，你能保证每处都 extern 的一样吗？

user: user-0
content: 引用 2 楼 max_min_ 的回复:#include 和外部函数完全不同的东西，那里有什么可比性啊！ 如果有N个函数，N个结构体 ，你一个一个extern么？ 今天在gcc下试的不用extern，直接调用外部函数也可以，而在windows下却不可以，难道是编译器的不同造成的？

user: user-13
content: #include 和外部函数完全不同的东西，那里有什么可比性啊！ 如果有N个函数，N个结构体 ，你一个一个extern么？

user: user-14
content: extern只是告诉编译器有这个函数，用就行了 但是当连接的时候，如果在不同的工程里面 若不包含定义此函数的头文件则会报错  详细解析可以参考如下 http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777431.html