Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 该如何解释这个程序为什么有这样的输出结果？

回复:
user: user-1
content: 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。  想要从本质上理解C指针，必须学习汇编以及C和汇编的对应关系。 从汇编的角度理解和学习C语言的指针，原本看似复杂的东西就会变得非常简单！ 指针即地址。“地址又是啥？”“只能从汇编语言和计算机组成原理的角度去解释了。” 但我又不得不承认：  有那么些人喜欢或者适合用“先具体再抽象”的方法学习和理解复杂事物；  而另一些人喜欢或者适合用“先抽象再具体”的方法学习和理解复杂事物。 而我本人属前者。  不要企图依赖输出指针相关表达式...的值【比如printf("%p\n",...);或者cout<<...】来理解指针的本质， 而要依赖调试时的反汇编窗口中的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 main() {     struct {         int i1;         int i2;         int i3;         int i4;     } *p;      // 打出指针的地址，也就是二级指针     printf("%p\n", &p);     // 因为指针指向的内容大小为16字节     // 因此++也将指针向前移动了16字节     p++;      printf("%p\n", &p);     p++;      printf("%p\n", &p);     p++;      printf("%p\n", &p);      return 0; }

user: user-2
content: 因为指针指向一个 4 个 int 的数组，那么移动的时候就是以 sizeo(int) * 4 的大小来移动的，一次 16 字节，也就是十六进制的 0x10 了。上面的所说的有些不对，这个代码是可以编译的过去的，本身就没有语法错误。只是 p 没有指向任何数组而已，而你打出来的值实际上是这个数组指针 p 的地址，打出 &p[1] 的值也是可以的，只不过即便你指针指向有效的数组，这个地址也已经越界了。在指针指向有效的数组的前提下，如果你要打出四个元素各自的地址，应该是这样的： printf("0x%p, 0x%p, 0x%p, 0x%p.\n", (*p)[0], (*p)[1], (*p)[2], (*p)[3]);

user: user-3
content: int (*p)[4]; p是一个指向int[4]的指针，既然它是一个指针，可以想象有一个数组，它的每个元素都是int[4]，而p就是指向这个数组的第一个元素 这样一来p[0]、p[1]、p[2]、p[4]都是这个数组的元素，&就是对它们取地址 &p[0]就是第一个元素的地址，也就是p指向的地址 &p[1]就是第二个元素的地址，这两个地址间应该相差sizeof(int[4])，即0x4 * 4 = 0x10，从输出中可以验证。  可以用这样的代码来类比思考： int * p; &p[0]; &p[1]；  另外可以发现，p是没有初始化的。

user: user-4
content: 引用 楼主 xuefenghan2011 的回复: #include <stdio.h>  int main() { int (*p)[4]; printf("%p>>%p>>%p>>%p\n",&p[0],&p[1],&p[2],&p[4]); return 0; }   输出结果：0xb779a000>>0xb779a010>>0xb779a020>>0xb779a040 楼主认为应该是什么样的结果呢？

user: user-5
content: int main() { 	int a[4]; 	int(*p)[4] = a; 	printf("%p>>%p>>%p>>%p\n", &p[0], &p[1], &p[2], &p[4]); 	return 0; }  首先p是一指针，并非数组。p[0]的写法让人疑惑，本质是*(p+0)。 清楚了p的类型，自然就知道了p+1相对于p的差值(字节数) 答案可得

user: user-5
content: 这代码不可能编译通过。 因为p没有被初始化，编译器应该可以检测出。
user-0 提问: c处理字符串相关问题有没有简便方法

回复:
user: user-1
content: malloc,realloc,free

user: user-2
content: 这个函数设计上有点问题，如果返回值是函数内部分配的空间的话，调用者怎么知道要释放呢？从函数名上仅能看出是个转换函数而已。 如下API好一点 int  intToRoman(int num, char *roman, int len); 返回是否成功。调用者预估一个最大空间就可以了。

user: user-0
content: 引用 4 楼 ForestDB 的回复:不知道LZ有没有看过STL的实现，其实最核心的不过也就是根据需要malloc／free／realloc LZ完全可以将class string用struct + function重写一遍 我没看stl实现，不过估计应该也是用c的基本函数封装实现，但毕竟没看源码不敢确定。不过照你这么一说的话，那么就算是string的加号重载，可能在实现上最终也是调到realloc的。

user: user-0
content: 引用 5 楼 todo9351 的回复:这个函数设计上有点问题，如果返回值是函数内部分配的空间的话，调用者怎么知道要释放呢？从函数名上仅能看出是个转换函数而已。 如下API好一点 int  intToRoman(int num, char *roman, int len); 返回是否成功。调用者预估一个最大空间就可以了。 oj上原型就是这样咯，它肯定是知道要释放的。如果自己写应该会用你建议的原型。

user: user-3
content: 不知道LZ有没有看过STL的实现，其实最核心的不过也就是根据需要malloc／free／realloc LZ完全可以将class string用struct + function重写一遍

user: user-4
content: 引用 2 楼 kakulukia 的回复:知道realloc可以重新分配，但总觉得频繁调用重分配内存函数容易出错。例如【MCMLXXVI,1976】，要realloc七次。有没有类似string加号重载功能的函数或做法呢？  oj确实，看自己想怎么练。不过似乎是c更考查编程能力，尤其是涉及二维数组、字符串什么的。 realloc不仅可以扩展内存，还可以释放部分内存，所以只要最后一次性释放不需要的内存就可以了。 另外，字符串相加同样伴随着动态内存申请，运算符重载只是为了开发方便，运行效率未必高。

user: user-0
content: 知道realloc可以重新分配，但总觉得频繁调用重分配内存函数容易出错。例如【MCMLXXVI,1976】，要realloc七次。有没有类似string加号重载功能的函数或做法呢？  oj确实，看自己想怎么练。不过似乎是c更考查编程能力，尤其是涉及二维数组、字符串什么的。

user: user-4
content: 可以用realloc改变分配的内存的容量。 我觉得oj是用来练手的，不是考试，用什么取决于你想练习什么，练习数据结构就不管用什么语言都可以自己去实现，练习标准库的使用就可以直接使用库函数，并且leetcode会保存你所有通过了的算法，所以你可以尝试使用不同的方法来做同一道题。以上是我个人的一些看法。
user-0 提问: strcopy实现问题

回复:
user: user-1
content: 引用 2 楼 Edward2Jason 的回复:[quote=引用 1 楼 user-4 的回复:] while没错，return错了。应该是return s1  return s1 或者return res都对吧！ 看博客：http://www.cnblogs.com/chenyg32/p/3739564.html，这面说while语句是错误的，我想了半天也没搞懂错哪了？[/quote] 这人一看就是复制粘贴估计根本就没研究内容。至于你说的返回哪个都对，不是吧？你 while 里用 s1 就返回 res，while 里用 res 就返回 s1，哪能随便返回呢。

user: user-1
content: 的确有一个错误是应该 return s1; 但楼主的疑惑明显不在于此。由于 while (a = b) 是先执行 b 赋值给 a 再判断 a 是否为零，所以这段代码，while (*(res++) = *(s2++)); 实际上尾零 '\0' 复制给 res 了之后，该循环才终止。

user: user-2
content: 返回s1，自己测试啊

user: user-0
content: 引用 6 楼 SXJIAKE 的回复:[quote=引用 2 楼 Edward2Jason 的回复:] [quote=引用 1 楼 user-4 的回复:] while没错，return错了。应该是return s1  return s1 或者return res都对吧！ 看博客：http://www.cnblogs.com/chenyg32/p/3739564.html，这面说while语句是错误的，我想了半天也没搞懂错哪了？[/quote] 这人一看就是复制粘贴估计根本就没研究内容。至于你说的返回哪个都对，不是吧？你 while 里用 s1 就返回 res，while 里用 res 就返回 s1，哪能随便返回呢。[/quote]  是的，我理解错了！谢谢指正！

user: user-0
content: 引用 5 楼 SXJIAKE 的回复:的确有一个错误是应该 return s1; 但楼主的疑惑明显不在于此。由于 while (a = b) 是先执行 b 赋值给 a 再判断 a 是否为零，所以这段代码，while (*(res++) = *(s2++)); 实际上尾零 '\0' 复制给 res 了之后，该循环才终止。  是的，应该return s1，这点错了！ 后面的一点跟我的理解一样，所以while (*(res++) = *(s2++)); 是可以对的！谢谢！

user: user-0
content: 引用 3 楼 user-4 的回复:[quote=引用 2 楼 Edward2Jason 的回复:] [quote=引用 1 楼 user-4 的回复:] while没错，return错了。应该是return s1  return s1 或者return res都对吧！ 看博客：http://www.cnblogs.com/chenyg32/p/3739564.html，这面说while语句是错误的，我想了半天也没搞懂错哪了？[/quote] 如果”return s1 或者return res都对“，那么res这个变量就完全没有必要存在了。循环结束的时候，s1还在字符串开头，res在字符串结尾。 我还是觉得while没错。楼主可以给他留言直接问他，或者自己写点代码验证一下[/quote]  恩，你说的没错！是的，应该是return s1，谢谢你！

user: user-3
content: 引用 2 楼 Edward2Jason 的回复:[quote=引用 1 楼 user-4 的回复:] while没错，return错了。应该是return s1  return s1 或者return res都对吧！ 看博客：http://www.cnblogs.com/chenyg32/p/3739564.html，这面说while语句是错误的，我想了半天也没搞懂错哪了？[/quote]n那是两点...

user: user-4
content: 引用 2 楼 Edward2Jason 的回复:[quote=引用 1 楼 user-4 的回复:] while没错，return错了。应该是return s1  return s1 或者return res都对吧！ 看博客：http://www.cnblogs.com/chenyg32/p/3739564.html，这面说while语句是错误的，我想了半天也没搞懂错哪了？[/quote] 如果”return s1 或者return res都对“，那么res这个变量就完全没有必要存在了。循环结束的时候，s1还在字符串开头，res在字符串结尾。 我还是觉得while没错。楼主可以给他留言直接问他，或者自己写点代码验证一下

user: user-0
content: 引用 1 楼 user-4 的回复:while没错，return错了。应该是return s1  return s1 或者return res都对吧！ 看博客：http://www.cnblogs.com/chenyg32/p/3739564.html，这面说while语句是错误的，我想了半天也没搞懂错哪了？

user: user-4
content: while没错，return错了。应该是return s1
user-0 提问: 虚拟设备的驱动程序是如何被加载的？

回复:
user: user-1
content: 虚拟设备虽然不是真实存在，但是可以 模拟 / 仿真 物理设备  举个例子：  最近在研究虚拟磁盘，比如要模拟物理设备的 PnP 请求，可以发 IOCTL_MOUNTMGR_VOLUME_ARRIVAL_NOTIFICATION 到挂载管理器来  模拟 / 仿真 PnP 这个过程。  虚拟磁盘的读写 IRP 也不一定要转发的下层设备，也可以在虚拟磁盘这一层用文件来模拟下层的存储介质。

user: user-0
user-0 提问: 新手问题

回复:
user: user-1
content: http://bbs.csdn.net/topics/390676437

user: user-2
content: 精度问题 详见IEEE 754

user: user-3
content: 引用 3 楼 windyful 的回复:[quote=引用 1 楼 mewiteor 的回复:] float改double 首先 感谢的你回答，改为double后运行正常。 但能否解释下为什么改为double就可以了呢？[/quote] float十进制有效数字大约7位，double十进制有效数字大约15位，printf中%f默认6位小数，这里的周长要8位有效数字，所以float不够，double够。 而面积输出看起来准确，是因为0.3不能用二进制精确表示，但乘5后就可以了。

user: user-0
content: 引用 1 楼 mewiteor 的回复:float改double 首先 感谢的你回答，改为double后运行正常。 但能否解释下为什么改为double就可以了呢？

user: user-4
content: 这个结果没问题，有的数只能近似表示

user: user-3
content: float改double
user-0 提问: OC中关于实例变量和成员变量的区别?类方法和对象方法的区别?

回复:
user: user-1
content: 本人最近开始学习OC,之前学习过一些C语言.但是在学OC时遇到了一些难题,希望大神给予答案. 第一个问题 1.    -   对象方法(动态方法) 2.   +    类方法(静态方法) 如何区别类方法和对象方法?何时何地该用哪种方法?  方法的修饰符-/+即能做区分，至于功能上的区分 -对象方法即OO的基本精神之一——封装／信息隐藏，这个需要你对OO有理解 +类方法一般用作命名空间，用以组织一组功能函数；又或用作类的工厂函数，用以产生类的对象；不管哪种，都需要有大型项目的经验，才知道如何组织程序的复杂性及使用设计模式  第二个问题: 成员变量  和  实例变量的区别? 我的理解就是成员变量就是由对象创建的,实例对象就是由类创建的.但是该在代码中如何区别呢? 网上有个答案:http://leopard168.blog.163.com/blog/static/16847184420138153296930/,但是不理解啊.  @interface Person {   NSString * name; } @end Person * you ＝ [[Person alloc] init];  则有you为实例，you有成员name。  第三个问题: 在OC中如何准确创建一个变量,有些变量带*,比如NSString * name;    但有些又不带*,比如CGFloat  a    和NSInterger  b. 问了老师,老师说是只要是C语言的基本数据类型就不需要带*.是这样吗? 他还说,其实,c中没有类和对象的说法.是吗?  这是因为NSString是个类而NSInteger并不是，虽然长得像  #if __LP64__ || TARGET_OS_EMBEDDED || TARGET_OS_IPHONE || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64 typedef long NSInteger; typedef unsigned long NSUInteger; #else typedef int NSInteger; typedef unsigned int NSUInteger; #endif  int a; a就是int类的实例（即int对象） 你信吗？  建议： 先学好C语言，特别是关于语言的一些基本概念，比如类型，比如变量，比如作用域，比如⋯⋯ 然后是选一门较简单的OO语言入门，比如Java 基本功打好了，OO有一定的理解了，再来看OC。
user-0 提问: c语言在多线程快速排序中的一个问题

回复:
user: user-0
content: 哦我修改了一下。。 现在是这样，但是好像有问题。 #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <time.h> #include <assert.h>  #define NTHR   4 #define NUMNUM 1000 #define TNUM   NUMNUM/NTHR  void sort(int *array, int left, int right) {     int i = left;     int j = right;     int key = array[left];          while(i < j)     {         while(i < j && key <= array[j])         {             j--;         }                  array[i] = array[j];                  while(i < j && key >= array[i])         {             i++;         }                  array[j] = array[i];     }          array[i] = key;     sort(array, left, i - 1);     sort(array, i + 1, right);     return; }  void quicksort(int *array, int left, int right) {     if (left >= right) return;     int i = left;     int j = right;     int key = array[left];          while(i < j)     {         while(i < j && key <= array[j])         {             j--;         }                  array[i] = array[j];                  while(i < j && key >= array[i])         {             i++;         }                  array[j] = array[i];     }          array[i] = key;     quicksort(array, left, i - 1);     quicksort(array, i + 1, right); }  void *WorkThread(void *arg) {     int *array;     quicksort(array, (int)arg * TNUM, ((int)arg + 1) * TNUM - 1);     pthread_exit(NULL); }   int main() {     int array[NUMNUM];     srand((unsigned)time(NULL));     for (int i = 0; i < NUMNUM; i++) array[i] = rand();          sort(array, 0, NUMNUM - 1);          pthread_t threads[NTHR];     int thread_args[NTHR];     int result_code, index;          clock_t start, finish;     double duration;          start = clock();     for (index = 0; index < NTHR; ++index) {         thread_args[index] = index;         result_code = pthread_create(&threads[index], NULL, WorkThread, (void *) &thread_args[index]);         assert(0 == result_code);     }          for (index = 0; index < NTHR; ++index) {         result_code = pthread_join(threads[index], NULL);         assert(0 == result_code);     }          int k;     for (k = 0; k < NUMNUM; k++)         printf("%d\n", array[k]);          finish = clock();     duration = (double) (finish - start)/CLOCKS_PER_SEC;     printf("%f\n", duration);          exit(EXIT_SUCCESS); }

user: user-1
content: 没试过这方法...
user-0 提问: malloc二次使用的问题。

回复:
user: user-0
content: 引用 4楼haierpro 的回复:DEBUG能运行，release不能运行，多半都是内存访问越界。  newresl->dIp=(char*)malloc(sizeof(char));   这里给dlp分配了多少内存？  sprintf(resl->sIp,"%d.%d.%d.%d",ih->saddr.byte1,ih->saddr.byte2,ih->saddr.byte3,ih->saddr.byte4); 这里又往slp写入了多少字节？内存分配少了，*4就行了～

user: user-0
content: 引用 3楼弓长羊羽 的回复:这段代码想干嘛？抓包，提取源IP，目的IP，协议，然后统计数目。

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

user: user-2
content: DEBUG能运行，release不能运行，多半都是内存访问越界。  newresl->dIp=(char*)malloc(sizeof(char));   这里给dlp分配了多少内存？  sprintf(resl->sIp,"%d.%d.%d.%d",ih->saddr.byte1,ih->saddr.byte2,ih->saddr.byte3,ih->saddr.byte4); 这里又往slp写入了多少字节？

user: user-3
content: 这段代码想干嘛？

user: user-4
content: 把怀疑有问题的变量值输出到日志文件，另外看一下崩溃的core文件，malloc一般不会出问题，除非内存不够用了。 内存不足会返回一个空指针，也不会出问题，只能在后面赋值的时候出错。

user: user-5
content: 参考代码段: https://github.com/user-5/Senior-middle-school/blob/master/Filling%20in%20the%20gaps.c
user-0 提问: 求解 C语言

回复:
user: user-1
content: 这样可好：  #include <stdio.h> #include <stdlib.h> #include <malloc.h> typedef struct student { 	int number; 	struct student *next; }STU; STU* creat(int b); int main() { 	STU *b; 	b = creat(2); 	return 0; } STU* creat(int b) { 	STU *head, *next, *last; 	head = NULL; 	int i; 	for (i = 0; i < b; i++) 	{ 		next = malloc(sizeof(STU)); 		next->number = rand() % 100; 		next->next = NULL; 		if (NULL == head) 		{ 			head = last = next; 		} 		else 		{ 			last->next = next; 			last = next; 		} 	} 	return head; }

user: user-2
content: b是个野指针，给*b赋值

user: user-3
content: int main(int argc, char *argv[]) {     a b;     b = create(2); }

user: user-4
content: a creat(int b)这个函数没有看懂。创建链表？strcut  student* creat();
user-0 提问: C语言，求教大神

回复:
user: user-1
content: 修改如下：  int main() { 	char letter, c; 	printf("please enter the letter of someday\n"); 	letter = getchar(); 	switch (letter) 	{ 	case 'm': 	case 'M':printf("the day is monday\n"); break;  	case 't': 	case 'T': 		printf("please input the second letter\n"); 		rewind(stdin);    //zx 		c = getchar(); 		if ('u' == c) 			printf("the day is tuesday\n"); 		else if ('h' == c) 			printf("the day is thursday\n"); 		else 			printf("data error\n"); 		break; 	case 'w': 	case 'W':printf("the day is wednesday"); break; 	case 'f': 	case 'F':printf("the day is friday"); break; 	case 's': 	case 'S':printf("please input the second letter\n"); 		rewind(stdin);    //zx 		c = getchar(); 		if ('a' == c) 			printf("the day is saturday\n"); 		else if ('u' == c) 			printf("the day is sunday\n"); 		else 			printf("data error\n"); 		break; 	default:printf("the data error\n"); 	} 	return 0; }

user: user-2
content: 首先，你应该考虑一下回车的问题；其次你一个字符读了两遍。

user: user-3
content: printf("please enter the letter of someday:"); 		letter=getchar(); 		switch(letter) 		{ 			case 'm': 			case 'M': 				printf("\n the day is monday"); 				break; 			case 't': 			case 'T': 				printf("please input the second letter:"); 				fflush(stdin); 				c=getchar(); 				if(c=='u'){ 					printf("\n the day is tuesday"); 				}else if(c=='h'){ 					printf("\n the day is thursday"); 				}else{ 					printf("\n data error"); 				} 				break; 			case 'w': 			case 'W': 				printf("\n the day is wednesday"); 				break; 			case 'f': 			case 'F': 				printf("\n the day is friday"); 				break; 			case 's': 			case 'S': 				printf("please input the second letter:"); 				fflush(stdin); 				c=getchar(); 				if(c=='a'){ 					printf("\n the day is saturday"); 				}else if(c=='u'){ 					printf("\n the day is sunday"); 				}else{ 					printf("\n data error"); 				} 				break; 			default: 				printf("\n the data error"); 		} 要编写清晰的代码
user-0 提问: 实习生，请看一下我的代码，不知道问题出现在哪里了

回复:
user: user-0
content: 引用 2 楼 user-2 的回复:弄这么多循环？楼主好好看看你写的逻辑 我也是初学者，还没学到指针，也没写过什么代码，这是无意中想起生活中发生的事情，就想着是否可以用代码来完成，逻辑上啰嗦一些，还请指导，哪里需要改进？

user: user-0
content: 引用 3 楼 brookmill 的回复:srand在整个程序里面调用一次就行了，一般是在main最开始的地方。 把Shuffle和Choice里面的srand删掉。 谢谢 就是这个问题 去掉了 其他的srand 问题就消失了，谢谢~

user: user-1
content: srand在整个程序里面调用一次就行了，一般是在main最开始的地方。 把Shuffle和Choice里面的srand删掉。

user: user-2
content: 弄这么多循环？楼主好好看看你写的逻辑

user: user-0
content: 偶尔会出现全都是一样的结果，请问问题出现在哪里？？？
user-0 提问: 隐藏窗口，显示托盘图标

回复:
user: user-0
content: 引用 1 楼 ____________--------的回复:当最小化窗体时，调用函数ToTray()，实现隐藏窗体，显示托盘图标；  （三）实现代码  1、ToTray()的定义  void CTPDlg::ToTray() {     NOTIFYICONDATA  pnid;     pnid.cbSize=(DWORD)sizeof(NOTIFYICONDATA);//该结构体大小     pnid.hWnd=this->m_hWnd;    //窗口句柄     //pnid.uID=(UINT)m_hIcon;      //图标句柄     pnid.uID=IDR_MAINFRAME;//图标句柄     pnid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP ; //图标有效|自定义消息有效|鼠标指向显示文字有效     pnid.uCallbackMessage=WM_SHOWTASK;//自定义的消息名称，调用消息实现函数     pnid.hIcon=m_hIcon;         //图标句柄     lstrcpy((LPWSTR)pnid.szTip,TEXT("这是一个测试托盘的程序"));/*鼠标指向所显示的文字(在unicode下的表达方式,在非unicode的情况下可以用strcpy(pnid.szTip,"...")表达。*/     Shell_NotifyIcon(NIM_ADD,&pnid);    //在托盘区添加图标          ShowWindow(SW_HIDE);    //隐藏主窗口 } 谢谢！刚测试了一下，可用

user: user-1
content: 当最小化窗体时，调用函数ToTray()，实现隐藏窗体，显示托盘图标；  （三）实现代码  1、ToTray()的定义  void CTPDlg::ToTray() {     NOTIFYICONDATA  pnid;     pnid.cbSize=(DWORD)sizeof(NOTIFYICONDATA);//该结构体大小     pnid.hWnd=this->m_hWnd;    //窗口句柄     //pnid.uID=(UINT)m_hIcon;      //图标句柄     pnid.uID=IDR_MAINFRAME;//图标句柄     pnid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP ; //图标有效|自定义消息有效|鼠标指向显示文字有效     pnid.uCallbackMessage=WM_SHOWTASK;//自定义的消息名称，调用消息实现函数     pnid.hIcon=m_hIcon;         //图标句柄     lstrcpy((LPWSTR)pnid.szTip,TEXT("这是一个测试托盘的程序"));/*鼠标指向所显示的文字(在unicode下的表达方式,在非unicode的情况下可以用strcpy(pnid.szTip,"...")表达。*/     Shell_NotifyIcon(NIM_ADD,&pnid);    //在托盘区添加图标          ShowWindow(SW_HIDE);    //隐藏主窗口 }
user-0 提问: 求帮忙找出我的逻辑错误

回复:
user: user-1
content: 引用 6 楼 csdtdp 的回复:引用 4 楼 user-1 的回复:你用调试工具设断点  一步一步的看看就明白了  大神 我错误找出来了 是到第五层递归的时候  判断条件不满足 ，但是请教大神如何修改呢  我尝试了几次都没能成功 先睡觉了  脑子有点昏  明天帮你看看

user: user-0
content: 引用 4 楼 user-1 的回复:你用调试工具设断点  一步一步的看看就明白了  大神 我错误找出来了 是到第五层递归的时候  判断条件不满足 ，但是请教大神如何修改呢  我尝试了几次都没能成功

user: user-0
content: 回复楼上 错误我已经找出来了 但是我还是无法修改这个错误 。尝试了几中修改 方式 但是还是没能改出来

user: user-1
content: 你用调试工具设断点  一步一步的看看就明白了

user: user-0
content: 麻烦再帮我吧上面的这个代码看看哪里错误  谢谢大神

user: user-0
content: /* 例1：     1、2、3、4、5这5个数字,输出不同的顺序,其中4不可以排在第三位,     3和5不能相邻,请问有多少种组合?      总的 - 四在中间的 - 3和5相邻的 + 四中间 并3和5相邻的(只能在最左边或最右边)     5*4*3*2*1 - 4*3*2*1  - 4*3*2 *2 +2*2 *2     120 - 24 - 12*4 + 8     120 - 72 + 8 = 56 */ #define 	N  	5 void   TryNumber( int  i ); int   NumFlag[N+1]  =  {0}; int   NumTaken[N+1]  =  {0}; int   static count=0; main( ) {         TryNumber( 1 );         printf("%d\n",count); } void   TryNumber(int  i) {         int   j,  k;         for(j = 1;  j <= N;  j++)         {             if((NumFlag[j]  !=  0)||(NumTaken[3]==4)||(((NumTaken[i]==3)&&(NumTaken[i-1]==5))||(((NumTaken[i]==5)&&(NumTaken[i-1]==3)))  continue;             NumTaken[i] = j;             NumFlag[j] = 1;             if(i == N)             {                 count++;                 for(k = 1; k <= N; k++) printf("%d ", NumTaken[k]);                 printf("\n");             }             else    TryNumber(i + 1);             NumTaken[i] = 0;             NumFlag[j] = 0;          }  }

user: user-0
content: 哪位大神如果能  优化下我if的条件判断 更加感谢    尤其是第二个 和三个if条件  我想暴力求解的 原来用的是 numtaken【i】==3&&nunmtaken[i-1]==5     但是显示的个数是96
user-0 提问: stdout不能作为变量初始化的值

回复:
user: user-1
content: 估计是怕全局变量初始化顺序的问题。 FILE* Init() {     static FILE *out = stdout;     return out; }你看看这样是否满足你要求吧

user: user-0
content: 引用 2 楼 user-2 的回复:很奇怪的是C不可以，C++可以。  workaround：  # include <stdio.h>  FILE * out;  int main() {     out = stdout;      ...      return 0; }  感谢！把编译器换成g++就可以了

user: user-1
content: 看了下标准，c标准规定 All the expressions in an initializer for an object that has static storage duration shall be constant expressions or string literals 所以全局变量是不能用另外一个变量初始化的。

user: user-2
content: 很奇怪的是C不可以，C++可以。  workaround：  # include <stdio.h>  FILE * out;  int main() {     out = stdout;      ...      return 0; }
user-0 提问: 找出重复数并合并

回复:
user: user-1
content: 来用C++，unordered_map/unordered_set 拯救你

user: user-0
content: 引用 1 楼 user-2 的回复:把一对数看成一条边, 每个连通图作为一组,是不是这个意思? 就是有一个元素重复的就合并，并把原先的删除掉，（3，4）（3，5）（5，4）就合并成   （3，4，5）

user: user-2
content: 把一对数看成一条边, 每个连通图作为一组,是不是这个意思?

user: user-2
content: 引用 2 楼 honeyroyal 的回复:[quote=引用 1 楼 user-2 的回复:] 把一对数看成一条边, 每个连通图作为一组,是不是这个意思? 就是有一个元素重复的就合并，并把原先的删除掉，（3，4）（3，5）（5，4）就合并成   （3，4，5）[/quote] 定义个二维数组保存这关系,比如G[N][N], G[2][3]=G[3][2]=1,然后遍历一下
user-0 提问: 帮忙看看我的双链表有没有问题，能不能作为商业代码？

回复:
user: user-1
content: 建议去看看开源项目，redis底层数据结构就是双端链表。可以看看牛人是怎么实现的

user: user-2
content: 几点建议： 1.宏全部改成do { ... } while (0) 2.写一个测试程序
user-0 提问: signal函数的困惑

回复:
user: user-0
content: 引用 4 楼 u013493901 的回复:因为signal并不是可移植的函数，有些平台上的signal实现，调用handler后会恢复信号的默认处理方式。你改成这样： void handler(int sig) {     signal(SIGINT,handler);     printf("i catch the signum[%d].\n",sig); } 就能正常工作了。但是这段代码也是有问题的，存在一个竞争的问题，如果信号在handler中的signal还未执行前到来，又会出现意外的情况。 最好的方式是使用sigaction() 函数。 恩恩 我在公司的AIX服务器上和win7上的MingW上运行的，都是调用一次后就恢复默认处理方式了。

user: user-1
content: 因为signal并不是可移植的函数，有些平台上的signal实现，调用handler后会恢复信号的默认处理方式。你改成这样： void handler(int sig) {     signal(SIGINT,handler);     printf("i catch the signum[%d].\n",sig); } 就能正常工作了。但是这段代码也是有问题的，存在一个竞争的问题，如果信号在handler中的signal还未执行前到来，又会出现意外的情况。 最好的方式是使用sigaction() 函数。

user: user-2
content: 楼主确定按照你的代码会出错，我在乌班图上运行没有出错…你打印的pid都是一样的，循环里面没意思啊

user: user-0
content: 这个因为打印进程号了，所以我可以在外面用kill结束这个进程，当然这不是重点，重点是按第二次Ctrl+C的时候，程序就退出了

user: user-3
content: 你这没有写退出语句啊  怎么会退出
user-0 提问: 求大神告知字符串数组如何使用scanf语句对其赋值，

回复:
user: user-1
content: scanf （ "非输入控制符 输入控制符"，输入参数）； 非输出控制符必须原样输入 要实现楼主所说的情况有很多方法，指针数组，二维数组，结构体数组..........这些相信楼主已经了解。 对于scanf的用法一般用之前最好像1L赵四老师说的清空一下键盘输入缓冲区    给你写了一个程序作为参考：  #include <stdio.h> #include <stdlib.h> int main() {     char name1[11],name2[11]; 	int i=0; 	while(i!=3){	 		printf("please input tow name:"); 		//清空输入缓冲区 		int flag=scanf("%5s %10s",name1,name2);		 		printf("res: %d name %s and %s\n",flag,name1,name2); 		i++; 	} 	system("pause"); 	return 0; }  运行结果：  如果不清空缓冲区  就会出现第三次输入的情况。

user: user-2
content: 引用 2 楼 u013790834 的回复:scanf("%10s", str[i]);//这里的%10s,是输入大小为10个以内的意思，保证输入不会溢出。 } 最好%9s，留一个给结束符‘\0’

user: user-3
content: char *a[100];     //定义一个字符串数组用于存放姓名 这句话的意思是一个数组大小100，每个装的都是指针。 如果需要用它来赋值就需要先进行初始化，不然会报错。初始化的方式可以是循环开辟空间。 for(int i = 0; i < 100; i++) {     a[i] = new char[10]; } 然后进行输入。 但是一般要对一个数组进行输入应该定义二维数组： char str[100][10];//表示一个100大小的数组，每个空间为10个字节。 for(int i = 0; i < 100; i++) {     scanf("%10s", str[i]);//这里的%10s,是输入大小为10个以内的意思，保证输入不会溢出。 }

user: user-4
content: #include<stdio.h> int main() {     int m,n;     while (1) {         printf("提示：人数应为组数的整数倍,并且最多能对100人进行分组\n");         printf("请输入要分组的人数: m=");fflush(stdout);         rewind(stdin);         scanf("%d",&m);         char a[100][30];     //定义一个字符串数组用于存放姓名         printf("请输入要分组的组数: n=");fflush(stdout);         scanf("%d",&n);         if (m%n==0||m<=100) {             printf("请输入姓名:\n");             for (int i=0;i<m;i++) {                 scanf("%29s",&a[i]);             }             printf("%s",a[1]);             char *b[3]={"小红","hell"};             printf("%s",b[0]);             break;         } else {             printf("输入错误，请重新输入\n");         }     }     return 0; }
user-0 提问: 求大神解答：error C2143: 语法错误 : 缺少“}”(在“常量”的前面) 

回复:
user: user-1
content: extern void choleskyfenjie(double *QF,double A[][N],int N) {     int i,j,k,p=0;     double A[N][N]; // 最后一个形参int N跟N定义冲突,改成int n, 变量A命名冲突,改成其它名字

user: user-2
content: 偶遇到类似问题都是用 “每次用/*...*/注释掉不同部分再重新编译，直到定位到具体语法出错的位置。” 的方法解决的。

user: user-3
content: 你这个问题太多了 ， 首先是楼上所说的N定义冲突 ， 然后还有double A[N][N];  这个声明也冲突了， 和形参里的那个声明

user: user-4
content: 养成一个良好的编码习惯你就不会出现这样的问题了
user-0 提问: ffmpeg中的 av_gettime获取的时间是以什么时间为基准的？？？

回复:
user: user-1
content: http://bbs.csdn.net/topics/392043099

user: user-2
content: 时间溢出了。  自1970年到现在的经过的时间是1479190499704705 us;   int 32位数据已无法存储，请使用int64_t 来定义time变量

user: user-3
content: 我也遇到这个问题了，然后找到了你的帖子。然后依旧没有解决
user-0 提问: 有两个关于c语言的小问题

回复:
user: user-1
content: 第一题上面已经有答案了 第二题要是和六楼说的一样的话，四行五列的话，计算对角线元素的和，就直接用写下标出来就好了(又不会很长的）。 下标写举个例子就是 sum=a[0][0]+a[1][1]+a[2][2]+a[3][3]; 不过这题有点小问题，就是四行五列的对角线数组上连不上啊

user: user-2
content: 四分五裂！

user: user-3
content: 引用 1 楼 sinat_28956991 的回复:是全班同学的平均年龄 1.定义一个结构体  struct STUDENT{    int num;    char name[20];    int age;    ..... } srtuct STUDENT buff[10]; //然后用buff操作结构体就行了  2.楼主是说4行5列这样的？  我想先问问你，你想干嘛？

user: user-0
content: [b]第二个呢 [/b][b]第二个呢

user: user-4
content: 引用 3 楼 benben0729 的回复:struct student { int num; int age; char name[20]; double score; }stu[10];+1

user: user-5
content: struct student { int num; int age; char name[20]; double score; }stu[10];

user: user-6
content: 哪里来的作业题啊？

user: user-0
content: 是全班同学的平均年龄
user-0 提问: 有个C语言的运算我没搞清楚 

回复:
user: user-1
content: 引用 2 楼 kongsu 的回复:[quote=引用 1 楼 user-3 的回复:] 看置顶帖http://bbs.csdn.net/topics/370153775  我能理解为。。。。 这个是没法直接解释的   要看编译器自己的处理顺序？ [/quote]   楼主不要怀疑自己，你只要知道j最后结果是多少就行。 但是有很多时候运算的结果不是上面所述。 因为在C语言中，编译器可以选择先计算函数里的那个参数的值，这个自由性提高了编译器的效率，但是如果变量使用了增量运算符就会带来麻烦。 就像你说的这个问题，它可能先计算括号里的，也可能先做变量的增量运算，这是不确定的。确定的是编译器在程序结束时j的值增加三次。  详解：C语言的副作用是指对对象或文件的修改，int  num=10；，这个简单的赋值语句从C的角度看是将变量num的值改成10，这就是一个副作用。 顺序点是程序执行中的一点，在这个点处所有副作用都在进入下一步前被计算，在C中；就标志了一个顺序点。 例子:  while(num++ < 10){     printf("%d\n",num); }  上面说了所有副作用都在顺序点之前完成，所以先做while（）中的计算（先判断在做后缀的++）再printf。 例子： num=(4 + x++)+(6 + x++); 先看（4 + x++），因为它不是一个完整的表达式（没有顺序点），所以不能确定到底是先做加法还是先 x++，但是在分号以前C编译器能保证x能自增两次。  所以我们要尽量避免用这样的语句。   希望对楼主有用。

user: user-2
content: 如果不是为了考试什么的，没必要纠结于这类题目，因为不同的编译器的编译顺序不一样，得出的结果也会不一样

user: user-0
content: 引用 1 楼 user-3 的回复:看置顶帖http://bbs.csdn.net/topics/370153775  我能理解为。。。。 这个是没法直接解释的   要看编译器自己的处理顺序？

user: user-3
content: 看置顶帖http://bbs.csdn.net/topics/370153775
user-0 提问: 关于"C语言深度剖析"这本书的一个疑问

回复:
user: user-1
content: 引用 4 楼 innerX 的回复:[quote=引用 2 楼 user-2 的回复:] 数组作为参数传递会弱化为指针，如果是放到sizeof运算符中，因为sizeof不会进行求值运算，只会推导表达式最后的类型，所以导致这样的结果 我用的win8.1，装不了vc，现在在用vs2013，需要做“五子棋”的作业，不用graphic.h，改用Windows API可以吗？[/quote] 当然可以用window api代替，但windows GUI编程是另一套需要学的东西了。 不过，五子棋不是重在算法吗？用一些字符代表棋子不就可以了吗？

user: user-0
content: 引用 2 楼 user-2 的回复:数组作为参数传递会弱化为指针，如果是放到sizeof运算符中，因为sizeof不会进行求值运算，只会推导表达式最后的类型，所以导致这样的结果 我用的win8.1，装不了vc，现在在用vs2013，需要做“五子棋”的作业，不用graphic.h，改用Windows API可以吗？

user: user-0
content: 引用 1 楼 jiqiang01234 的回复:不如去看《c专家编程》 这本书我有，但感觉平时练习用体会不了里面的编程思想啊。 借这个机会问前辈一个问题啊，我们有一个用C写五子棋的作业，我看Visual Studio 2013发现里面没有graphic.h，所以找了一些Windows编程的书，想用Windows API实现，但现在觉得这个有点难，你有什么建议吗？

user: user-2
content: 数组作为参数传递会弱化为指针，如果是放到sizeof运算符中，因为sizeof不会进行求值运算，只会推导表达式最后的类型，所以导致这样的结果

user: user-1
content: 不如去看《c专家编程》
user-0 提问: c中如何从文件中指定字符串开始读取固定长度的字符串

回复:
user: user-1
content: 仅供参考：//NAME: essaie bla bla //DIMENSION: 8 //DATA //1  14  15 //2  11  10 //3  6   4 //4  7   13 //5  9   21 //6  19  3 //7  1   5 //8  8   8 //EOF // // 文本文件中可能还含有其他内容，但是需要用到的内容即以上  //比如data.txt: //NAME: essaie bla bla //其它内容 //DIMENSION: 8 //其它内容 //DATA //其它内容 //1  14  15 //其它内容 //2  11  10 //其它内容 //3  6   4 //其它内容 //4  7   13 //其它内容 //5  9   21 //其它内容 //6  19  3 //其它内容 //7  1   5 //其它内容 //8  8   8 //其它内容 //EOF  // 目标是要获取NAME后字串，DIMENSION后数值，以及DATA以下的数值 // 其中NAME就是随便个字句，DIMENSION是城市数量，DATA以下是城市编号，X坐标，Y坐标 // 所有的这些将赋值给一个事先定义好的结构 #include <stdio.h> #include <string.h> #define MAXCPL   80   //每行最大字符数 #define MAXCITY  100  //每组数据中DATA最多项数，DIMENSION的最大值 #define MAXNAMEL 32   //NAME最大长度 struct S {     char NAME[MAXNAMEL+1];     int  DIMENSION;     struct D {         int NO;         int X;         int Y;     } DATA[MAXCITY]; } s; FILE *f; int st,n,i; char ln[MAXCPL]; int main() {     f=fopen("data.txt","r");     if (NULL==f) {         printf("Can not open file data.txt!\n");         return 1;     }     st=0;     n=0;     while (1) {         if (NULL==fgets(ln,MAXCPL,f)) break;         if (st==0) {             if (1==sscanf(ln,"NAME: %32[^\n]",s.NAME)) st=1;         } else if (st==1) {             if (1==sscanf(ln,"DIMENSION: %d",&s.DIMENSION)) st=2;         } else if (st==2) {             if (0==strcmp(ln,"DATA\n")) st=3;         } else if (st==3) {             if (3==sscanf(ln,"%d%d%d",&s.DATA[n].NO,&s.DATA[n].X,&s.DATA[n].Y)) {                 n++;                 if (n>=MAXCITY || n>=s.DIMENSION) break;             }         }     }     fclose(f);     printf("s.NAME=[%s]\n",s.NAME);     printf("s.DIMENSION=%d\n",s.DIMENSION);     for (i=0;i<n;i++) {         printf("s.DATA[%d].NO,X,Y=%d,%d,%d\n",i,s.DATA[i].NO,s.DATA[i].X,s.DATA[i].Y);     }     return 0; } //s.NAME=[essaie bla bla] //s.DIMENSION=8 //s.DATA[0].NO,X,Y=1,14,15 //s.DATA[1].NO,X,Y=2,11,10 //s.DATA[2].NO,X,Y=3,6,4 //s.DATA[3].NO,X,Y=4,7,13 //s.DATA[4].NO,X,Y=5,9,21 //s.DATA[5].NO,X,Y=6,19,3 //s.DATA[6].NO,X,Y=7,1,5 //s.DATA[7].NO,X,Y=8,8,8

user: user-2
content: 引用 2 楼 zhangxiangDavaid 的回复:这样可好：  #include <stdio.h> #include <string.h> int main(void) { 	FILE *f = fopen("1.txt", "r"); 	char buf[256]; 	char *p; 	while (1) 	{ 		if (NULL == fgets(buf, 256, f)) break; 		if (p = strstr(buf, "ORA")) printf("%.9s\n", p); 	} 	fclose(f); 	return 0; } //ORA-00001 //ORA-20001 //ORA-30001  我给你发私信了，请你帮我解答一下。   楼上是正确的

user: user-3
content: 这样可好：  #include <stdio.h> #include <string.h> int main(void) { 	FILE *f = fopen("1.txt", "r"); 	char buf[256]; 	char *p; 	while (1) 	{ 		if (NULL == fgets(buf, 256, f)) break; 		if (p = strstr(buf, "ORA")) printf("%.9s\n", p); 	} 	fclose(f); 	return 0; } //ORA-00001 //ORA-20001 //ORA-30001

user: user-4
content: fgets/feof
user-0 提问: 关于%ld的问题

回复:
user: user-1
content: %ld : long %d  : int time_t time(time_t *t) 返回值类型是time_t, 与int, long的关系不明确，所以建议转换 printf("%6ld\r", (long)(time(0)-start)):

user: user-2
content: time是unsigned long而不是int类型。

user: user-3
content: time_t start=time(0);

user: user-4
content: printf中，格式、长度说明必需输出项一致，一定得到正确结果。 否则后果自负。 负责任的编译器会帮我们检查的

user: user-5
content: long int和int可能长度不同
user-0 提问: C语言中关于字符串的返回 读取 疑问.

回复:
user: user-1
content: 传一个数组进去，copy到数组里 或者传一个malloc出来的内存空间指针进去，copy到指针指向的空间

user: user-2
content: 楼主如果是要返回一个char[]数组的话，可以把这个数组作为函数参数传入：  void *GetT(char ch[])  然后函数中需要的字符往ch里写就行了

user: user-0
content: int main() {    	MSG msg; 	char *b = (char*) calloc(255,sizeof(char)); 	b = Gett(); 	MessageBox(NULL,b,TEXT("提示"),NULL); 	printf("%s",b); }   char *Gett() {     char *a="哈哈"; 	return a;//这里返回到调用函数 被转变成指针 也就是数据所在内存地址 第一个字节的地址 } 搞定了.谢谢大家了

user: user-0
content: 引用 13 楼 leee7338 的回复:字符串对于初学者来说是个难点  再加上指针和数组  把这三者学好之后C语言就好学多了。 指针是指向一个地址的 地址就是内存地址  内存中存储着数据  这是我的理解 不知道对不对.

user: user-3
content: 字符串对于初学者来说是个难点  再加上指针和数组  把这三者学好之后C语言就好学多了。

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:#include <stdio.h> #include <string.h> #include <locale.h> char *GetT() {     char *a="哈哈"; 	return a;//这里返回到调用函数 被转变成指针 也就是数据所在内存地址 第一个字节的地址 } int main() {     char b[10];     setlocale(LC_ALL,"chs");     strncpy(b,GetT(),9);b[9]=0;     printf("[%s]\n",b);     return 0; }  为什么要用 setlocale 这个命令呢?   百度说这函数 是配置本地环境的

user: user-0
content: 引用 4 楼 jiqiang01234 的回复:[quote=引用 3 楼 qq_18599547 的回复:] [quote=引用 1 楼 jiqiang01234 的回复:]  struct A { 	char s[100]; };  A get() { 	struct  A a; 	strncpy(a.s,"哈哈", sizeof(struct A));         return a; }  这个有点看不懂 - -[/quote] 直接返回结构体的实例[/quote] 有没简单点 又 无需处理内存的方法

user: user-0
content: 引用 5 楼 leee7338 的回复:用指针做参数 把a指向的首地址带回来。 我得到 首地址指针了 如何读出数据来呢   我是新手 没系统学过 - -

user: user-0
content: 引用 10 楼 paschen 的回复:楼主如果是要返回一个char[]数组的话，可以把这个数组作为函数参数传入：  void *GetT(char ch[])  然后函数中需要的字符往ch里写就行了 我是想返回 字符串   可以我总是无法获取数据 - - 我就纳闷了 可能是我把指针和数据搞混了

user: user-4
content: 都有地址了，还怕得不到内容？

user: user-3
content: 用指针做参数 把a指向的首地址带回来。

user: user-5
content: 引用 3 楼 qq_18599547 的回复:[quote=引用 1 楼 jiqiang01234 的回复:]  struct A { 	char s[100]; };  A get() { 	struct  A a; 	strncpy(a.s,"哈哈", sizeof(struct A));         return a; }  这个有点看不懂 - -[/quote] 直接返回结构体的实例

user: user-0
content: 引用 1 楼 jiqiang01234 的回复: struct A { 	char s[100]; };  A get() { 	struct  A a; 	strncpy(a.s,"哈哈", sizeof(struct A));         return a; }  这个有点看不懂 - -

user: user-6
content: #include <stdio.h> #include <string.h> #include <locale.h> char *GetT() {     char *a="哈哈"; 	return a;//这里返回到调用函数 被转变成指针 也就是数据所在内存地址 第一个字节的地址 } int main() {     char b[10];     setlocale(LC_ALL,"chs");     strncpy(b,GetT(),9);b[9]=0;     printf("[%s]\n",b);     return 0; }

user: user-5
content: struct A { 	char s[100]; };  A get() { 	struct  A a; 	strncpy(a.s,"哈哈", sizeof(struct A));         return a; }
user-0 提问: 给定一个无符号32位二进制整数n，如何编程判断二进制数n中所有的1都是成对连续出现的？

回复:
user: user-1
content: bool check(int n){     while(n){         for(;n&1;n>>=2){ if((n&3)!=3) return false;}         n>>=1;     }     return true; }

user: user-2
content: 这样可好：  int main()//52 { 	unsigned char buf[33] = { 0 }; 	unsigned int u = 6; 	_itoa(u, buf, 2); 	printf("u=%s\n", buf); 	int i = 0, zc = 0; 	while (i < 32) 	{ 		if ('0' == buf[i]) 		{ 			if (zc % 2) 			{ 				printf("NO!\n"); 				return 0; 			} 			else zc = 0; 		} 		else 		{ 			zc++; 		} 		i++; 	} 	printf("YES!\n"); 	return 0; }

user: user-3
content: 你用11这个串左移然后与那个串作与运算 看结果就知道了

user: user-0
content: 是的，两个相邻的1，4个相邻的1，8个相邻的1。。。。 这种模式

user: user-4
content: “成对”是指两个相邻的1吗？

user: user-5
content: 引用 14 楼 haozhics 的回复:[quote=引用 12 楼 lin5161678 的回复:] int Check(uint32_t x) { 	while(x && ((x&3)==0 || (x&3)==3)) 		x>>=2; 	return !x; }  逻辑问题： 当输入6（即2进制110）时，应该返回1但该函数返回0[/quote] 你说得对

user: user-0
content: 引用 12 楼 lin5161678 的回复:int Check(uint32_t x) { 	while(x && ((x&3)==0 || (x&3)==3)) 		x>>=2; 	return !x; }  逻辑问题： 当输入6（即2进制110）时，应该返回1但该函数返回0

user: user-6
content: 参考《编译原理》中的词法分析和有限状态自动机。

user: user-5
content: int Check(uint32_t x) { 	while(x && ((x&3)==0 || (x&3)==3)) 		x>>=2; 	return !x; }

user: user-2
content: 引用 9 楼 user-7 的回复:bool Check(uint32_t x) {     while (x)     {         while ((x & 1) == 0) x >>= 1;         if ((x & 3) != 3)         {             return false;         }         x >>= 2;     }     return true; } 好算法

user: user-2
content: 引用 5 楼 lin5161678 的回复:00000000 00000000 00000000 11100000 3个相邻的1 算yes 还是no no

user: user-7
content: bool Check(uint32_t x) {     while (x)     {         while ((x & 1) == 0) x >>= 1;         if ((x & 3) != 3)         {             return false;         }         x >>= 2;     }     return true; }

user: user-0
content: 谢谢，很直接的解法

user: user-0
content: 可以具体些吗？

user: user-0
content: no'奇数个相邻的1都算no

user: user-5
content: 00000000 00000000 00000000 11100000 3个相邻的1 算yes 还是no
user-0 提问: error C2059: syntax error : '{'

回复:
user: user-1
content: //uint16 W_RESVAL[2] = { 0, 0}; 	uint16 W_RESVAL[2] = { W_Regval_H(0x05,0x88), W_Regval_H(0x05,0x88) }; 	//W_RESVAL[2] = { W_Regval_H(0x05,0x88), W_Regval_H(0x05,0x88) };

user: user-0
content: mewiteor： 我有试过，可以运行，想一开始定义个常量进去，为什么会报错呢

user: user-0
content: W_RESVAL[2]={W_Regval_H(0x05,0x88),W_Regval_H(0x05,0x88)}; 错误出在这里。。。汗

user: user-2
content: uint16 W_RESVAL[2]={0, }; W_RESVAL[2]={W_Regval_H(0x05,0x88),W_Regval_H(0x05,0x88)}; 改成：   uint16 W_RESVAL[2]={W_Regval_H(0x05,0x88),W_Regval_H(0x05,0x88)};

user: user-3
content: 话说你看一下错误不就明白了吗。。  uint16 W_RESVAL[2]={0, };   0后面的逗号。。

user: user-2
content: define不要直接换行，需要换行时在行尾加  \

user: user-2
content: 引用 5 楼 maychard1121 的回复:mewiteor： 我有试过，可以运行，想一开始定义个常量进去，为什么会报错呢因为 ={xx,xx,...} 这种写法只能用于数组初始化，之后对数组元素赋值就只能一个一个的赋值了。

user: user-4
content: 偶遇到类似问题都是用 “每次用/*...*/注释掉不同部分再重新编译，直到定位到具体语法出错的位置。” 的方法解决的。
user-0 提问: 关于sniffer中的WSAIoctl，求高人解答

回复:
user: user-0
content: 这个是错误

user: user-0
content: 感谢提醒哈，已经格式化了

user: user-0

user: user-1
content: 什么错误贴出来, 这个编译器没用过

user: user-2
content: 在Windows下开发，不用VS是自虐或装B！

user: user-3
content: 你用的什么编辑器，  我用vs2012 编译你的代码完全没问题的

user: user-4
content: 代码格式化一下，一般哪有个高兴找你的71行。
user-0 提问: C语言字符串转成对应的ASCii码的问题。

回复:
user: user-1
content: 这是要显示成字符串吧，跟ASCII码没什么关系，建议去搜索下标准输入输出函数的用法； 内存中的数据都是二进制，这些二进制需要按照一定的编码方式，才能转换为我们看到的各种字符，默认的编码方式是ASCII码！

user: user-0
content: 我理解能力有点差。C语言接触不深，请大家不吝赐教。小弟在此谢谢大家了

user: user-2
content: 电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

user: user-0
content: 引用 2 楼 jiqiang01234 的回复:字符串本身不就是ascii码吗？ 引用 4 楼 fly_dragon_fly 的回复:字串就是ascii码,要转成什么 两位的意思是字符串输出的时候以%s输出就是字符串，以%d输出就是ASCII？

user: user-0
content: 字符串是ASCII？  不会吧

user: user-3
content: 字串就是ascii码,要转成什么

user: user-0
content: 这个方法是可行。但是我这个项目要求把写的API封装成库  最多占用1K的内存，还要定义两个256的数组。请问 有没有简单的方法

user: user-4
content: 字符串本身不就是ascii码吗？

user: user-5
content: 这样可好：  int main(void) { 	int i = 0, n; 	char *s = "abcdef"; 	char buf[256], *p; 	p = buf; 	for (i = 0; i < strlen(s); i++) 	{ 		n = sprintf(p, "%d", s[i]); 		p += n; 	} 	printf("%s=%s\n", s, buf); 	return 0; } //abcdef=979899100101102
user-0 提问: libsvm如何在VC中使用

回复:
user: user-1
content: http://www.csie.ntu.edu.tw/~cjlin/libsvm/ 这里提供了C++的源代码，windows下的。代码注释不怎么详细，你可以自己改着用。 好像没有dll的版本。
user-0 提问: 请教动态链接库中内存释放的问题

回复:
user: user-1
content: 这个就是单纯传指针的值，函数内部分配内存跟你一毛钱关系都木有； 函数内部分配内存是这样的： FindPeak(double *&a, double *&b)； 不过很容易错；

user: user-2
content: 无new无delete 无alloc无free 无生无死

user: user-0
content: 已经解决了，原来在外部就能释放 = =

user: user-3
content: 引用 3 楼 xubinlife 的回复:[quote=引用 1 楼 user-5 的回复:] 你这个形式确定是动态库分配的内存？ 我写的有问题，麻烦再看看 结构体typedef struct{     int x;	     int y;	 }Peak; typedef struct{ 	int label; 	Peak* peaks; }Material;  动态库函数是int FindPeak(double *a,Material *b) ;  其中b->peaks = new Peak[3]; 外部调用FindPeak(a, &b); 这样的话怎么释放呢？[/quote] 从new关键字来看，用的是c++，那直接把结构体定义为下面的不就行了？为何非要手动管理内存  typedef struct{ int label; std::vector<Peak> peaks; }Material;

user: user-0
content: 引用 2 楼 todo9351 的回复:你确定b是动态库里分配的？而不是由外部传入？？ 我化简了下。。写错了，麻烦看看上面的修改

user: user-0
content: 引用 1 楼 user-5 的回复:你这个形式确定是动态库分配的内存？ 我写的有问题，麻烦再看看 结构体typedef struct{     int x;	     int y;	 }Peak; typedef struct{ 	int label; 	Peak* peaks; }Material;  动态库函数是int FindPeak(double *a,Material *b) ;  其中b->peaks = new Peak[3]; 外部调用FindPeak(a, &b); 这样的话怎么释放呢？

user: user-4
content: 你确定b是动态库里分配的？而不是由外部传入？？

user: user-5
content: 你这个形式确定是动态库分配的内存？
user-0 提问: c实现对结构体数据分组求和

回复:
user: user-1
content: 上点代码来看看啊

user: user-2
content: lz应该数的是结构体数组sdata[]吧，以下给出伪代码： agroup=sdata[0].group; int sum[x];//和数组，自己确定大小 int y=0; for(int i=0;i<Number；i++) {  if(agroup==sdata[i].group)     sum[y]+=sdata[i].value; else {    sum[++y]=sdata[i].value;    agroup=sdata[i].group; } }

user: user-3
content: 你是要怎么分组 你的分组规则是什么

user: user-4
content: std::map

user: user-0
content: 有大神在吗？
user-0 提问: fseek计算文件长度出问题，请教

回复:
user: user-1
content: 加断点看下文件有没打开成功

user: user-2
content: 什么信号？ 这个函数？ void (__cdecl *signal(    int sig,     void (__cdecl *func ) (int [, int ] )))     (int);

user: user-3
content: 不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了

user: user-4
content: 引用 3 楼 maychard1121 的回复:文件是打开成功的，数据 2067 2065 2061 2059 2055 2053 2050 2049 2049 这样的数据16515个 ftell返回的是字节数

user: user-0
content: 文件是打开成功的，数据 2067 2065 2061 2059 2055 2053 2050 2049 2049 这样的数据16515个
user-0 提问: for语句条件成立也没有执行

回复:
user: user-0
content: 谢谢各位的帮助下，小的的代码页到问题了，是M的赋值问题。真是强大

user: user-1
content: 这样可好：  #include <iomanip> #include <iostream> using namespace std; typedef struct SNode { 	int nData; 	struct SNode *next; }SNode, *LinkList; void CreateList(LinkList &L, int n) { 	//int i = n; 	int i = 2; 	L = (SNode*)malloc(sizeof(SNode)); 	L->nData = 1; 	L->next = NULL; 	LinkList p = L; 	while (i <= n) 	{ 		p->next = (LinkList)malloc(sizeof(SNode)); 		p = p->next;    //zx 		p->nData = i; 		//p->next = L->next; 		//L->next = p; 		i++; 	} 	p->next = L;   //构成环 } int main() { 	int M, N; 	int i, j = 0; 	LinkList L, temp; 	cout << "type in the value of N,M" << endl; 	cin >> N >> M; 	cout << endl; 	CreateList(L, N); 	temp = L; 	//while (temp->next != temp && temp) 	//{ 	//	for (i = M - 1; i>0; i--) 	//	{ 	//		if (temp->next == NULL) 	//			temp->next = L->next; 	//		else 	//			temp = temp->next; 	//	} 	//	cout << temp->next->nData << endl; 	//	temp->next = temp->next->next; 	//} 	i = 1; 	while (i < N) 	{ 		j = 0; 		while (1) 		{ 			if (0 != temp->nData) 			{ 				if (++j == M) break; 			} 			temp = temp->next; 		} 		cout << setw(3) << temp->nData; 		temp->nData = 0; 		i++; 	} 	while (0 == temp->nData) temp = temp->next; 	cout << endl << temp->nData << endl; 	return 0; }

user: user-0
content: 引用 5 楼 fly_dragon_fly 的回复:M的值是多少 可以自己设的

user: user-0
content: #include <iostream> using namespace std; typedef struct SNode {     int nData; 	struct SNode *next; }SNode,*LinkList;  void CreateList(LinkList &L,int n) { 	int i = n;     L = (SNode*)malloc(sizeof(SNode)); 	L->next = NULL; 	LinkList p; 	while(i!=0) 	{ 		p = (LinkList)malloc(sizeof(SNode)); 		p->nData = i; 		p->next = L->next; 		L->next = p; 		i--; 	} }  void main() { 	int M,N; 	int i,j=0; 	LinkList L,temp; 	cout<<"type in the value of N,M"<<endl; 	cin>>N>>M; 	cout<<endl;     CreateList(L,N); 	temp = L; 	while(temp->next != temp && temp) 	{ 		for(i=M-1;i>0;i--) 		{          if(temp->next == NULL) 		    temp->next = L->next; 		 else 			temp = temp->next; 		}         cout<<temp->next->nData<<endl; 		temp->next = temp->next->next; 	} 	cout<<temp->nData<<endl; } 完整的代码。其实就是个简单的约瑟夫环的问题，可是自己写的就是有问题

user: user-2
content: M的值是多少

user: user-3
content: 在for语句内外都打印循环变量不就清楚了吗？

user: user-4
content: 单步调试还看不出问题？

user: user-0
content: [quote=引用 1 楼 user-5 的回复:] 你调试过了吗，确定没有执行，最好把完整的代码贴出来 确定

user: user-5
content: 你调试过了吗，确定没有执行，最好把完整的代码贴出来
user-0 提问: 求大牛帮助 ，我这个代码错在哪里 ，不知道错在哪里

回复:
user: user-0
content: 回复楼上版主 我这个问题出在 （*p)[6]这个作为函数参数 不是特别了解 ， 我刚学习c   里面的循环模块我自己调试的 。谢谢楼上大神的指教，和建议。

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

user: user-0
content: 谢谢楼上的回答 我是个初学者哈

user: user-2
content: 修改如下：  //65.二维数组排序。设有4×5的数组M， //通过排序使M[1][1]≤M[1][2]≤...≤M[1][5]≤M[2][1]≤M[2][2]≤...≤M[2][5]≤...≤M[4][1]≤M[4][2]≤...≤M[4][5]。 //排序时不允许引入其它数组。 #include<stdio.h> int sortarray(int(*s)[6])     //模块出错了 { 	int i = 0, j = 0, k, temp = 0; 	//for (i = 0; i < 4 * 5; i++) 	//{ 	//	for (j = 0; j<4 * 5 - i - 1; j++) 	//	{ 	//		if (s[j / 5 % 4][j % 5]>s[(j + 1) / 5 % 4][(j + 1) % 5]) 	//		{ 	//			temp = s[(i + 1) / 5 % 4][(i + 1) % 5]; 	//			s[j / 5 % 4][i % 5] = s[(j + 1) / 5 % 4][(j + 1) % 5]; 	//			s[j / 5 % 4][j % 5] = temp; 	//		} 	//	} 	//} 	for (i = 0; i < 5; i++) 		for (j = 1; j < 6; j++) 			for (k = 0; k < 6 - j; k++) 			{ 				if (s[i][k] > s[i][k + 1]) 				{ 					temp = s[i][k]; 					s[i][k] = s[i][k + 1]; 					s[i][k + 1] = temp; 				} 			} } int initarray(int(*s)[6])     //模块出错了 { 	int i = 0, j = 0; 	for (i = 0; i < 5; i++) 	{ 		for (j = 0; j < 6; j++) 		{ 			s[i][j] = rand() % 100; 		} 	} } int printfarray(int(*s)[6]) { 	int i = 0, j = 0; 	for (i = 0; i < 5; i++) 	{ 		for (j = 0; j < 6; j++) 		{ 			printf("\t%d", s[i][j]); 		} 		putchar('\n'); 	} 	printf("\n"); } int main() { 	int a[5][6] = { 0 }; 	initarray(a); 	printfarray(a); 	sortarray(a); 	printfarray(a); 	return 0; }
user-0 提问: VC C++ 6.0出现的bug吗？

回复:
user: user-1
content: 额，初学者要善于观察啊。这种错误还会犯的。不过会犯错是好事来的。

user: user-0
content: 引用 3 楼 cutmelon 的回复:尖括号和圆括号不是一码事啊！感谢指正，感谢！

user: user-0
content: 引用 2 楼 iyomumx 的回复:#include <stdio.h> 你真的好好对比过吗感谢各位大大，对我这些小错误，指正！ 感谢！

user: user-0
content: 引用 4 楼 u014306011 的回复:额，初学者要善于观察啊。这种错误还会犯的。不过会犯错是好事来的。 x谢谢！

user: user-2
content: 你的头文件不能用圆扣号。。。可以用""可能你会分清楚点

user: user-3
content: 尖括号和圆括号不是一码事啊！

user: user-4
content: #include <stdio.h> 你真的好好对比过吗

user: user-5
content: 没看出什么问题啊！
user-0 提问: C代码的size是个什么样的概念

回复:
user: user-1
content: SIZE(1)                      GNU Development Tools                     SIZE(1)    NAME        size - list section sizes and total size.  SYNOPSIS        size [-A|-B|--format=compatibility]             [--help]             [-d|-o|-x|--radix=number]             [-t|--totals]             [--target=bfdname] [-V|--version]             [objfile...]  DESCRIPTION        The GNU size utility lists the section sizes---and the total size---for        each of the object or archive files objfile in its argument  list.   By        default,  one  line of output is generated for each object file or each        module in an archive. $ size /usr/bin/size              text    data     bss     dec     hex filename  390531    1624   16996  409151   63e3f /usr/bin/size $

user: user-2
content: 理解和讨论之前请先学会如何观察！  Windows：dumpbin.exe Linux：objdump

user: user-3
content: 引用 2 楼 batigol198 的回复:[quote=引用 1 楼 zhangxiangDavaid 的回复:] 你说的size，是指最后可执行文件的大小吗？  指的是 code size啊。[/quote] 呵呵，你认为什么才算是code size？ 除此之外，编译器还会添加一些代码、exe文件也有自身的格式…… 所以，粗略的讲，当然不是

user: user-0
content: 引用 1 楼 zhangxiangDavaid 的回复:你说的size，是指最后可执行文件的大小吗？  指的是 code size啊。

user: user-3
content: 你说的size，是指最后可执行文件的大小吗？
user-0 提问: 关于 malloc的问题 ， 

回复:
user: user-1
content: 引用 3 楼 zhangxiangDavaid 的回复:当然是在你不用的时候+1

user: user-2
content: 要是java的话，会自己释放空间的

user: user-3
content: 申请,使用,释放 这是个好习惯

user: user-4
content: 一般来说都是类的成员函数吧，这样把也指针写成成员，析构里面释放； 如果不是类就用静态指针，什么时候都可以释放； 什么都不做就是坑爹，不要指望调用者帮你释放，人家很忙的！

user: user-5
content: 谁污染谁治理。

user: user-6
content: 应该是在调用完这个函数之后，在开辟内存的函数中free，始终要记住的是：哪里开辟，哪里释放。

user: user-7
content: 我在自己家里用彩陶做了一个盘子 ， 后来我把这个盘子的使用权租给邻居使用 ， 那我应该在什么时候和什么地方砸碎它呢 。。 如果不

user: user-8
content: malloc()和free()是成对出现的，你申请一片内存之后 可以立刻释放  也可以等你操作完你指针指向内存里的数据再释放。那要看你具体情况了。内存泄漏这个问题很严重。

user: user-9
content: 这时你需要写一个"这个函数"以及"这个函数外面"都认识的一套规则  bool MyMalloc(size_t sz, void** ppMem); void MyFree(void* pMem);  然后都使用这两个函数就可以了,更复杂点可以用ref机制

user: user-10
content: 谁负责申请，谁负责释放。

user: user-11
content: 你再提供一个free的接口供别人调用，别人用完了自然得调用这个接口。 如果调用方直接free你dll里面申请得内存，会有问题的

user: user-12
content: 始终不free，会造成内存泄露

user: user-12
content: 当然是在你不用的时候

user: user-13
content: 在使用完这个空间之后在这个函数中free，另外你最好把代码贴出来，这样大家也好帮你

user: user-0
content: 如果不free 的话 ， 生成dll以后 在c#中调用 ， 他总告诉我 指针错误 ，debug assertion failed ，
user-0 提问: IntelliSense: 不能将 "void *" 类型的值分配到 "char*" 类型的实体

回复:
user: user-1
content: 强制转换就没问题了

user: user-2
content: 该disable的warning还是要disable的。

user: user-3
content: 不要忽视warning 给你的代码加上cast而不是disable warning 看InteeliSense的文档如何disable warning

user: user-4
content: 即使是警告，也不要忽略

user: user-4
content: (char*)强转一定可以解决问题，但你要保证逻辑上可行。

user: user-0
content: 加一个指针强制类型转化就可以了，但类似的地方太多，不想去改了
user-0 提问: 关于变量存储的问题

回复:
user: user-1
content: 用debugger看看这些地址呢？

user: user-2
content: static是在全局数据区中。  dumpbin.exe  VMMap 是进程虚拟和物理内存分析实用工具。http://technet.microsoft.com/zh-cn/sysinternals/dd535533

user: user-3
content: 引用 5 楼 wjjll123 的回复:[quote=引用 1 楼 jiqiang01234 的回复:] 内存区域不只是“栈区”和“堆区”这两个。 这个文章写得比较清晰http://blog.csdn.net/yiya1989/article/details/8957370 恩，写的很详细，不过还有一点请教一下，以上的几种情况，变量还有值，是放在虚拟内存中还是实际的物理内存中？ [/quote] 虚拟内存，操作系统分配出去的内存，都是虚拟内存。物理内存由操作系统管理，会映射为虚拟内存。

user: user-0
content: 引用 1 楼 jiqiang01234 的回复:内存区域不只是“栈区”和“堆区”这两个。 这个文章写得比较清晰http://blog.csdn.net/yiya1989/article/details/8957370 恩，写的很详细，不过还有一点请教一下，以上的几种情况，变量还有值，是放在虚拟内存中还是实际的物理内存中？

user: user-0
content: 引用 2 楼 user-5 的回复:引用char* pc = "abc"; pc存储在什么里面，abc存储在什么里面 pc是 栈 "abc"  可能是在代码段 (根据具体实现不同而不同 只要求是静态存储)  引用char* newpc = pc; newpc存储在什么里面，newpc里面的abc是不是和pc里面的abc存放在一个位置 newpc 栈 是存放在同一个位置   引用char* mallpc = (char*)malloc(10); strcpy(mallpc, pc);mallpc存储位置是什么？mallpc里面的abc是不是和pc里面的abc是同一个abc??? mallpc 栈 不是同一个abc   还有一个问题请教一下，以上的几种情况，变量还有值，是放在虚拟内存中还是实际的物理内存中？

user: user-4
content: 楼上正解 lz不要太纠结

user: user-5
content: 引用char* pc = "abc"; pc存储在什么里面，abc存储在什么里面 pc是 栈 "abc"  可能是在代码段 (根据具体实现不同而不同 只要求是静态存储)  引用char* newpc = pc; newpc存储在什么里面，newpc里面的abc是不是和pc里面的abc存放在一个位置 newpc 栈 是存放在同一个位置   引用char* mallpc = (char*)malloc(10); strcpy(mallpc, pc);mallpc存储位置是什么？mallpc里面的abc是不是和pc里面的abc是同一个abc??? mallpc 栈 不是同一个abc

user: user-3
content: 内存区域不只是“栈区”和“堆区”这两个。 这个文章写得比较清晰http://blog.csdn.net/yiya1989/article/details/8957370
user-0 提问: 菜鸟求助，度娘后不明所以（编译成功，运行中途停止不动） 在线等

回复:
user: user-0
content: 引用 5 楼 wang0635 的回复:scanf("%d %d \n",&i,&j);   去掉 \n 引用 5 楼 wang0635 的回复:scanf("%d %d \n",&i,&j);   去掉 \n 引用 7 楼 wxymails 的回复:[quote=引用 6 楼 wt592376761的回复:]两个解决方案 （1）把 scanf("%d %d \n",&i,&j);中的\n 除掉（PS：好像scanf这类输入语句不能带转义符，\n,\t这类的）。 （2）输入的时候 输入3个数字就可以继续了。 [/quote] 谢谢各位，用你们提供的方法，已解决问题，另外第二个方法不太明白，为什么输入3个数字就可以呢？

user: user-1
content: scanf （ "非输入控制符 输入控制符"，输入参数）； 非输出控制符必须原样输入 例子:  int main() {       int num=0;       scanf("%d\n",&num);       printf("%d\n",num);       return 0; }  运行时：输入一个数字之后回车  光标停在下一行但没有出现结果   再输入\n才输出num. 用scanf 不要加入“\n”非输入控制符，系统在运行时会自动换行.

user: user-2
content: 引用 6 楼 wt592376761的回复:两个解决方案 （1）把 scanf("%d %d \n",&i,&j);中的\n 除掉（PS：好像scanf这类输入语句不能带转义符，\n,\t这类的）。 （2）输入的时候 输入3个数字就可以继续了。

user: user-3
content: Turbo C或Borland C用Turbo Debugger调试  bc++3.1 帮助里面对每个函数都有一小段能拷贝出来运行看效果的例子程序。非常适合初学C语言。相比较而言VC带的帮助MSDN就没有。http://download.csdn.net/source/2805028

user: user-4
content: 两个解决方案 （1）把 scanf("%d %d \n",&i,&j);中的\n 除掉（PS：好像scanf这类输入语句不能带转义符，\n,\t这类的）。 （2）输入的时候 输入3个数字就可以继续了。

user: user-5
content: scanf("%d %d \n",&i,&j);   去掉 \n

user: user-6
content: 死循环吧

user: user-0
content: 我用TC编译的。

user: user-0
content: 你好，修改之后，运行直接跳出。如图

user: user-7
content: 首先 main（）缺少类型void   scanf换成  scanf_s #include<stdio.h>  void main() { 	int i; 	int j; 	int k; 	/*char u = 0xe3;*/ 	/* printf("insert i j ratings: \n");*/  	scanf_s("%d %d \n", &i, &j); 	printf("i,k is OK! \n"); 	k = i + j; 	printf("k = i + j. \n");  	/* printf("%d %d \n",k,(unsigned char)u);*/ 	/* printf("&i = %u;&j = %u;&k = %u \n,&i,&j,&k"); 	printf("int = %d \n",sizeof(char)); 	printf("int = %d \n",sizeof(int)); 	printf("i = %d \n",*&(char)k);*/  	/* printf("k = %d \n",&k); 	printf("k is ok !");*/ }
user-0 提问: 哪位大大帮我看下个阵列问题！谢谢先了

回复:
user: user-1
content: 别忘了前面的 n++ 到取余时 n=1

user: user-2
content: 这里的n,是一个计数器。当他是五的倍数时，打印换行。如果把n改为1;那么第一排应该只会打印4个数。后面的应该会5个数。所以你的10会跑到下面去吧！

user: user-3
content: 常用技巧 n%5==0 n是5的倍数即可换行。 自然0也是5的倍数

user: user-4
content: 每5个一换行,开始确实有个换行