Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 数组{1,3,5,7}为什么输出的是扑克牌符号

回复:
user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。  谢谢!

user: user-0
content: 引用 4 楼 maple_LE 的回复:orz，这个程序写的好绕啊= = 首先这段代码  for (i=0;i<5;i++) num[i]=&a[i];  这让int指针数组的每个指针分别指向了数组的每个元素，也就是说现在*num[i]==a[i] 而接下来的  for (i=0;i<5;i++) { p=num+i; printf("%s",*p); }  这里的第一行代码相当于p=&num[i]也就是说p指向了num数组中的指针，现在它是一个指向指针的指针，但下面的printf语句非常的有问题 *p只对指针p解除了一级引用，现在的它相当于num[i]==&a[i]，也就是说它相当于和a数组中i号元素地址 接下来是格式说明符%s，这是输出字符串，也就是说printf函数将会不断输出以i号元素为起点，下一个空字符为终点的区间内的所有字符 所以接下来输出的结果就看你这个编译器的编码类型和空字符在内存中的位置了= = 以上属于个人的理解，如果有错误的话请提出来，谢谢= =  感谢详细的讲解！书上没怎么说，分别给了2个写法，我在win8上用的vc++6.0，只能用%d对应**p。回复晚了不好意思

user: user-0
content: 引用 1 楼 T5500 的回复:printf("%s",*p); //这里的格式控制符应该是%d吧，是不是抄错了？  没抄错，p是指向指针的指针。  printf("%d",**p);这个就没错，不知道为什么

user: user-1
content: p存储的是指针数组的元素的地址，指针数组的每个元素都是一个指向int数组的单个元素的地址，即指针数组的单个元素对应int数组的单个元素的地址;对p取值(*)取出的是指针数组中的指向int数组单个元素的地址，即(*p)是一个指针数组元素，这个元素指向int数组元素，再次对*p取值，得到的才是int数组的元素的值

user: user-2

user: user-2
content: printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。

user: user-3
content: 引用 1 楼 T5500 的回复:printf("%s",*p); //这里的格式控制符应该是%d吧，是不是抄错了？+1

user: user-4
content: orz，这个程序写的好绕啊= = 首先这段代码  for (i=0;i<5;i++) num[i]=&a[i];  这让int指针数组的每个指针分别指向了数组的每个元素，也就是说现在*num[i]==a[i] 而接下来的  for (i=0;i<5;i++) { p=num+i; printf("%s",*p); }  这里的第一行代码相当于p=&num[i]也就是说p指向了num数组中的指针，现在它是一个指向指针的指针，但下面的printf语句非常的有问题 *p只对指针p解除了一级引用，现在的它相当于num[i]==&a[i]，也就是说它相当于和a数组中i号元素地址 接下来是格式说明符%s，这是输出字符串，也就是说printf函数将会不断输出以i号元素为起点，下一个空字符为终点的区间内的所有字符 所以接下来输出的结果就看你这个编译器的编码类型和空字符在内存中的位置了= = 以上属于个人的理解，如果有错误的话请提出来，谢谢= =

user: user-5

user: user-6
content: 嗯，是输出格式的问题，你是想%d还是%p啊，如果是%s就会出现这种情况

user: user-7
content: printf("%s",*p); //这里的格式控制符应该是%d吧，是不是抄错了？
user-0 提问: 代码提示segment fault

回复:
user: user-1
content: int arr[] = {};  一没有size,二是如果arr[]里如果不指定大小 ，那么一定要在中括号里赋值

user: user-2

user: user-3
content: 引用 1 楼 u012421456 的回复:数组没有初始化，里边是些什么东西就不知道了， 你初始化数组后试试+1

user: user-4
content: 引用 16 楼 chireice 的回复:[quote=引用 10 楼 amoyman 的回复:] int arr[]={} 改成 int arr[15]={0}; 在 i < 15 就不会越界了。 我是想试试在不确定数组长度的情况下该如何处理，C是不支持动态分配内存的是吧[/quote] malloc+free

user: user-5
content: 其实电脑开机后物理内存的每个字节都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。

user: user-6
content: 变量定义未开辟空间，只开辟了一个内存地址，这个地址的空间到底多大只有电脑知道。

user: user-7
content: 引用 15 楼 chireice 的回复:我不明白的是，为何既然是越界了，却还可以往数组中写入？ 你的代码可以写入任何地址，没人帮你检查越界，完全靠程序员自己检查。 就像很大一片空地，没有围墙和栅栏，你想去哪就去哪，但是很多地方都有钉子甚至地雷，踩上了后果自负。

user: user-0
content: 引用 10 楼 amoyman 的回复:int arr[]={} 改成 int arr[15]={0}; 在 i < 15 就不会越界了。 我是想试试在不确定数组长度的情况下该如何处理，C是不支持动态分配内存的是吧

user: user-0
content: 引用 4 楼 zysnet 的回复:数组没有定义长度，那么在编译的时候在栈中不会给它分配空间，那么在使用这个数组时，当然后访问访问越界了。  这种用法不对，定义数组必须要使用编译器知道数组的大小，这样才能组它分配空间，这是C语言的规矩（动态分配内存和这个机制不一样），所以应该有以下几做定义：  int arr[] = {1, 2, 3, 4};     //这样编译器是知道数组的大小的  int arr[4];                        //这样编译器也是知道数组的大小的，虽然没有初始化 我不明白的是，为何既然是越界了，却还可以往数组中写入？而且长短没有限制，一定是到最后一个循环结束后才会提示错误

user: user-0
content: 引用 8 楼 brookmill 的回复:我用的是cygwin，gcc 4.8.2 楼主用的什么系统和编译器？  系统：Linux version 2.6.32-431.el6.x86_64 编译器：gcc version 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC)

user: user-8
content: 楼上所言极是！

user: user-9
content: 内存就是公厕，你不预定，清洁工是不会清洁前任拉过的屎的

user: user-9
content: int arr[] = {};　请问你到底想要开个多大的数组？编译器直接默认开0个数据大小的内存；会给出： error C2466: 不能分配常量大小为 0 的数组（VS2010）。 如果不确定的话，试试用vector吧。

user: user-10
content: int arr[]={} 改成 int arr[15]={0}; 在 i < 15 就不会越界了。

user: user-11
content: int arr[] = {};　　这样没有意义

user: user-7
content: 我用的是cygwin，gcc 4.8.2 楼主用的什么系统和编译器？

user: user-7
content: 从楼主的描述来看，Segmentation fault很可能是main函数返回的时候发生的。函数的返回地址是保存在栈上的，如果局部变量越界覆盖(改动)了返回地址，覆盖的时候不会出事，return的时候就会返回到一个错误的地址，就挂掉了。 但是楼主的代码虽然读取了越界的内容，但是没有做任何修改，所以栈没被破坏，按理也就不应该挂。我运行楼主的代码就没事，但是做了以下改动之后就会出现和楼主类似的现象。     for( i = 0; i < 15; i ++) {         printf( "%d -> %d \n", i, arr[i] );         arr[i] = i;  // 加上这一行     }     printf("12345\n");  // 加上这一行     sleep(2);  // 加上这一行     return 0;

user: user-5
content: 进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’ 使用命令 gdb 运行程序名 core或core.数字 进入gdb然后使用bt命令 可以查看进程意外退出前函数调用的堆栈，内容为从上到下列出对应从里层到外层的函数调用历史。 如果进程意外退出不产生core文件，参考“ulimit -c core文件最大块大小”命令

user: user-3
content: 下标越界

user: user-12
content: 数组没有定义长度，那么在编译的时候在栈中不会给它分配空间，那么在使用这个数组时，当然后访问访问越界了。  这种用法不对，定义数组必须要使用编译器知道数组的大小，这样才能组它分配空间，这是C语言的规矩（动态分配内存和这个机制不一样），所以应该有以下几做定义：  int arr[] = {1, 2, 3, 4};     //这样编译器是知道数组的大小的  int arr[4];                        //这样编译器也是知道数组的大小的，虽然没有初始化
user-0 提问: c#和c++的相互调用

回复:
user: user-1
content: 不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件，或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。 比如： A将请求数据写到文件a.txt，写完后改名为aa.txt B发现aa.txt存在时，读取其内容，调用相应功能，将结果写到文件b.txt，写完后删除aa.txt，改名为bb.txt A发现bb.txt存在时，读取其内容，读完后删除bb.txt 以上A可以替换为任何一种开发语言或开发环境，B可以替换为任何一种与A不同的开发语言或开发环境。 除非A或B不支持判断文件是否存在、文件读写和文件更名。 但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢？  共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多，下面仅列出我现在能想到的： ·进程之间松耦合 ·进程可在同一台机器上，也可跨机，跨操作系统，跨硬件平台，甚至跨国。 ·方便调试和监视，只需让第三方或人工查看该临时文本文件即可。 ·方便在线开关服务，只需删除或创建该临时文本文件即可。 ·方便实现分布式和负载均衡。 ·方便队列化提供服务，而且几乎不可能发生队列满的情况（除非硬盘空间满） ·……

user: user-2
content: “这个func函数中的for循环每循环一次，就会返回一个值给c#，请问应该怎么实现~~~。” 不要说C#啦， 就是C++自己也做不到啊， 一个函数只能返回一个值啊。。。。

user: user-3
content: 。。。。。。。

user: user-4
content: 这个不是C++\c#的问题，A函数调用B函数，B函数有for循环，每次for循环会有返回值。哪里来的这种B函数？

user: user-5
content: 看看这个有帮助没——http://www.cnblogs.com/liping13599168/archive/2011/03/31/2000320.html
user-0 提问:  大神帮我看下动态库.so有没有加载上

回复:
user: user-1
content: 进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’ 使用命令 gdb 运行程序名 core或core.数字 进入gdb然后使用bt命令 可以查看进程意外退出前函数调用的堆栈，内容为从上到下列出对应从里层到外层的函数调用历史。 如果进程意外退出不产生core文件，参考“ulimit -c core文件最大块大小”命令

user: user-2
content: 应该是你代码写的有问题。

user: user-3
content: libcurl.so 是否还依赖其他的库

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’ 使用命令 gdb 运行程序名 core或core.数字 进入gdb然后使用bt命令 可以查看进程意外退出前函数调用的堆栈，内容为从上到下列出对应从里层到外层的函数调用历史。 如果进程意外退出不产生core文件，参考“ulimit -c core文件最大块大小”命令后来发现把 gcc 参数 -shared 去掉就可以了 但好奇怪，我链接的就是动态库亚  其实整个过程是这样的： 我需要curl库，curl库的编译需要cyassl库，限于嵌入式下不允许安装这2者（太大，浪费资源）： 我们这么做： 1.只make cyassl， 把得到的*.h和*.so找到，拉出来整理在一起 2.在make curl的时候需要cyassl动态库，我们给其*.so的目录，就把curl make好了 3.程序中需要curl，我们把*.h 和 *.so提取出来，整理在一起 4.在gcc 参数中链接那些curl *.so目录

user: user-0
content: 引用 2 楼 zmlovelx 的回复:应该是你代码写的有问题。问题基本解决了，和代码无关，Makefile写的有问题

user: user-0
content: 引用 1 楼 user-3 的回复:libcurl.so 是否还依赖其他的库依赖cyassl库
user-0 提问: 能看看这个 为什么不可以么 

回复:
user: user-1
content: 仅供参考#include <stdio.h> int main() {     int IP[4];     int i;     char c;      printf("请输入一个ip地址:");fflush(stdout);     while (1) {         rewind(stdin);         if (5==scanf("%d.%d.%d.%d%c",&IP[0],&IP[1],&IP[2],&IP[3],&c)) {             if (0<=IP[0] && IP[0]<=255              && 0<=IP[1] && IP[1]<=255              && 0<=IP[2] && IP[2]<=255              && 0<=IP[3] && IP[3]<=255              && '\n'==c) {                 break;             } else printf("输入的ip地址格式不对!\n请重新输入:\n");         } else printf("输入的ip地址格式不对!\n请重新输入:\n");     }     for (i=0;i<4;i++) {         printf("IP[%d]=%d\n",i,IP[i]);     }     return 0; }

user: user-2
content: 一般也没什么问题，只是最好不要这么用，你这个程序可以试试强制类型转换

user: user-0
content: 恩恩 好的 谢谢了  可是关键我需要输入的不仅仅是整数啊，那么应该怎么办呢？

user: user-2
content: 去掉那个分号，还有，其实scanf("%lf",&Fahrenheit))==1并不是很好，因为在计算机中浮点数无法准确存储，即使你输入1.0，那也可能是保存为0.999999或1.00000001什么的

user: user-3
content: scanf %lf有格式控制的，所以你的输入无法停止。可以改成！=1能够触发退出循环

user: user-2
content: while后面的分号

user: user-4
content: while条件写错了，改后为while((scanf("%lf",&Fahrenheit)==1));
user-0 提问: C语言数组和指针问题求助

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

user: user-2
content: 数组最好不要加减 先赋值给指针后在进行加减，不容易错 int* p = count;

user: user-0
content: #include<stdio.h> void Aaa(int bbb);  int main() { 	int iShuzu[10]; 	int i; 	for(i=0;i<10;i++) 	{ 		iShuzu[i]=i; 	} 	for(i=0;i<10;i++) 	{ 		Aaa(iShuzu[i]); 	} 	return 0; } 	void Aaa(int bbb) 	{ 		printf("%d\n",bbb); 	} 书上说数组作为实参是数组的地址 那么这个main函数在调用Aaa的时候 为什么可以直接写iShuzu呢 我觉得应该是*iShuzu啊 否则就不能输出想要的元素而是输出每个数组的地址啊 但是结果输出的确实 0 1 2 3 4 5 6 7 8 9这些元素啊 为什么？？？？

user: user-3
content: 楼主可以看一下——http://blog.csdn.net/mbh_1991/article/details/9079463

user: user-4
content: 估计是书上写的有误，*的意思就是解引用，count 和 &country[0]是一样的，*count 和 count[0]是一样的

user: user-5
content: Count是第一个元素的地址，自然*Count是第一个元素，Count+1表示数组的第二个元素的地址，依次类推

user: user-6
content: Count内为数组首地址也是第一个元素的地址。。。
user-0 提问: 读写文件问题

回复:
user: user-1
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;  //... } 类似的例子还可以举很多。  代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-2
content: 安装win8.1中。。。，暂时无法查看

user: user-3
content: 没看明白你的程序意图是什么 加入a里面是“gfedcba”，你是希望执行完程序后变成“fedcba”还是“fghijkl”？ 如果是后者，你的代码可以实现，但如果是前者，这个代码就不对了

user: user-4
content: 这个我不是太清楚，测试了一会，在fwrite后加个fflush之后好像能用。

user: user-0
content: #include <stdio.h> #include <stdlib.h> int main() {     FILE *fp;     if ((fp = fopen("a", "rb+")) == NULL)     {         printf("error");         exit(0);     }     char temp;     fseek(fp, 0, 2);     int length = ftell(fp);     rewind(fp);     while (ftell(fp) < length)     {         fread(&temp, 1, 1, fp);         temp++;         fseek(fp, -1, 1);         fwrite(&temp, 1, 1, fp);     }     fclose(fp);     return 0; }
user-0 提问: HBase 启动Failed to start master

回复:
user: user-1
content: 没结贴，没解决嘛

user: user-2
content: 楼主您好！我也遇到着这个问题！！好几天了解决不好~请问您是怎么解决的呢？先感谢了

user: user-0
content: 引用 1 楼 liuhengxiao 的回复:你发错板块了吧！？这里是开发板块 哪个版块合适呢？？

user: user-3
content: 你发错板块了吧！？这里是开发板块
user-0 提问: 请问这段将FILE文件转化为char类型的代码有什么问题？ffile为什么总是-1？

回复:
user: user-1
content: 引用 6 楼 jiangdianqin 的回复:[quote=引用 5 楼 zhao4zhong1 的回复:] ffile=new char[filesize]; size_t sz = fread(ffile,sizeof(char),filesize,fp);话说写入char字符数组的话不是还需要预留一个字节存放‘/0’吗？[/quote] jpg和asciiz没有关系。  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……

user: user-0
content: 引用 11 楼 adlay 的回复:引用 10 楼 jiangdianqin 的回复:[quote=引用 8 楼 adlay 的回复:] FILE 是一个结构，你说的 -1 不晓得是指里面哪个成员为 -1？ 还是指针的值是 -1？是写入的char变量的值为-1 这... new 如果出错要么返回 NULL， 要么抛出异常，怎么会是 -1，你的调试器没问题？ 直接把值打印出来看呢[/quote] 我现在觉得可能是我写数据库的那段代码有问题 ，同样的代码写进sqlite中没有问题，但是写进mongodb中就有问题了

user: user-2
content: 引用 10 楼 jiangdianqin 的回复:引用 8 楼 adlay 的回复:FILE 是一个结构，你说的 -1 不晓得是指里面哪个成员为 -1？ 还是指针的值是 -1？是写入的char变量的值为-1 这... new 如果出错要么返回 NULL， 要么抛出异常，怎么会是 -1，你的调试器没问题？ 直接把值打印出来看呢

user: user-0
content: 引用 8 楼 adlay 的回复:FILE 是一个结构，你说的 -1 不晓得是指里面哪个成员为 -1？ 还是指针的值是 -1？是写入的char变量的值为-1

user: user-0
content: 引用 8 楼 adlay 的回复:FILE 是一个结构，你说的 -1 不晓得是指里面哪个成员为 -1？ 还是指针的值是 -1？指针的值为-1，所以存进去的就是-1

user: user-2
content: FILE 是一个结构，你说的 -1 不晓得是指里面哪个成员为 -1？ 还是指针的值是 -1？

user: user-0
content: 引用 4 楼 adlay 的回复:那把 error 变量打出来，看错误码是什么，对应什么样的错误信息哦 我在另一个数据库中 也写入了同样的操作 但是确实把图片写入了  而且ffile同样为-1 这是什么情况？

user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:ffile=new char[filesize]; size_t sz = fread(ffile,sizeof(char),filesize,fp);话说写入char字符数组的话不是还需要预留一个字节存放‘/0’吗？

user: user-1
content: ffile=new char[filesize]; size_t sz = fread(ffile,sizeof(char),filesize,fp);

user: user-2
content: 那把 error 变量打出来，看错误码是什么，对应什么样的错误信息

user: user-0
content: 引用 1 楼 adlay 的回复:文件名写错了， "F:/ceshi/iphoto.jpg" 改成 "F:\\ceshi\\iphoto.jpg" 事实上 我在做一个mongodb的东西，将图片文件插图数据库，但是他不支持直接将FILE插入，我就先将其转化为char类型，再插入，可是不知道什么原因，插入的ffile总是int32的值

user: user-0
content: 引用 1 楼 adlay 的回复:文件名写错了， "F:/ceshi/iphoto.jpg" 改成 "F:\\ceshi\\iphoto.jpg"改过来也不对，也是-1

user: user-2
content: 文件名写错了， "F:/ceshi/iphoto.jpg" 改成 "F:\\ceshi\\iphoto.jpg"

user: user-0
content: 引用 13 楼 zhao4zhong1 的回复:[quote=引用 6 楼 jiangdianqin 的回复:] [quote=引用 5 楼 zhao4zhong1 的回复:] ffile=new char[filesize]; size_t sz = fread(ffile,sizeof(char),filesize,fp);话说写入char字符数组的话不是还需要预留一个字节存放‘/0’吗？[/quote] jpg和asciiz没有关系。  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息…… [/quote]哦 这样啊 我研究了半天 发现应该与这段代码无关 与数据库写入的方式有关  谢谢赵老师了

user: user-3
content: 引用 13 楼 zhao4zhong1 的回复:[quote=引用 6 楼 jiangdianqin 的回复:] [quote=引用 5 楼 zhao4zhong1 的回复:] ffile=new char[filesize]; size_t sz = fread(ffile,sizeof(char),filesize,fp);话说写入char字符数组的话不是还需要预留一个字节存放‘/0’吗？[/quote] jpg和asciiz没有关系。  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息…… [/quote] 这个还是有用的

user: user-4
user-0 提问: popen和system都会让父进程等待子进程结束吗

回复:
user: user-1
content: 引用 6 楼 liupeng_wolf 的回复:用system执行脚本的时候，加上&，让脚本后台执行，这样system就可以立即返回了 引用 6 楼 liupeng_wolf 的回复:用system执行脚本的时候，加上&，让脚本后台执行，这样system就可以立即返回了   请问这种方法，system的返回值是多少呢？会一直返回0吗？

user: user-2
content: 用 fork + exec， 你不 wait 就不会等子进程结束，搜使用 fork 的代码很多吧

user: user-3
content: 那有类似代码吗？我看到网上的代码都是父进程等待子进程结束的

user: user-2
content: 用 fork + exec， system 这些函数内部也是用这两个系统调用来实现的

user: user-4
content: 用多线程试试

user: user-5
content: 用system执行脚本的时候，加上&，让脚本后台执行，这样system就可以立即返回了

user: user-6
content: 还可在线程中执行。  或者system中后台执行。

user: user-7
content: 引用 1 楼 adlay 的回复:用 fork + exec， system 这些函数内部也是用这两个系统调用来实现的 +1
user-0 提问: 基于C 的 一个API 包如何使用？

回复:
user: user-1
content: 根据我的经验，一般这种提供源代码，可以使用make（不是NMAKE）编译的，一般都是支持跨平台的。 如果你以前没研究过这种编译方式，最好还是找个熟悉的人来帮你。 总的来说： 1.它应该是可以在WINDOWS下跑的； 2.WINDOWS下，一般应该需要MinGW(Windows 下的GCC）支持。这些东西文档中应该包含有才对。 3.WINDOWS下默认不会有make这个工具，这个需要你自己搞定。  引用 6 楼 zhai__chi 的回复:[quote=引用 3 楼 super_admi 的回复:] 文档不是说了吗？ 分三步走： 1.下载好源代码做好准备； 2.运行配置脚本进行配置； 3.运行批处理工具进行编译（一般使用make)；  话说，一般这玩意都会直接有二进制程序提供吧？  您好！感谢您的回答。我对电脑是外行，是不是要下载个GCC什么的对这个软件configure？可不可以在windows下用这个软件?[/quote]

user: user-2
content: 这种开源的东西，最好的方式看文档（即使是英文，也要克服），一步步执行。 make的话，有cmake软件和linux下的make，看源码的支持方式，有的通过Cmake可以生成Windows下的工程，然后打开工程编译链接即可。

user: user-0
content: 引用 3 楼 super_admi 的回复:文档不是说了吗？ 分三步走： 1.下载好源代码做好准备； 2.运行配置脚本进行配置； 3.运行批处理工具进行编译（一般使用make)；  话说，一般这玩意都会直接有二进制程序提供吧？  您好！感谢您的回答。我对电脑是外行，是不是要下载个GCC什么的对这个软件configure？可不可以在windows下用这个软件?

user: user-3
content: lib库，引入lib库和相应的头文件就行了；linux下编译工程后引用头文件

user: user-4
content: 执行./configure 配置， make编译， 再make install 大部分的source都是这样的， 当然一般也会有binary提供， 可能是so加头文件。

user: user-1
content: 文档不是说了吗？ 分三步走： 1.下载好源代码做好准备； 2.运行配置脚本进行配置； 3.运行批处理工具进行编译（一般使用make)；  话说，一般这玩意都会直接有二进制程序提供吧？

user: user-5
content: 文档也想别人帮你翻译吗？

user: user-6
content: 看它的Documentation和Examples啊。。。http://multifario.sourceforge.net/
user-0 提问: 救助C语言需要N个数，但是要输入N+1个数之后按确定键才会执行下面的命令

回复:
user: user-0
content: 引用 2 楼 u011761982 的回复:[quote=引用 1 楼 lisong694767315 的回复:] scanf("%d ",&q.data[q.tail]);将输入格式%d后面的空格去掉，即改成"%d"  scanf("%d",&q.data[q.tail]);  加了空格表示什么意思？[/quote] 非常谢谢您了，这个大概是不小心打进去的，非常感谢您解决了我的疑惑。

user: user-1
content: 引用 1 楼 lisong694767315 的回复:scanf("%d ",&q.data[q.tail]);将输入格式%d后面的空格去掉，即改成"%d"  scanf("%d",&q.data[q.tail]); +1

user: user-2
content: 引用 2 楼 u011761982 的回复:[quote=引用 1 楼 lisong694767315 的回复:] scanf("%d ",&q.data[q.tail]);将输入格式%d后面的空格去掉，即改成"%d"  scanf("%d",&q.data[q.tail]);  加了空格表示什么意思？[/quote] 跳过输入后面的空白字符

user: user-3
content: 引用 1 楼 lisong694767315 的回复:scanf("%d ",&q.data[q.tail]);将输入格式%d后面的空格去掉，即改成"%d"  scanf("%d",&q.data[q.tail]);  加了空格表示什么意思？

user: user-4
content: scanf("%d ",&q.data[q.tail]);将输入格式%d后面的空格去掉，即改成"%d"  scanf("%d",&q.data[q.tail]);
user-0 提问: 在ubuntu终端 编译c程序之后  生成不了可执行文件。。

回复:
user: user-1
content: 引用 28 楼 u014262884 的回复:linux是没有exe(可执行文件的). 默认条件下, 只要没有后缀的程序它都把它视为可执行文件来处理没有后缀名的也可能是文本文件

user: user-2
content: linux是没有exe(可执行文件的). 默认条件下, 只要没有后缀的程序它都把它视为可执行文件来处理

user: user-3
content: 你加了-c？？？

user: user-0
content: 引用 24 楼 xzc29312 的回复:你加了-c？？？ 加-c干吗？不用加啊，-c是之编译不链接

user: user-0
content: 引用 23 楼 Dobzhansky 的回复:加个  -v 看看 -v  不是查勘gcc版本的么？

user: user-0
content: 引用 22 楼 lovesmiles 的回复:你这那里是运行不了，是输出的文件不知道到那里去了。指定输出路径试试看 怎么指定啊？有没有一劳永逸的方法？

user: user-4
content: 加个  -v 看看

user: user-0
content: 引用 3 楼 zmlovelx 的回复:gcc -c main.c -o main.o   这种是不能生成可执行文件的 直接gcc main.c就可以生成a.out不好意思  昨天没上，我这可能是终端的事  生成不了可执行文件  不管是gcc   main.c  还是gcc  -o  main   main.c都生成不了

user: user-0
content: 引用 2 楼 zjq9931 的回复:[quote=引用 楼主 leee7338 的回复:] 在ubuntu终端 编译c程序之后  生成不了可执行文件。。 编译之后，还要链接，才行。虽然我不知道ubuntu下怎么用链接，但编译之后肯定是要链接的。[/quote] 不好意思  昨天没上，我这可能是终端的事  生成不了可执行文件  不管是gcc   main.c  还是gcc  -o  main   main.c都生成不了

user: user-0
content: 引用 1 楼 lovesmiles 的回复:你是如何判断出它是不可执行的？另外这个代码有没有main函数？ 不好意思  昨天没上，我这可能是终端的事  生成不了可执行文件  不管是gcc   main.c  还是gcc  -o  main   main.c都生成不了

user: user-5
content: 你这那里是运行不了，是输出的文件不知道到那里去了。指定输出路径试试看

user: user-0
content: 引用 19 楼 lovesmiles 的回复:话说，你知道在Linux上面怎么运行程序吧？别这么小看我行么？ [zhang:~/hello]$gcc hello.c [zhang:~/hello]$ls hello.c [zhang:~/hello]$gcc hello.c -o hello [zhang:~/hello]$ls hello.c [zhang:~/hello]$

user: user-6
content: 是需要交叉编译吧！

user: user-5
content: 话说，你知道在Linux上面怎么运行程序吧？

user: user-5
content: 生成了什么新文件

user: user-0
content: 引用 16 楼 lovesmiles 的回复:[quote=引用 15 楼 leee7338 的回复:] [quote=引用 3 楼 zmlovelx 的回复:] gcc -c main.c -o main.o   这种是不能生成可执行文件的 直接gcc main.c就可以生成a.out不好意思  昨天没上，我这可能是终端的事  生成不了可执行文件  不管是gcc   main.c  还是gcc  -o  main   main.c都生成不了[/quote] 那生成了什么样的文件？生不成总得有个提示什么的吧？[/quote] 没有提示，gcc完就没变化

user: user-5
content: 引用 15 楼 leee7338 的回复:[quote=引用 3 楼 zmlovelx 的回复:] gcc -c main.c -o main.o   这种是不能生成可执行文件的 直接gcc main.c就可以生成a.out不好意思  昨天没上，我这可能是终端的事  生成不了可执行文件  不管是gcc   main.c  还是gcc  -o  main   main.c都生成不了[/quote] 那生成了什么样的文件？生不成总得有个提示什么的吧？

user: user-7
content: 引用 7 楼 zxh707wk 的回复:引用 4 楼 qq_18283689 的回复:承上，直接gcc main.c就可以生成a.out,如果不想用默认的a.out想自己定义，可以在gcc main.c后面加上-o main，形如：gcc main.c -o main .然后直接./main（注意是 " ./  "）就可以执行了+1，另外，如果没有指定输出路径的话，可执行文件默认生成在当前用户主目录里

user: user-8
content: 有人还错误地以为天下的可执行文件都带exe扩展名的。

user: user-9
content: 还有编译器,不会是交叉编译器吧...
user-0 提问: huffman编码问题，剑桥大学Julian Seward的Huffman解码程序

回复:
user: user-0
content: 我走了几遍，没看出来它跟原理有什 么关系，也跟一般的哈夫曼解码方式不一样，所以才拿出来，希望做过的前辈能帮忙指点一下

user: user-1
content: http://blog.csdn.net/ns_code/article/details/19174553 http://blog.csdn.net/abcjennifer/article/details/8020695

user: user-2
content: 引用 1 楼 god_vigoss 的回复:具体代码可以看这里http://www.newxing.com/S7D457EA44664/huffman.c 首先，需要明白huffman编码解码的原理，即，用自然语言来怎么表达。 然后，自己试着写一下伪代码，理清流程思路，再看代码就会相当的容易。 以上两点是否做到呢？

user: user-3
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。  参考相关博客、论文、……加厚”底子“也是弄懂代码的必做”前戏“！

user: user-0
content: 具体代码可以看这里http://www.newxing.com/S7D457EA44664/huffman.c
user-0 提问: 麻烦帮忙看下哪里有错！

回复:
user: user-0
content: 引用 1 楼 lisong694767315 的回复:你声明了一个str指针，又没有给它分配内存。输入的字符串存哪呢？？  应该给str分配内存：  char *str = (char*)malloc(20*sizeof(char));  // 分配20个char的内存  谢谢了，怪不得呢！

user: user-1
content: 引用 4 楼 Baoge_leopard 的回复:[quote=引用 楼主 pf4919501 的回复:] #include "stdio.h" #include "conio.h" main() {   int len;   char *str;   printf("please input a string:\n");   scanf("%s",str);   int length(char *p);   len=length(str);   printf("the string has %d characters.",len);   getch(); } int length(char *p) {   int n;   n=0;   while(*p!='\0')   {     n++;     p++;   }   return n; } 检查了几遍，也没找到哪里的问题，麻烦有人帮忙指正下！  还要在main（）上面声明int length(char *p)； main()前少了int[/quote] 给str分配内存

user: user-1
content: 引用 楼主 pf4919501 的回复:#include "stdio.h" #include "conio.h" main() {   int len;   char *str;   printf("please input a string:\n");   scanf("%s",str);   int length(char *p);   len=length(str);   printf("the string has %d characters.",len);   getch(); } int length(char *p) {   int n;   n=0;   while(*p!='\0')   {     n++;     p++;   }   return n; } 检查了几遍，也没找到哪里的问题，麻烦有人帮忙指正下！  还要在main（）上面声明int length(char *p)； main()前少了int

user: user-2
content: 楼上说的对~

user: user-3
content: #include "stdio.h" #include "conio.h" main() {                 int len; 		char str[100]; 		printf("please input a string:\n"); 		scanf("%s",str); 		len=length(str); 		printf("the string has %d characters.",len); 		getch(); } int length(char *p) {   int n;   n=0;   while(*p!='\0')   {     n++;     p++;   }   return n; }

user: user-4
content: 你声明了一个str指针，又没有给它分配内存。输入的字符串存哪呢？？  应该给str分配内存：  char *str = (char*)malloc(20*sizeof(char));  // 分配20个char的内存
user-0 提问: 跳马问题

回复:
user: user-0
content: 引用 12 楼 zxh707wk 的回复:路过，lz要结帖了。。。 谢谢，我想学习些调试技巧。

user: user-1
content: .....  解答的很好啊

user: user-2
content: 路过，lz要结帖了。。。

user: user-3
content: 引用 10 楼 livvve 的回复:[quote=引用 9 楼 zjq9931 的回复:] [quote=引用 8 楼 livvve 的回复:]  嗯。我题目没有看仔细。 蛮感谢你的，你怎么发现的错误的调试很久都没发现[/quote] 熟能生巧吧，多调试，似乎没有别的招。

user: user-0
content: 引用 9 楼 zjq9931 的回复:[quote=引用 8 楼 livvve 的回复:]  嗯。我题目没有看仔细。 蛮感谢你的，你怎么发现的错误的调试很久都没发现

user: user-3
content: 引用 8 楼 livvve 的回复:[quote=引用 5 楼 zjq9931 的回复:] [quote=引用 3楼 livvve 的回复:] 恩恩，感觉思想是不是出了问题，做出来告诉我一下 已经改好。[/quote] 谢谢，t3&&t4,不然运行结果是马跳到（8，0）::(8,4)了。[/quote] 嗯。我题目没有看仔细。

user: user-0
content: 引用 5 楼 zjq9931 的回复:[quote=引用 3楼 livvve 的回复:] 恩恩，感觉思想是不是出了问题，做出来告诉我一下 已经改好。[/quote] 谢谢，t3&&t4,不然运行结果是马跳到（8，0）::(8,4)了。

user: user-0
content: 马跳日时好像不需要输入的，不过您说的其他溢出蛮有用

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

user: user-3
content: 引用 3 楼 livvve 的回复:恩恩，感觉思想是不是出了问题，做出来告诉我一下 已经改好。

user: user-3
content: 改好了。  #include<iostream> using namespace std;   const int TARGET_X=8; const int TARGET_Y=4; const int MAXSTEP=100;   int Num; int path[MAXSTEP+1][2]; int dx[]={0,1,2,2,1}; int dy[]={0,2,1,-1,-2}; int mk[9];   void jump(int x,int y,int step) { 	int k,i; 	int t1,t2,t3,t4; 	int x1,y1;  	for(k=1;k<=4;k=k+1) 	{ 		x1=x+dx[k]; 		y1=y+dy[k]; 		if(x1>TARGET_X || y1>TARGET_Y) 			continue; 		t1=(x1>=0) && (x1<=TARGET_X); 		t2=(y1>=0) && (y1<=TARGET_Y); 		t3=(x1==TARGET_X) && (y1!=TARGET_Y); 		t4=(x1==TARGET_X) && (y1==TARGET_Y); 		if( (t1) && (t2) ) 		{ 			path[step][0]=x1; 			path[step][1]=y1; 			mk[step]=k; 			if(t4 || t3)			//t3也是算的 			{ 				Num=Num+1; 				cout<<"方案："<<Num<<":"; 				for(i=0;i<=step;i++) 				{ 					cout<<"("<<path[i][0]<<","<<path[i][1]<<")";	//path[i][i]，改为path[i][1]，这里是引起输出结果错误的地方。 				} 				cout<<"\n"; 			} 			else 			{   				jump(x1,y1,step+1); 			} 		} 	} } int main(int argc, char* argv[]) { 	mk[0]=0; 	Num=0; 	path[0][0]=0; 	path[0][1]=0; 	jump(0,0,1); 	cout<<"总方案数："<<Num<<endl; 	return 0; }

user: user-0
content: 恩恩，感觉思想是不是出了问题，做出来告诉我一下

user: user-3
content: 还有一部分是1,2--2,3这个跳的就有问题了。

user: user-3
content: 还没有仔细看程序，不过你的结果似乎有点怪，都结束在（8,0）
user-0 提问: 一道compile error题 (POJ 1002)

回复:
user: user-0
content: 引用 8 楼 lovesmiles 的回复:typedef int (*func)(const void*, const void*); qsort(ph,nph,9,(func)strcmp);//强制类型转换 在CPP中编译成功了。谢谢！

user: user-0
content: 引用 6 楼 gojoy_x13 的回复:这个不知道，可以跟一下头文件，觉得像是dev-c的头文件有问题。第一个在dev-c里也能编过吗 两个在devcpp里都编译不通过。但是示例程序能AC

user: user-1
content: #include<stdio.h> #include<stdlib.h> #include<string.h>  char ph[100000][9], buf[1000]; char map[26]={'2','2','2','3','3','3','4','4','4','5','5','5','6', 	'6','6','7',0,'7','7','8','8','8','9','9','9',0};  int nph; int main(){ 	int i, j; 	int x=1,z=0; 	memset(ph, 0, sizeof(ph)); 	scanf("%d", &nph);  	for(i=0; i<nph; i++){ 		int x = 0; 		scanf("%s", buf);  		for(j=0; buf[j]; j++) { 			if(buf[j]=='-') continue; 			if((buf[j]>='A'&&buf[j]<'Z')|| 				(buf[j]>=0&&buf[j]<=9)) 				buf[j]=map[buf[j]-'A']; 			ph[i][x++]=buf[j]; 			if(x==3) ph[i][x++]='-'; 		} 	} 	qsort(ph,nph,9, strcmp);  	x = 1; 	z = 0;  	for(i=1;i<nph;++i){ 		if(strcmp(ph[i-1],ph[i])){ 			if(x>1)    {    				printf("%s %d\n",ph[i-1],x); 				z=1; 			} 			x=1; 		} 		else x++; 	} 	if(x>1){ 		printf("%s %d\n",ph[i-1],x); 		z=1; 	} 	if(!z)  printf("No duplicates.\n"); }  具体代码意思不懂，c里面的变量申明放在 代码块首。

user: user-2
content: scanf(" %s",&buf);  // 这里不应该用& 用gcc编译通过，不过关于qsort和strcmp有个warning

user: user-2
content: 引用 1 楼 brookmill 的回复:#include string.h要放到stdlib.h前面 不对，不是这个问题，刚才糊涂了

user: user-3
content: typedef int (*func)(const void*, const void*); qsort(ph,nph,9(,func)strcmp);//强制类型转换

user: user-2
content: 应该是qsort参数类型的问题。qsort函数声明里面，最后一个参数应该是int (*)(const void*, const void*)，但是strcmp是int (__attribute__((__cdecl__)) *)(const char*, const char*) 用gcc编译有个警告，Dev-cpp 5.6.1就不知道了。

user: user-1
content: 这个不知道，可以跟一下头文件，觉得像是dev-c的头文件有问题。第一个在dev-c里也能编过吗

user: user-0
content: 应该是scanf("%s",&buf)那一句不该加&号了。还有一个问题，就是为什么在Dev-cpp 5.6.1环境中编译会提示strcmp那一行出现下列错误？ [Error] invalid conversion from 'int (__attribute__((__cdecl__)) *)(const char*, const char*)' to 'int (*)(const void*, const void*)' [-fpermissive]

user: user-2
content: #include string.h要放到stdlib.h前面
user-0 提问: 为什么scanf()输入已声明长度字符串数组时，可以超过定义的长度呢？

回复:
user: user-0
content: 引用 7 楼 modyaj 的回复:[quote=引用 4 楼 sinat_19278443 的回复:] [quote=引用 1 楼 modyaj 的回复:] 先看看scanf 的第二个参数   再看看printf输出字符串的方式 估计就知道了 还是木有清楚[/quote] 第二个参数说明  你操作的是一个内存地址  你在地址上写入的数据超过你你原本计划的大小  对于系统还说 她根本不知道 举个简单的例子：你要在本子上写一行字 你说你写入的是8个字  我现在告诉你   你可以从本子的第二行的第一个位置开始写  结果你写了10个字 作为本子  它哪里会知道你写的10字有问题啊！如果你运气不好 ，刚好写第九个或者第十个字的时候那个位置本子上已经有字了  那么你写了后影响别人（因为你给人家覆盖了嘛）。不知道怎么说恰当不？ 同样的  输出函数 从某个地址开始输出，直到遇到结束符才停止！因为你连续输入的字符里面没有结束符 所以都给你输出来了，至于什么时候遇到结束符 那要看运气了（所以有可能会多输出一些意外的字符）[/quote] 懂了懂了

user: user-1
content: 其实电脑开机后物理内存的每个字节都是可读写的，区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。 #include<stdio.h> int main(void){     char mytal[8];        //已经申明长度为8     scanf("%7s",mytal);     printf("%s\n",mytal);     return 0; }

user: user-2
content: 引用 4 楼 sinat_19278443 的回复:[quote=引用 1 楼 modyaj 的回复:] 先看看scanf 的第二个参数   再看看printf输出字符串的方式 估计就知道了 还是木有清楚[/quote] 第二个参数说明  你操作的是一个内存地址  你在地址上写入的数据超过你你原本计划的大小  对于系统还说 她根本不知道 举个简单的例子：你要在本子上写一行字 你说你写入的是8个字  我现在告诉你   你可以从本子的第二行的第一个位置开始写  结果你写了10个字 作为本子  它哪里会知道你写的10字有问题啊！如果你运气不好 ，刚好写第九个或者第十个字的时候那个位置本子上已经有字了  那么你写了后影响别人（因为你给人家覆盖了嘛）。不知道怎么说恰当不？ 同样的  输出函数 从某个地址开始输出，直到遇到结束符才停止！因为你连续输入的字符里面没有结束符 所以都给你输出来了，至于什么时候遇到结束符 那要看运气了（所以有可能会多输出一些意外的字符）

user: user-0
content: 引用 5 楼 zjq9931 的回复:[quote=引用 楼主 sinat_19278443 的回复:] 代码： #include<stdio.h> int main(void){     const char mytal[8];        //已经申明长度为8     scanf("%s",mytal);     printf("%s\n",mytal);     return 0; } 运行结果：  输入了10个字符，超过了8个了，也显示了10个，不应该只显示7个吗？ 求解答 不少黑客的攻击就是利用这个导致越界，然后入侵系统的。[/quote] 这么厉害啊，学习了 万分感谢！！

user: user-3
content: 引用 楼主 sinat_19278443 的回复:代码： #include<stdio.h> int main(void){     const char mytal[8];        //已经申明长度为8     scanf("%s",mytal);     printf("%s\n",mytal);     return 0; } 运行结果：  输入了10个字符，超过了8个了，也显示了10个，不应该只显示7个吗？ 求解答 不少黑客的攻击就是利用这个导致越界，然后入侵系统的。

user: user-0
content: 引用 1 楼 modyaj 的回复:先看看scanf 的第二个参数   再看看printf输出字符串的方式 估计就知道了 还是木有清楚

user: user-3
content: 引用 楼主 sinat_19278443 的回复:代码： #include<stdio.h> int main(void){     const char mytal[8];        //已经申明长度为8     scanf("%s",mytal);     printf("%s\n",mytal);     return 0; } 运行结果：  输入了10个字符，超过了8个了，也显示了10个，不应该只显示7个吗？ 求解答 C语言是不会检查越界行为的，这个需要自己控制。 所以要小心。

user: user-4
content: 正常,mytal[7]里面本来放的是'\0',你这样输入之后将mytal[7]改成了'8',而printf输出的时候要一直要遇到'\0'才停止的.

user: user-2
content: 先看看scanf 的第二个参数   再看看printf输出字符串的方式 估计就知道了

user: user-5
content: 引用 3 楼 zjq9931 的回复:C语言是不会检查越界行为的，这个需要自己控制。 所以要小心。+1
user-0 提问: 关于指针输出字符串

回复:
user: user-1
content: 还能再基础点吗

user: user-2
content: 指针只能存字符串的地址，而不能存字符串

user: user-3
content: 你那样写只是声明了个指针变量，没有实际的数据存储空间，new一下或者malloc一下才行

user: user-4
content: 楼上们的都是正解！

user: user-0
content: 引用 3 楼 Intel0011 的回复:char *string; -->只分配了指针变量string的内存 #include <stdio.h> int main(void) {     char *string;     string = malloc(sizoef(char) * 80); //使string指向分配的内存     scanf("%s",string);     printf("\n%s\n",*string);     free(strng); //释放之前分配的内存     return 0; }[/quote  [quote=引用 2 楼 u012421456 的回复:] 字符串可以表达为char*的形式	  但是char*不一定是字符串	 char*本意是指向字符的指针，可能指向的是字符 的数组（就像int*一样）	  只有它所指的字符数组有结尾的\0，才能说它 所指的是字符串没有用。

user: user-5
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。  其实电脑开机后物理内存的每个字节都是可读写的，区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。

user: user-6
content: 使用指针前要初始化。初始化来源可以是栈地址、堆地址或者全局变量的那个地址。

user: user-7
content: 补充一点，如果输入的里面有各种字符建议用gets，不用scanf("%s", &str);

user: user-7
content: 引用 楼主 chlth007 的回复:#include <stdio.h> main() { 	char *string; 	scanf("%s",string); 	printf("\n%s\n",*string); } 运行后如图所示  指针没有分配内存空间。 在scanf前加上： string = (char*)malloc(1024);

user: user-8
content: char *str =  (char*)malloc( 256*sizeof(char) ); 	memset(str,0,256*sizeof(char)); 	scanf("%s",str);  	printf("%s",str); 	free(str);

user: user-9
content: char *string; -->只分配了指针变量string的内存 #include <stdio.h> int main(void) {     char *string;     string = malloc(sizoef(char) * 80); //使string指向分配的内存     scanf("%s",string);     printf("\n%s\n",*string);     free(strng); //释放之前分配的内存     return 0; }

user: user-10
content: 字符串可以表达为char*的形式	  但是char*不一定是字符串	 char*本意是指向字符的指针，可能指向的是字符 的数组（就像int*一样）	  只有它所指的字符数组有结尾的\0，才能说它 所指的是字符串

user: user-0
content: 把第六行的*去掉还是一样

user: user-11
content: 程序中只定义了一个char *的指针变量string， 是没有空间来存储所输入的字符串的， 可以修改成这样：  int main(int argc, char *argv[]) {     char *string = NULL;     char str[128]={0};     /*定义一个数组，并进行初始化*/      string = str;     scanf("%s", string);     printf("the string is: %s !\n", string);     return 0; }
user-0 提问: 关于预编译的问题

回复:
user: user-0
content: 用“gcc -dM -E test.c”测试了下输出，发现使用-std=c++0x的时候，是没有linux宏定义的，而不加-std=c++0x的时候，是有的。 看来是c++11给改了。  感谢各位。

user: user-0
content: 引用 3 楼 lisong694767315 的回复:在ANSI标准确定前，类似unix和vax这样的符号被用做在编译时确定目标平台。那时还没有C语言的官方标准。所以对变量的使用没有通用规则，编译器的作者们通常会在编译器的实现中使用unix, linux这些作为预定义宏的符号，并假定开发者在自己的代码中会避开它们。  1989年ANSI C标准出台后，限制了编译器对符号的使用，编译器中预定义宏的符号只能以两个下划线开头，或者一个下划线后紧接着大写字母。于是，那些默认使用旧预定义符号（例如unix、linux）的编译器就变得不合法了，GCC就是其中之一（最早一版的GCC是1987年发布的）。在编译器的实现中，它将linux当成1。  不过，通过类似gcc/g++ -std=c++11，可以让GCC遵循新规范。 我编译的时候 加了-std=c++0x

user: user-1
content: 在ANSI标准确定前，类似unix和vax这样的符号被用做在编译时确定目标平台。那时还没有C语言的官方标准。所以对变量的使用没有通用规则，编译器的作者们通常会在编译器的实现中使用unix, linux这些作为预定义宏的符号，并假定开发者在自己的代码中会避开它们。  1989年ANSI C标准出台后，限制了编译器对符号的使用，编译器中预定义宏的符号只能以两个下划线开头，或者一个下划线后紧接着大写字母。于是，那些默认使用旧预定义符号（例如unix、linux）的编译器就变得不合法了，GCC就是其中之一（最早一版的GCC是1987年发布的）。在编译器的实现中，它将linux当成1。  不过，通过类似gcc/g++ -std=c++11，可以让GCC遵循新规范。

user: user-2

user: user-3
content: 先创建一个空文件test.c $ touch test.c $ gcc -dM -E test.c
user-0 提问: c语言全局指针变量释放问题

回复:
user: user-1
content: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括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-1
content: 其实电脑开机后物理内存的每个字节都是可读写的，区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。

user: user-1
content: 栈中的基本变量退出其作用域时，没有谁执行一段代码去释放/销毁/析构它所占用的内存，仅仅是没人再去理会的留在当前栈顶上方的若干遗留下来可被后续压栈操作覆盖的无用数据而已。 而栈中的类变量退出其作用域时，会自动执行其析构函数，……

user: user-2
content: 执行那个函数后，两点 i保存了a数组的地址，直到程序执行结束  但是a数组本身会在函数执行完成后释放自己的内存

user: user-3
content: 程序运行结束，什么都没了，全部销毁。 即使你new的没有delete，程序结束也会被OS收回。

user: user-4
content: 引用 楼主 beiyuexianren 的回复:这个运行结束之后肯定是要释放b[6]所占的内存的，但是是否释放a[5]呢？ a[5]也和其他局部变量一样，也是要释放的。

user: user-4
content: 引用 楼主 beiyuexianren 的回复:如果释放，那么i将来若在别的地方使用，则i所指的值可能会错误 完全正确。aa返回之后，a的地址不再有效，使用i有可能出问题。这是一个常见的错误。有时候编译器会有警告的。 结论：不要在函数返回之后使用局部变量的地址。
user-0 提问: 这个代码错在哪里？

回复:
user: user-1
content: 不要在函数里面包含头文件

user: user-1
content: #if defined(linux) #include<stdio.h> #endif  int main() {   #if defined(linux)     printf("hello"); #endif       return 0;   }

user: user-0
content: 在centos下面跑
user-0 提问: 老问题，关于for里面关于打印i的问题

回复:
user: user-1
content: 引用 24 楼 fxbszj 的回复:[quote=引用 23 楼 misskissC 的回复:] C++里面++i比i++高效； C里无区别。 为什么在C语言里没有区别[/quote]   用一个变量，

user: user-1
content: 引用 24 楼 fxbszj 的回复:[quote=引用 23 楼 misskissC 的回复:] C++里面++i比i++高效； C里无区别。 为什么在C语言里没有区别[/quote]   gcc  -g  double_plus.c  -o double_plus objdump -dS double_plus   不知道这样可不可以说明这个...

user: user-2
content: 引用 23 楼 misskissC 的回复:C++里面++i比i++高效； C里无区别。 为什么在C语言里没有区别

user: user-1
content: C++里面++i比i++高效； C里无区别。

user: user-1
content: 所以运行结果是这样的：

user: user-3
content: 在for里面没区别 不用分析

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-5
content: i++ 和 ++i 副作用完全一样 而这里只用到了 题目的副作用 所以没有区别

user: user-5
content: 引用 3 楼 u012501633 的回复:C/C++语言定义（语言的参考手册）明确定义了顺序点的概念。顺序点位于： 1. 每个完整表达式结束时。完整表达式包括变量初始化表达式，表达式语句，return语句的表达式，以及条件、循环和switch语句的控制表达式（for头部有三个控制表达式）； for里面没有顺序点，那打印的结果是不是意味着可能是0-9也可能是1-10呢？ for 成吨的序列点 你怎么会觉得for 没序列点呢

user: user-6
content: 引用 7 楼 Baoge_leopard 的回复:结果一样，只是前置加加效率比后置加加效率高一点 这是何解？？

user: user-7
content: 引用 5 楼 u012501633 的回复:[quote=引用 2 楼 lisong694767315 的回复:] 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9  C/C++语言定义（语言的参考手册）明确定义了顺序点的概念。顺序点位于： 1. 每个完整表达式结束时。完整表达式包括变量初始化表达式，表达式语句，return语句的表达式，以及条件、循环和switch语句的控制表达式（for头部有三个控制表达式）； [/quote]  for的执行顺序是一定的  for（A ; B ; C) {   D; }  它的执行顺序就是 A； B; D; C; A; B; D; C; .... 如果B为假就跳出。 你把你的函数带入上面看看会不会有区别。 只不过是C一个是i++一个是++i 对于一个单独的语句这两个的结果没有区别。

user: user-8
content: 引用 9 楼 qq_16696537 的回复:[quote=引用 7 楼 Baoge_leopard 的回复:] 结果一样，只是前置加加效率比后置加加效率高一点 这是何解？？[/quote]   i++和++i的不同

user: user-9
content: 没有区别的！ 他们两个相当于~ int i = 0; for(;i<10;){   printf("%d'n", i);  ++i;     //  a } 单独一条语句 前++ 和 后++ 没有任何区别！ int i = 10; int a = i++; int b = ++i; 结果就是 a = 10, i = 12, b = 12; 就是这种用法 ~~~

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

user: user-4
content: 引用 15 楼 u011362822 的回复:打印结果没区别，不过效率就有点区别了，++i 比 i++ 效率高点。 因为在i++情况下，编译器会用一个临时变量保存i的值，而++i就不会。 不过现在的很多编译器会优化，使这两种用法效率没区别。 详见：http://stackoverflow.com/questions/24886/is-there-a-performance-difference-between-i-and-i-in-c 对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！

user: user-10
content: 打印结果没区别，不过效率就有点区别了，++i 比 i++ 效率高点。 因为在i++情况下，编译器会用一个临时变量保存i的值，而++i就不会。 不过现在的很多编译器会优化，使这两种用法效率没区别。 详见：http://stackoverflow.com/questions/24886/is-there-a-performance-difference-between-i-and-i-in-c

user: user-11
content: 调试跟踪可以解开你的疑问，实在不行看汇编代码。真正能搞明白，确实得如赵老师说的那样。

user: user-12
content: 打印结果没有区别，但是，眼里看见的有区别。

user: user-8
content: 结果一样，只是前置加加效率比后置加加效率高一点

user: user-13
content: 引用 5 楼 u012501633 的回复: 可怜的娃，你是怎么了
user-0 提问: 关于归并排序的问题

回复:
user: user-1
content: 问题是不是出现在这一句？tmp = (int *) malloc((high - low) * sizeof(int)); 假设 high =2 ；low =1 ；实际上你只申请了4字节内存，事实上应该申请 2*int 内存。

user: user-0
content: 谢谢各位了，我知道问题怎么解决了

user: user-2
content: 谢邀，有人解答了，我就围观吧，大脑有些不想动了。。。

user: user-3
content: 我以前写的，你可以参考一下：  #include"stdio.h" #include"stdlib.h"  int *B;  // 全局的临时数组 void Merge_Array(int A[], int low, int mid, int high)   {       int i, j, k;   	for(k=low; k<=high; ++k)           B[k] = A[k];             // 将A中所有元素复制到B       for(i=low,j=mid+1,k=i; i<=mid&&j<=high; ++k)       {           if(B[i] <= B[j])      // 比较B的左右两段序列中的元素               A[k] = B[i++];    // 将较小值复制到A中           else               A[k] = B[j++];       }       while(i<=mid)  A[k++] = B[i++];   // 若第一个表未检测完，复制       while(j<=high) A[k++] = B[j++];   // 若第二个表未检测完，复制 }      void Merge_Sort(int A[], int low, int high)   {       if(low < high)       {           int mid = (low + high)/2;           Merge_Sort(A, low, mid);       // 对左侧子序列进行递归排序           Merge_Sort(A, mid+1, high);    // 对右侧子序列进行递归排序           Merge_Array(A, low, mid, high);     // 归并       }   }   int main() { 	int i; 	int A[9] = {1,5,4,3,7,2,6,8,0};  // 待排序数组 	B = (int*)malloc(9*sizeof(int)); // 分配空间  	/*输出排序前数组*/ 	printf("The squence of numbers:\n"); 	for(i=0; i<9; ++i) 		printf("%d ", A[i]); 	printf("\n");  	/*输出排序后数组*/ 	Merge_Sort(A, 0, 8); 	printf("The sorted data is:\n"); 	for(i=0; i<9; ++i) 		printf("%d ", A[i]); 	printf("\n");  	return 0; }

user: user-4
content: 虽然不知道，还是顶一下

user: user-0
content: 问题出在 Merge_Sort 中 Merge_Sort(A, low, mid); Merge_Sort(A, mid+1, high); 这两条语句中。在运行时取不到 mid 不知道如何改是好
user-0 提问: 一道笔试题

回复:
user: user-1
content: #include<stdio.h>  int main(int  argc, char  *argv[]) { 	int a[5]={1,2,3,4,5}; 	int *p = a; 	 	//*(p++) += 100;  	*(++p) += 100;  	 	printf("%d,%d,%d", *p, *(p+1), *(p+2)); 	return 0; }     把题目变一下

user: user-2
content: 简单的指针题啊，直接234

user: user-3
content: 引用 楼主 hotdog008 的回复:int a[5]={1,2,3,4,5}; int *p = a;  *(p++) += 100;  printf("%d,%d,%d", *p, *(p+1), *(p+2));  输出结果？  234

user: user-4
content: 学习了，谢谢楼主分享。

user: user-5
content: 直接在草稿纸上演算不就可以了吗

user: user-6
content: 笔试搞完可以自己拿编译器调试测试啊

user: user-7
content: 输出结果：2,3,4  *(p++) += 100;这一句等同于下面两句：  *p += 100; p++;   即先将a[0]加100，然后地址加1。所以*p, *(p+1), *(p+2)输出的是a[1], a[2], a[3]
user-0 提问: 写了一个蛋疼的排序程序，请大家看来吐槽一下提出一点建议或问题

回复:
user: user-1
content: 各种排序算法动画演示http://www.webhek.com/misc/comparison-sort/  ＜1000个元素，冒泡排序 ＜100000个元素，qsort函数 ＜10000000个元素，放数据库中，建索引，（B+树排序） ≥10000000个元素，没用到过。

user: user-2
content: 顺便~~发代码是可以使用代码格式的。

user: user-2
content: 这是按你的思路写的：  #include <stdio.h> #include <malloc.h>  #define SIZEOFINT sizeof(int) #define DATAFLAGS 1008611  void mysort(int *data_array, int len_array);  int main(void) { 	int len_array=0, i; 	int *data_array = NULL;  	printf("输入数组长度："); 	while(!scanf("%d", &len_array) || len_array < 0){ 		printf("数组长度只能是大于0的正整数\n"); 		printf("输入数组长度："); 	}  	data_array = (int *)calloc(len_array, SIZEOFINT);  	printf("输入数组中的数据：\n"); 	for(i=0; i<len_array; ++i){ 		scanf("%d", &data_array[i]); 	}  	mysort(data_array, len_array);  	printf("从小到大排序结果：\n"); 	for(i=0; i<len_array; ++i){ 		printf("%d  ", data_array[i]); 	}  	return 0; }  void mysort(int *data_array, int len_array) { 	int i, j, ps; 	int *temp_array = NULL;  	temp_array = (int *)calloc(len_array, SIZEOFINT);  	for(i=0; i<len_array; ++i) 	{ 		temp_array[i] = DATAFLAGS; 		for(j=0; j<len_array; ++j) 		{ 			if(temp_array[i] > data_array[j]) 			{ 				temp_array[i] = data_array[j]; 				ps = j; 			} 		} 		data_array[ps] = DATAFLAGS; 	} 	for(i=0; i<len_array; ++i){ 		data_array[i] = temp_array[i]; 	} 	free(temp_array); }

user: user-3
content: 新人，打酱油，路过……

user: user-4

user: user-5
content: 引用 6 楼 zhao4zhong1 的回复:各种排序算法动画演示http://www.webhek.com/misc/comparison-sort/  ＜1000个元素，冒泡排序 ＜100000个元素，qsort函数 ＜10000000个元素，放数据库中，建索引，（B+树排序） ≥10000000个元素，没用到过。

user: user-6
content: lz你想用这个程序实现什么功能呢？

user: user-7
content: 引用 1 楼 maple_LE 的回复:我的思路是先撸出数组最小值，然后把最小值放入到临时数组，再撸出剩下的数组最小值，再按顺序放入到临时数组，最后临时数组填满了，同时也是有序的，再把临时数组的数据写回到原数组 时间复杂度和空间复杂度疑似有点高  你这个思路跟简单选择排序有点像，但简单选择排序不需要临时数组。  简单选择排序的算法思想很简单，假设序列为L[n]，第i趟排序即从L[i...n]中选择关键字最小的元素与L(i)交换，每一趟排序可以确定一个元素的最终位置。经过n-1趟排序就可以使得序列有序了。   void SelectedSort(int A[], int n)   {       for(int i=0; i<n-1; ++i)  // 一共进行n-1趟       {           int minPos = i;  // 记录最小元素的位置              for(int j=i+1; j<n; ++j)               if(A[j] < A[minPos])                   minPos = j;              if(minPos != i)  // 与第i个位置交换           {               int tmp = A[i];             A[i] = A[minPos];             A[minPos] = tmp;         }       }   }

user: user-0
content: 我的思路是先撸出数组最小值，然后把最小值放入到临时数组，再撸出剩下的数组最小值，再按顺序放入到临时数组，最后临时数组填满了，同时也是有序的，再把临时数组的数据写回到原数组 时间复杂度和空间复杂度疑似有点高
user-0 提问: 请教关于SMTP发html内嵌图片邮件的问题：Hotmail、iclould等邮箱不能正常显示图片。。

回复:
user: user-0
content: 求解答

user: user-1
content: 试试你的html部分Content-Transfer-Encoding:quoted-printable改成Content-Transfer-Encoding:8bit，quoted-printable编码的话，不可打印的ascii变成=XX，原=号变=3D，就像你说在foxmail看到的那个样子...

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:将=3D"全部替换为="  哪个是能正常显示图片的邮件源码。。。我自己的是没有3D的

user: user-2
content: 将=3D"全部替换为="

user: user-0
content: 引用 1 楼 lovesmiles 的回复:我觉得你这个问题应该移到web前端开发那边。 额，以前没来过这里，不知道这里的版块怎么分。。我程序是用C语言写的。。所以在这里问了，哈哈

user: user-3
content: 我觉得你这个问题应该移到web前端开发那边。
user-0 提问: 小白程序问题，希望大牛解答！！

回复:
user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 给力

user: user-1
content: 引用 4 楼 zhao4zhong1 的回复:在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。+1

user: user-2
content: 把getchar();getchar();换成 while(getchar()!='\n') continue;试试

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

user: user-0
content: 引用 1 楼 user-4 的回复:输入缓存区，你输入的时候回车没处理那我应该怎么做呢，怎么修改程序啊？？

user: user-0
content: 那我应该怎么做呢，怎么修改程序啊？？

user: user-4
content: 输入缓存区，你输入的时候回车没处理
user-0 提问: MFC编程 驱动备份需要备份那些文件

回复:
user: user-0
content: 我一直认为的是获取[SourceDisksFiles]节下的文件名称，但是rtvienna.dat=222，这个222是什么意思？表示的是路径吗？如果不是那么是什么？

user: user-0
content: 希望各位大神帮忙讲一下
user-0 提问: devc++5.6.1  项目编译问题

回复:
user: user-1
content: 你试着把max函数的函数体放到main函数的下边，看会报错吗？如果还报错，那可能是devc++没装好

user: user-0
content: 我把原来包括main函数的main.c   该成了max1.c   编译  错误里的显示 也换成了  max.o

user: user-0
content: 都是新建的项目  先建项目然后在项目下新建的.c

user: user-2
content: 没把两个文件添加到同一个项目中？

user: user-0
content: 点击错误  会出现一个新的文本  看不懂啊

user: user-3
content: 关于mingw工具链的配置有问题吧，你看makefile里LIBS INCS CXXINCX等都显示啥路径来的？

user: user-0
content: 你也看翁凯的视频？？ 我今天下了个VC用

user: user-1
content: 引用 6 楼 wu13623558890 的回复:恩  还是会报错  看来是devc++没弄好  可是其他的功能都能用 就项目不能用   是不是哪的设置有问题？ 那可以从新找个dev c++安装，也可以用C-Free，翁恺不是说都行吗？这儿是地址，我装的就是这个，你要是愿意可以装这个——http://download.csdn.net/detail/u012421456/7374337

user: user-4
content: 直接用#include ""包含不好吗

user: user-0
content: 还是不行啊 急死了

user: user-2
content: 将函数max改名为mymax再试试。

user: user-0
content: 恩  还是会报错  看来是devc++没弄好  可是其他的功能都能用 就项目不能用   是不是哪的设置有问题？
user-0 提问: 怎样用c在桌面上显示图片

回复:
user: user-1
content: readbmp

user: user-0
content: 引用 5 楼 u012421456 的回复:你想怎么显示，是替换背景还是什么？能否再详细描述一下你的问题 就是像圣诞树程序一样，打开程序就会在桌面上显示一张圣诞树的小图片

user: user-2

user: user-3
content: 你想怎么显示，是替换背景还是什么？能否再详细描述一下你的问题

user: user-4
content: 直接把桌面的图替换掉。

user: user-5
content: GetDesktopWindow GetDC LoadImage CreateCompatibleDC GetObject SelectObject BitBlt DeleteDC DeleteObject ReleaseDC

user: user-6
content: windows程序设计。用winapi实现。

user: user-7
content: 引用 楼主 u012852836 的回复:ＲＴ怎样用c在桌面上显示图片 你说的是不是改变桌面背景？如果是： 我曾经也有这样的疑问。其实这是windows编程了。 方法我知道的有两种。 第一种：找到桌面图片在硬盘的上的位置，替换掉。（这中间会有在使用中的图片，不可修改之类的问题，网上有解决办法） 第二种：搜索更改桌面背景的编程方法，会有很多。  如果不是：那么，C语言，C++语言，没有提供图形接口。我们需要用系统提供的图形接口，比如windows提供的编程接口window.h。TC提供的graphic.h，还有opengl提供的编程接口。等等
user-0 提问: windows API函数编程疑问？

回复:
user: user-1
content: 可参考win2000泄露代码或reactos代码

user: user-2
content: windows只有很少的函数代码是开源的，大多数目前还都看不到源代码

user: user-3
content: http://download.csdn.net/detail/qbgao/3900524

user: user-4
content: 引用 3 楼 Cnwanglin 的回复:问题一：windows的API函数主要是c语言写的，那么VC6.0中如何查看一个API的函数体?    看不到,windows API不是开源的,开源还得了,windows 更容易被攻击了    问题二：<windef.h>头文件中                  typedef BYTE far            *LPBYTE;                  typedef WORD near           *PWORD;        这两条语句分别是什么意思？   特别是 “far” ,"near" 在这是什么意思？  far 是C/C++语言在16位系统中用以标明指针是个远指针的修饰符，在32位系统已经废除不用了。远指针是说指针所指向的地址已经超出了64K（2的十六次方），所以需要使用DS加偏移量的方法来寻址，而不能直接寻址。其反义的修饰符是near，举例：       int far *fptr;             fptr=(int far*)0xb0000000;  16位PC机的存储器地址是由段地址和偏移地址组合而成，每一段不能超过64k字节地址，因而同一个段内的地址存取，用偏移地址就可以实现，因段地址寄存器所存的段地址是不变的。当用指针时，只16位就够了，这一类就是near指针。当要在另一个段内取数据，就要跨越段，即要指明存取段的段地址和偏移地址，这时段地址寄存器所存段地址要改变，在使用指针指向另一个段内地址时，就要用32位表示，就是far指针了。由此可见，如果你想写在Win16上也能运行的程序，才会涉及到newr、far指针的概念。在Win32上，指针已无near、far的区分。领教了

user: user-5
content: 问题一：windows的API函数主要是c语言写的，那么VC6.0中如何查看一个API的函数体?    看不到,windows API不是开源的,开源还得了,windows 更容易被攻击了    问题二：<windef.h>头文件中                  typedef BYTE far            *LPBYTE;                  typedef WORD near           *PWORD;        这两条语句分别是什么意思？   特别是 “far” ,"near" 在这是什么意思？  far 是C/C++语言在16位系统中用以标明指针是个远指针的修饰符，在32位系统已经废除不用了。远指针是说指针所指向的地址已经超出了64K（2的十六次方），所以需要使用DS加偏移量的方法来寻址，而不能直接寻址。其反义的修饰符是near，举例：       int far *fptr;             fptr=(int far*)0xb0000000;  16位PC机的存储器地址是由段地址和偏移地址组合而成，每一段不能超过64k字节地址，因而同一个段内的地址存取，用偏移地址就可以实现，因段地址寄存器所存的段地址是不变的。当用指针时，只16位就够了，这一类就是near指针。当要在另一个段内取数据，就要跨越段，即要指明存取段的段地址和偏移地址，这时段地址寄存器所存段地址要改变，在使用指针指向另一个段内地址时，就要用32位表示，就是far指针了。由此可见，如果你想写在Win16上也能运行的程序，才会涉及到newr、far指针的概念。在Win32上，指针已无near、far的区分。

user: user-6
content: 问题一:windows是不开源的,你看不到他的源代码的.它的代码都在库文件以二进制形式存在.

user: user-6
content: 这个东西很老了吧, far和near都是用来修饰指针的. far指针(远指针)所指向的地址超过64K,所以需要使用DS加偏移量的方法来寻址,而不能直接寻址.near则相反.  typedef BYTE far            *LPBYTE; LPBYTE 是 BYTE* 类型的远指针的意思.

user: user-0
content: 感谢大家的分享！问题得到解决了！谢谢！
user-0 提问: 大神帮忙看下这个程序，运行为什么是这个样子

回复:
user: user-1
content: 我这里有一份   ，你照着理下逻辑 ！ #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { 	int times = 0/*游戏次数*/, mousey = 0/*老鼠所在行号*/, mousex = 0/*老鼠所在列号*/, posy = 0/*锤子所在行号*/, posx = 0/*锤子所在列号*/, hits = 0/*打中次数*/, missed = 0/*错过次数*/; 	int num = 0, row = 0, col = 0; 	srand(time(0)); 	//获得游戏次数 	printf("请输入次数："); 	scanf("%d", ×); 	//打印地图 	printf("***\n***\n***\n"); 	//游戏过程 	for (num = 1;num <= times;num++) { 		//获得老鼠和锤子的位置         mousey = rand() % 3 + 1; 		mousex = rand() % 3 + 1; 		do { 		    printf("请输入锤子所在的位置："); 		    scanf("%d %d", &posy, &posx); 		} while (posy < 1 || posy > 3 || posx < 1 || posx > 3); 		//修改打中和错过的个数 		if (mousey == posy && mousex == posx) { 			hits++; 		} 		else { 			missed++; 		} 		//打印地图         for (row = 1;row <= 3;row++) { 			for (col = 1;col <= 3;col++) { 				if (row == posy && col == posx) { 					printf("O"); 				} 				else if (row == mousey && col == mousex) { 					printf("X"); 				} 				else { 					printf("*"); 				} 			} 			printf("\n"); 		} 		//提示是否打中 		if (mousey == posy && mousex == posx) { 			printf("打中了\n"); 		} 		else { 			printf("没打中\n"); 		} 		//打印总成绩 		printf("打中%d次，错过%d次\n", hits, missed); 	} 	return 0; }

user: user-2
content: 发帖的时候，用一下代码功能，用下TAB呗...看的头大

user: user-3
content: 能简单描述一下程序的功能吗？
user-0 提问: 关于结构体使用的问题

回复:
user: user-1
content: 有点 小问题   lsls 可以直接用ABC吗  感觉要重命名下

user: user-2
content: LS已经说了

user: user-3
content: struct A {int global_gain;};  struct B { A gr[100];};  struct C {B ch[100];};  C* si;  然后si就可以像你上面的代码一样操作了

user: user-4
content: 结构体的嵌套

user: user-5
content: 不就是结构体数组吗？ 结构中一个元素是另一个结构体数组
user-0 提问: zookeeper 多客户端检测

回复:
user: user-1
content: 为什么要搞心跳防护？因为被检测进程不时心脏停跳。 为什么被检测进程不时心脏停跳？因为被检测进程亚健康。 怎么知道被检测进程亚健康的原因： 在任务管理器 进程 查看 选择列 里面选择：内存使用、虚拟内存大小、句柄数、线程数、USER对象、GDI对象 让你的程序(进程)不退出,循环执行主流程很多遍，越多越好，比如1000000次甚至无限循环，记录以上各数值，再隔至少一小时，越长越好，比如一个月，再记录以上各数值。如果以上两组数值的差较大或随时间流逝不断增加，则铁定有对应资源的资源泄漏！  根治了被检测进程亚健康→被检测进程不再心脏停跳→不用再搞心跳防护。 越依赖心跳防护→被检测进程心脏停跳越频繁→被检测进程越不健康！  怎么心跳防护“用来心跳防护不健康进程C”的进程B的不健康？ 怎么心跳防护“用来心跳防护‘用来心跳防护不健康进程C”的进程B’的进程A”的不健康？

user: user-0
content: 引用 3 楼 zxhuser-2 的回复:在服务器代码里加一个变量，统计已连接的客户端数

user: user-2
content: 在服务器代码里加一个变量，统计已连接的客户端数

user: user-0
content: 引用 1 楼 zxhuser-2 的回复:检测连接是否中断了  什么意思，，这个程序自己可以监视自己，能不能也监视别人？    用 zoo_awexists函数的回调函数直接通知我。  你的意思是在哪里检查连接是否中断了？

user: user-2
content: 检测连接是否中断了