Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 我是初学者，主要是C语言指针数组的问题，求教各位。

回复:
user: user-1
content: 学会做饭比把这顿吃饱更重要。

user: user-2
content: 引用 4 楼 sjxzjw 的回复:不会栈，我不会调试  学会调试比解决问题更重要  http://jingyan.baidu.com/article/c910274bc7ed0acd371d2d78.html

user: user-3
content: 引用 6 楼 sjxzjw 的回复:printf这个方法已经领悟了，但感觉对这个用处不大 这个方法很好用

user: user-4
content: 引用 4 楼 sjxzjw 的回复:不会栈，我不会调试  告诉你一个最笨最简单的办法，每行之间加个打印 printf(""); 打印内容自己加，这样你就知道你的代码大概运行到哪里出问题的了  另外你贴出的代码的问题，printf("%s\n",*p[k]);; 字符串打印不能加*，printf("%s\n",p[k]);即可 至于这个功能如何实现，我觉得你不能去看别人写的，还是把你自己这段代码修改出来最好

user: user-0
content: 不会栈，我不会调试

user: user-2
content: 停止时点中断，然后通过调用堆栈、变量窗口等观察分析原因  建议；不要觉得是初学者就不自己思考，否则你无法进步

user: user-5
content: #include<stdio.h> #include<stdlib.h> #include<math.h> long sum( long a){     int t=0,i=0;     unsigned int a1=0;     unsigned int c[25]={0};     while(a){         c[i]=a%10;         a/=10;         i++;     }        t=i;     for(i=0;i<t;i++)     a1+=pow(c[i],t);        return a1; } int main(){     unsigned int a;     while(scanf("%u",&a)!=EOF)     { 		if(a==0){ 			break; 		}         if (a==sum(a)){ 			printf("YES "); 		}else{ 			printf("NO "); 		}              }     return 0; }

user: user-0
content: printf这个方法已经领悟了，但感觉对这个用处不大

user: user-6
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。  代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。
user-0 提问: 请问如何在程序中隐藏硬编码字符串

回复:
user: user-1
content: 比如在我这段代码生成的exe里面你就找不到abcdefg这个字符串： #include <stdio.h> const char* str="ａｂｃｄｅｆｇ"; char t[8]; int i; int main() {     for (i=0;i<7;i++) t[i]=*(unsigned char *)(str+1+i*2)-0xE1u+'a';     t[i]=0;     printf("[%s]\n",t);     return 0; }

user: user-0
content: 在生成二进制文件后，代码中的硬编吗部分会被生成类似下面这样的一段数据。这样里面的信息很容易就被看到了。 我是想法是能不是让这段秘钥不出现在这个位置。如果分散再其它地方的话相信在一个很大的文件中取找并不是什么容易的事情   empty return str=%s text str=%s %2.2x get info start.... get_imsi get_imei get_mac get_device_id imsi imei mac device_id get_password_start 1 2 3 4 5 6 get_password_end pass_md5 json:%s  N9__gnu_cxx24__concurrence_lock_errorE  N9__gnu_cxx26__concurrence_unlock_errorE    __gnu_cxx::__concurrence_lock_error __gnu_cxx::__concurrence_unlock_error   std::bad_alloc  basic_string::at    basic_string::copy  basic_string::compare   basic_string::_S_create basic_string::erase basic_string::_M_replace_aux    basic_string::insert    basic_string::replace   basic_string::assign    basic_string::append    basic_string::resize    basic_string::_S_construct null not

user: user-2
content: 引用 11 楼 hw80520997 的回复:[quote=引用 9 楼 akirya 的回复:] 通过自定义一个运算得到 key  昨天晚上我也想过这个。比如弄个字符串数组然后用下标来去。可是下标的key不又是硬编的了吗[/quote] 客户端要存key，那么必然有方法找到的。只不过是难易程度有区别。

user: user-0
content: 引用 9 楼 akirya 的回复:通过自定义一个运算得到 key  昨天晚上我也想过这个。比如弄个字符串数组然后用下标来去。可是下标的key不又是硬编的了吗

user: user-0
content: 引用 8 楼 zhao4zhong1 的回复:const char* str =“ａｂｃｄｅｆｇ”;//(^_^)  我想改的可是帖子没权限编辑  其实我想要的就是一段秘钥被硬编到二进制程序里不容易被人轻易找到肯破译

user: user-1
content: const char* str =“ａｂｃｄｅｆｇ”;//(^_^)

user: user-1
content: 引用 1 楼 user-6 的回复:服务器加密，服务器返回字符串。  否则，请楼下的解释让lz不要陷入无尽的加密/解密中。 奉劝楼主不要把有限的生命浪费在无限的加密解密死循环中！

user: user-2
content: 通过自定义一个运算得到 key

user: user-3
content: 那你存储加了密的字符串，然后使用时自己解密，不过即使这样，别人仍然是有办法通过反汇编破解得到你的解密算法

user: user-0
content: 希望大家能给一个解决方案。要是能让秘钥可以更新就更好了。但是需要一个完整周密在方案才能做到秘钥从服务器传输到客户端联给截获。而且客户端是手机。都是非登陆用户，还有如果要更新秘钥那秘钥在保存也是个问题

user: user-1
content: 没事到“看雪论坛”逛逛。

user: user-4
content: 引用 7 楼 zhao4zhong1 的回复:[quote=引用 1 楼 user-6 的回复:] 服务器加密，服务器返回字符串。  否则，请楼下的解释让lz不要陷入无尽的加密/解密中。 奉劝楼主不要把有限的生命浪费在无限的加密解密死循环中！ [/quote]  只要写个函数，得到字符串的过程弄复杂一些，很多人就不再试图跟踪了，当然了，对于赵老湿这种啥都看汇编，到处下断点，能找到最后结果的人就不值一哂了。

user: user-0
content: 引用 2 楼 Saleayas 的回复:既然你密钥，那么就不可能让别人知道， 所以就算真的隐藏了，也没有用的。  我没太理解你的意思。不想让别人知道为什么隐藏没用呢

user: user-0
content: 引用 1 楼 user-6 的回复:服务器加密，服务器返回字符串。  否则，请楼下的解释让lz不要陷入无尽的加密/解密中。  需求是这样的。客户端程序需要收集一些手机的本地信息然后加密传回服务器端。这个过程不希望被别人破译。一方面怕别人拿到这些信息。另一方面也怕别人了解算法和密钥后构造数据欺骗服务器

user: user-5
content: 既然你密钥，那么就不可能让别人知道， 所以就算真的隐藏了，也没有用的。

user: user-6
content: 服务器加密，服务器返回字符串。  否则，请楼下的解释让lz不要陷入无尽的加密/解密中。
user-0 提问: vc++6.0在debug时让指定可执行文件名是怎么回事

回复:
user: user-1
content: 引用 3 楼 pkuzhx 的回复:这个老古董还有人在用啊 新手表示都在用

user: user-2
content: 引用 9 楼 xian_wwq 的回复:lz的默认启动项目类型是dll，无法启动，切换到可执行的项目进行调试吧

user: user-3
content: lz的默认启动项目类型是dll，无法启动，切换到可执行的项目进行调试吧

user: user-4
content: 老手也在用VC6。 特此证明。  引用 7 楼 jennyvenus 的回复:一直使用vc6 抱团取暖

user: user-5
content: 一直使用vc6

user: user-4
content: 老手也在用VC6。 特此证明。

user: user-6
content: 这个老古董还有人在用啊

user: user-7
content: 引用 3 楼 pkuzhx的回复:这个老古董还有人在用啊 不用这个用哪个，初学者不都是用这个嘛？

user: user-8
content: 你这是dll工程？

user: user-0
content: 这是截图
user-0 提问: C语言二维数组

回复:
user: user-1
content: 你找到错了就最好，这种最好自己慢慢编译运行慢慢找问题

user: user-2
content: 刚看完题目

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

user: user-4
content: 帮结帖

user: user-0
content: 我自己找到了~·

user: user-0
content: 期待大神的到来~~·
user-0 提问: 有研究过代码相似度检测程序SIM吗？

回复:
user: user-1
content: 好奇楼主用在什么产品上？汇编代码量很大吗

user: user-2
content: 我的毕业论文也是这个，还没想法呢，哎，没看到哪篇文章讲的很清晰

user: user-3
content: 至少现在没有。
user-0 提问: 编译错误 undefined reference to '__udivdi3'

回复:
user: user-0
content: 有添加libgcc的编译链接。

user: user-1
content: 引用 2 楼 maxwell11 的回复:是在windows下编译的，再者不确定我要在反编译中什么内容。 建议使用dumpbin命令查看.lib文件。

user: user-2
content: 引用 5 楼 mLee79 的回复:这几个函数应该是 libgcc 的,  链接选项加上 -lgcc 就是了.. 如果完全不想引入 libgcc 就去gcc代码里把相应的几个几个源文件加进去...   楼主看看这个吧

user: user-3
content: 这几个函数应该是 libgcc 的,  链接选项加上 -lgcc 就是了.. 如果完全不想引入 libgcc 就去gcc代码里把相应的几个几个源文件加进去...

user: user-4
content: Link + libm

user: user-0
content: 是在windows下编译的，再者不确定我要在反编译中什么内容。

user: user-1
content: 建议使用objdump命令查看.a文件。
user-0 提问: 关于fwrite函数如果字符数组没有被占满字符数组会整体复制到目标文件中包括哪些未初始化的这个问题怎么解决

回复:
user: user-1
content: “rb+”   When the "r+", "w+", or "a+" access type is specified, both reading and writing are allowed (the file is said to be open for “update”). However, when you switch between reading and writing, there must be an intervening fflush, fsetpos, fseek, or rewind operation. The current position can be specified for the fsetpos or fseek operation, if desired.

user: user-0
content: 谢谢，这个问题解决了，但是我又发现个问题，fopen()函数用“ab+”模式打开，居然只能在文件尾添加数据，但是我想通过fseek()定位修改文件内容，我该怎么办。百度了一下，好像没有能修改文件的模式

user: user-0
content: 引用 4 楼 user-3 的回复:fread有返回读取到多少数据，你写入另外文件的时候按这个读取到的值写入具体的数据量 我也想过这个办法，但是如果从头开始读取的话我觉得太浪费时间，所以想把单词的总数存在文件的最I后四个字节里，在添加时在读取出总数再覆盖掉最后四个字节的数据，现在就是覆盖这里出问题了

user: user-2
content: fread的返回值

user: user-1
content: memset Sets buffers to a specified character.  void *memset( void *dest, int c, size_t count );  Routine Required Header Compatibility  memset <memory.h> or <string.h> ANSI, Win 95, Win NT    For additional compatibility information, see Compatibility in the Introduction.  Libraries  LIBC.LIB Single thread static library, retail version  LIBCMT.LIB Multithread static library, retail version  MSVCRT.LIB Import library for MSVCRT.DLL, retail version    Return Value  memset returns the value of dest.  Parameters  dest  Pointer to destination  c  Character to set  count  Number of characters  Remarks  The memset function sets the first count bytes of dest to the character c.  Example  /* MEMSET.C: This program uses memset to  * set the first four bytes of buffer to "*".  */  #include <memory.h> #include <stdio.h>  void main( void ) {    char buffer[] = "This is a test of the memset function";     printf( "Before: %s\n", buffer );    memset( buffer, '*', 4 );    printf( "After:  %s\n", buffer ); }   Output  Before: This is a test of the memset function After:  **** is a test of the memset function   Buffer Manipulation Routines  See Also   _memccpy, memchr, memcmp, memcpy, _strnset

user: user-3
content: fread有返回读取到多少数据，你写入另外文件的时候按这个读取到的值写入具体的数据量

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:先memset(buf,0,bufsize);  这个函数是什么功能，形参指得是什么？

user: user-1
content: 先memset(buf,0,bufsize);
user-0 提问: idea算法源码调试不成功，求大神啊！！！！

回复:
user: user-1
content: When the "r+", "w+", or "a+" access type is specified, both reading and writing are allowed (the file is said to be open for “update”). However, when you switch between reading and writing, there must be an intervening fflush, fsetpos, fseek, or rewind operation. The current position can be specified for the fsetpos or fseek operation, if desired.

user: user-0
content: 不懂啊！赵老师！在哪儿改啊！我是解密文件的时候到fopen那一步就卡主了

user: user-2
content: 出错时中断下来，通过调用堆栈、变量窗口等观察分析原因 如果是代码逻辑有问题，建议单步跟踪程序运行分析原因
user-0 提问: 一个数学问题 · · ·

回复:
user: user-1
content: 搜“四叉树”？

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:计算几何大牛:http://www.codeproject.com/KB/recipes/Wykobi.aspx 赵四老师，感觉还是不太懂。。

user: user-1
content: 在百度图片搜“四叉树”对应的链接。 你用鼠标左键多点几次感兴趣的图片，就会来到该图片所在的网页。 没准其中哪个就是论述如何使用四叉树实现二维碰撞检测的文章哟。

user: user-0
content: 引用 9 楼 zhao4zhong1 的回复:[quote=引用 8 楼 zhao4zhong1 的回复:] [quote=引用 7 楼 u010202481 的回复:] [quote=引用 6 楼 zhao4zhong1 的回复:] 搜“四叉树”？  有人给我一个提示，叫“扫描线算法”····我可能需要研究下这个了。。[/quote] 这个远不如“四叉树”，相信我。[/quote] http://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=result&fr=&sf=1&fmq=1464770068443_R&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&word=%E5%9B%9B%E5%8F%89%E6%A0%91[/quote]  我在碰撞检测中用了“扫描线算法”，感觉还是稍微有点慢，但是勉强可以。。但是这个计算临界边，就不知道效率怎么样了。。还有喔，这是什么链接喔。。

user: user-1
content: 引用 8 楼 zhao4zhong1 的回复:[quote=引用 7 楼 u010202481 的回复:] [quote=引用 6 楼 zhao4zhong1 的回复:] 搜“四叉树”？  有人给我一个提示，叫“扫描线算法”····我可能需要研究下这个了。。[/quote] 这个远不如“四叉树”，相信我。[/quote] http://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=result&fr=&sf=1&fmq=1464770068443_R&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&word=%E5%9B%9B%E5%8F%89%E6%A0%91

user: user-1
content: 引用 7 楼 u010202481 的回复:[quote=引用 6 楼 zhao4zhong1 的回复:] 搜“四叉树”？  有人给我一个提示，叫“扫描线算法”····我可能需要研究下这个了。。[/quote] 这个远不如“四叉树”，相信我。

user: user-0
content: 引用 6 楼 zhao4zhong1 的回复:搜“四叉树”？  有人给我一个提示，叫“扫描线算法”····我可能需要研究下这个了。。

user: user-2
content: 每个多边形，以他的中心，表示 在中心左右某个范围内的计算，其他不计算 这可以先用　Ｘ,Y 坐标分别排序

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:计算几何大牛:http://www.codeproject.com/KB/recipes/Wykobi.aspx  谢谢赵4老师~很有用。

user: user-0
content: 引用 1 楼 user-2 的回复:每个多边形，以他的中心，表示 在中心左右某个范围内的计算，其他不计算 这可以先用　Ｘ,Y 坐标分别排序 谢谢你的回答喔，我试了这种方式，感觉针对图形比较多的情况，还是有点慢，甚至有的好几分钟。我再想想看，谢谢你~

user: user-1
content: 计算几何大牛:http://www.codeproject.com/KB/recipes/Wykobi.aspx
user-0 提问: 关于字符串数组的问题，求帮助！！！

回复:
user: user-0
content: 引用 5 楼 paschen 的回复:[quote=引用 4 楼 edenluck 的回复:] [quote=引用 3 楼 paschen 的回复:] [quote=引用 2 楼 edenluck 的回复:] [quote=引用 1 楼 user-2 的回复:] lithdata[i].sand中sand本身也是一个数组？如果是的话，那么p应该定义为二重指针，这样p[i]才是一个指针，才能将sand直接赋值给p[i]sand是这样的char sand【256】，是我在结构体里面定义的。 那应该怎么定义呢？二重指针是 char**p;p[i] = lithdata[i].sand;这样吗？[/quote]  char**p后要为每个指针分配内存，然后再让指针指向数据[/quote] 能写下代码给我参考下吗？新手不会啊[/quote]  p=(char**)malloc(n*sizeof(char*));  //n是你指针的数量[/quote]十分感谢！！！

user: user-1
content: 引用 4 楼 edenluck 的回复:[quote=引用 3 楼 paschen 的回复:] [quote=引用 2 楼 edenluck 的回复:] [quote=引用 1 楼 user-2 的回复:] lithdata[i].sand中sand本身也是一个数组？如果是的话，那么p应该定义为二重指针，这样p[i]才是一个指针，才能将sand直接赋值给p[i]sand是这样的char sand【256】，是我在结构体里面定义的。 那应该怎么定义呢？二重指针是 char**p;p[i] = lithdata[i].sand;这样吗？[/quote]  char**p后要为每个指针分配内存，然后再让指针指向数据[/quote] 能写下代码给我参考下吗？新手不会啊[/quote]  p=(char**)malloc(n*sizeof(char*));  //n是你指针的数量

user: user-1
content: 引用 2 楼 edenluck 的回复:[quote=引用 1 楼 user-2 的回复:] lithdata[i].sand中sand本身也是一个数组？如果是的话，那么p应该定义为二重指针，这样p[i]才是一个指针，才能将sand直接赋值给p[i]sand是这样的char sand【256】，是我在结构体里面定义的。 那应该怎么定义呢？二重指针是 char**p;p[i] = lithdata[i].sand;这样吗？[/quote]  char**p后要为每个指针分配内存，然后再让指针指向数据

user: user-0
content: 引用 3 楼 paschen 的回复:[quote=引用 2 楼 edenluck 的回复:] [quote=引用 1 楼 user-2 的回复:] lithdata[i].sand中sand本身也是一个数组？如果是的话，那么p应该定义为二重指针，这样p[i]才是一个指针，才能将sand直接赋值给p[i]sand是这样的char sand【256】，是我在结构体里面定义的。 那应该怎么定义呢？二重指针是 char**p;p[i] = lithdata[i].sand;这样吗？[/quote]  char**p后要为每个指针分配内存，然后再让指针指向数据[/quote] 能写下代码给我参考下吗？新手不会啊

user: user-0
content: 引用 1 楼 user-2 的回复:lithdata[i].sand中sand本身也是一个数组？如果是的话，那么p应该定义为二重指针，这样p[i]才是一个指针，才能将sand直接赋值给p[i]sand是这样的char sand【256】，是我在结构体里面定义的。 那应该怎么定义呢？二重指针是 char**p;p[i] = lithdata[i].sand;这样吗？

user: user-2
content: lithdata[i].sand中sand本身也是一个数组？如果是的话，那么p应该定义为二重指针，这样p[i]才是一个指针，才能将sand直接赋值给p[i]
user-0 提问: char *str与*str的区别

回复:
user: user-1
content: char *str=NULL; 是在声明变量，并初始化为NULL，变量类型是char*类型， 这里*是代表是指针类型  *str=NULL  这里的*解引指针，也就是说让指针提向的值赋值为NULL  两处的*不是同一个意思

user: user-2
content: 有请赵老湿，在这个问题上，我同意赵老湿的汇编说法。

user: user-3
content: 引用 3 楼 ghx287524027 的回复:首先，char str[100]={0};初始化只是将str[0]初始化了，其余元素并没有初始化。另外，在C语言中，NULL是宏定义的空指针，虽然其值在某种意义上是零，但它是指针类型，所以*str=NULL;在类型上是不一致的，所以会报错，正确的应该是str=NULL;  你啥地方见过给数组赋值NULL这种用法？c++里面有么？ 千万不要不确定的情况下误导人  实际测试一下就知道 char test[20]; test = NULL; 编译结果：error: incompatible types when assigning to type ‘char[20]’ from type ‘void *’  在c里面，数组初始化，一般来说就是示例中的赋值0，或者memset为0，从来不可能出现NULL的用法，NULL一般只能给指针赋值，如 char *test = NULL;或者 char *test;test = NULL; 楼主对指针还是不太明白，需要再去看看教材。*test表明的是test指向的内容了，那么如果执行 *test = NULL;那么会给你一个警告，warning: assignment makes integer from pointer without a cast，test是指针，NULL是指针，而*test指的是内容 比如   int x = 12; int *p; p = NULL; *p = 12; p = &x;  自己装个编译环境，对不明白的代码进行直接编译运行测试，对警告和错误进行分析，可以找到问题的原因。

user: user-4
content: 引用 3 楼 ghx287524027 的回复:首先，char str[100]={0};初始化只是将str[0]初始化了，其余元素并没有初始化。另外，在C语言中，NULL是宏定义的空指针，虽然其值在某种意义上是零，但它是指针类型，所以*str=NULL;在类型上是不一致的，所以会报错，正确的应该是str=NULL;  char str[100] = {0}; 会将 str 的全部元素初始化为 0 。  数组不是指针，不能被赋值，给数组赋值（str = NULL） 是错误的。

user: user-5
content: char str[100]={0}; 这是在栈上分配了100个char内存，所以可以往这里面写东西 //char *str=NULL; 这个就一个指针，没分配内存，试图往它指向的内存写东西自然就挂了

user: user-0
content: 谢谢楼上各位的解答，小弟受教了。

user: user-6
content: 首先，char str[100]={0};初始化只是将str[0]初始化了，其余元素并没有初始化。另外，在C语言中，NULL是宏定义的空指针，虽然其值在某种意义上是零，但它是指针类型，所以*str=NULL;在类型上是不一致的，所以会报错，正确的应该是str=NULL;

user: user-6
content: NULL是指针类型

user: user-7
content: char str[100]; *str=NULL; 等价于 char str[100]; str[0]=NULL;  C++中, NULL一般就是0，这句一般合法，C中NULL一般是 (void*)0，这就不行了， 怎能将指针付给char类型的数据呢
user-0 提问: c语言写停车场管理系统，计算停车时间运行结果比实际值大0.01，求大神解答！急！谢谢！（代码在下边儿）

回复:
user: user-1
content: 浮点数一般是有误差的。想要准确表示，就全用整数

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

回复:
user: user-1
content: 因为a-z的ascii码是顺序排列的，a-'a' 、 b-'a' 就是在获得他们距离字母a的距离，也就是序号

user: user-2

user: user-3
content: 因为 小写字母a~z,大写字母 A~Z 在 ASCII是顺序编码的
user-0 提问: 求助啊  不知道哪里错了

回复:
user: user-0
content: 引用 2 楼 xigua1102 的回复:是基础没学好还是怎么的，乱写的么 仔细看看代码  void stationinit(carstation s) 这个参数是什么，s.top=0; 看你里面怎么用的  定义一个 carstation fhh;这样定义，fhh已经有存储空间了， Arrive(carstation *s) 里面，你又去申请空间，是个什么鬼    初学者。。 懂了！  谢谢

user: user-1
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。  代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-2
content: 是基础没学好还是怎么的，乱写的么 仔细看看代码  void stationinit(carstation s) 这个参数是什么，s.top=0; 看你里面怎么用的  定义一个 carstation fhh;这样定义，fhh已经有存储空间了， Arrive(carstation *s) 里面，你又去申请空间，是个什么鬼

user: user-3
content: void stationinit(carstation s)  改成  void stationinit(carstation &s)
user-0 提问: 散分＋快来报名“C语言指针与汇编内存地址（二）”公开课

回复:
user: user-1

user: user-2
content: 顶一下  露个脸。。

user: user-3
content: 散分是怎么个意思

user: user-4

user: user-5
content: 顶一下，正在学习这方面的知识

user: user-6
content: 我前几天听了赵老师的课 感觉用工具来分析更能理解程序的内部运行 我是程序小白 完全是爱好 把学习程序当成打麻将一样的娱乐 没指望学得多好 就是别人说话听得懂就行

user: user-7
content: 平时没时间.只有等上传完了再看.

user: user-8
content: 老师，还只自学到函数这一章，可否听课？

user: user-0
content: 欢迎来评价： http://edu.csdn.net/course/comment/2344

user: user-9

user: user-8
content: 那我就报名了！老师收下我的膝盖。

user: user-10

user: user-0
content: 引用 51 楼 qcx1221 的回复:老师，还只自学到函数这一章，可否听课？ 听了总没坏处，我觉得。

user: user-11
content: 顶一顶。。。

user: user-12
content: 不明觉厉。。。

user: user-0
content: 刚看了一遍第一次课的录像。 里面既没萝莉，也没大叔！

user: user-0
content: 引用 43 楼 user-15 的回复:蹭点分，赵老师记得及时结贴.......... 怎么也得等到课讲完以后再结贴吧。

user: user-13
content: 已经报名第二期了！！！

user: user-14
content: 刚看到这个帖子，先把（1）看下，再来看（2）…… 看了视频才知道赵老师的大名……

user: user-15
content: 蹭点分，赵老师记得及时结贴..........
user-0 提问: 求用C语言编写的爱心

回复:
user: user-1
content: #include <conio.h> #include <stdlib.h> int main() {  system("chcp 437 >NUL&cls");  cprintf("%c",3);  getch();  return 0; }

user: user-0
content: 引用 4 楼 pkuzhx的回复:赵老师太坏了 ？？？？？？？？？？？？？？？？

user: user-2
content: 赵老师太坏了

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

user: user-4
content: http://www.codeceo.com/article/c-3d-heart.html

user: user-1
content: #include <conio.h> #include <stdlib.h> int main() {  system("chcp 437");  cprintf("%c",3);  getch(); }
user-0 提问: 怎么修改？

回复:
user: user-1
content: strcpy_s 比strcpy要多一个参数，用来确定缓冲区的大小  参看：https://msdn.microsoft.com/zh-cn/library/td1esda9.aspx

user: user-2
content: strcpy_s(qwords[i], SIZE, temp);

user: user-3
content: 或者直接用2个参数的用法 两个参数时： errno_t strcpy_s( char (&strDestination)[size], const char *strSource ); // C++ on

user: user-3
content: strcpy_s的用法是：  errno_t strcpy_s( char *strDestination, size_t numberOfElements, const char *strSource );  第2个参数才是size.

user: user-4
content: 函数参数写反了 看定义 errno_t strcpy_s(char *strDestination,size_t numberOfElements,const char *strSource);
user-0 提问: 一个纯C程序，在vc里面运行正常，但gcc下面变异后执行总是提示段错误

回复:
user: user-1
content: 1、打开core：ulimit -c unlimited 2、gdb core

user: user-2
content: 呃，不说了，GDB吧

user: user-3
content: 你VC下是debug版？

user: user-4
content: gdb调试一下，看段错误出现在哪里～

user: user-5
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。  代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-6
content: 通常都是内存错误。vc的debug内存会有一些空间用来debug,访问越界也不会死掉。gcc没有，访问越界就死掉了。

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

user: user-8
content: 为什么不用gdb dump一下看看呢。 先设置 ulimit -c unlimited  然后用gdb [exec file] [core file]
user-0 提问: C语言的一段代码请大神解释一下

回复:
user: user-1
content: x几乎为0吧，怎可能大于 limit呢，所以while条件为假呀，不会执行循环体的

user: user-2
content: http://www.cplusplus.com/reference/random/index.html

user: user-0
content: #include <limits.h> 头文件  然后是在VS里面运行

user: user-0
content: 为什么我设置监视之后 这个n无论怎样值都是0啊
user-0 提问: 求助!vs2010编写C语言时出现错误.

回复:
user: user-0
content: 引用 2 楼 小灸舞的回复:楼主你少了个p=吧  #include <stdio.h> #include <memory.h> #include<string.h> #include <malloc.h> #include <stdlib.h> void main(){ 	struct stu{ 		int num; 		char *name; 		char sex; 		float scorce; 	} *p;   	p = (struct stu*) malloc(sizeof(struct stu)); 	p->num =100; 	p->name="xuNiu"; 	p->sex='n'; 	p->scorce=45.3; 	printf("name=%c\nnumber=%d\n",p->name,p->num); 	printf("sex=%c\nscore=%f\n",p->sex,p->scorce); 	free(p);   }  嗯，刚才没找出来，谢谢了！

user: user-0
content: 引用 1 楼 user-2的回复:p = (struct stu*) malloc(sizeof(struct stu));  p->num =100;  p->name="xuNiu"; 不好意思，这么简单错误没看出来，谢谢了！

user: user-1
content: 楼主你少了个p=吧  #include <stdio.h> #include <memory.h> #include<string.h> #include <malloc.h> #include <stdlib.h> void main(){ 	struct stu{ 		int num; 		char *name; 		char sex; 		float scorce; 	} *p;   	p = (struct stu*) malloc(sizeof(struct stu)); 	p->num =100; 	p->name="xuNiu"; 	p->sex='n'; 	p->scorce=45.3; 	printf("name=%c\nnumber=%d\n",p->name,p->num); 	printf("sex=%c\nscore=%f\n",p->sex,p->scorce); 	free(p);   }

user: user-2
content: p = (struct stu*) malloc(sizeof(struct stu));  p->num =100;  p->name="xuNiu";
user-0 提问: 为什么改这里sizeof（buf-1）会是输出三个字符

回复:
user: user-0
content: 谢谢大神们.

user: user-1
content: 我建议你这辈子不用sizeof，丝毫不会妨碍你成为IT大神。

user: user-2
content: 你这个写法相当于是buf数组下标为-1的地址。 楼主sizeof(buf-1)就知道是4，被当作了指针，所以输出了3个字符 数组下标为-1的地址对于数组来说是越界访问了，但是这个地址是有意义的  这个地址就是所申请的数组存储空间的首地址的向前偏移一个单位(也就是偏移一个当前数组类型所对应的字节数)所对应的地址。  这个地址由于没有跟着数组空间一起初始化， 所以其中的数据是不一定的， 如果是正在被系统或者其他APP使用中的地址空间，那么可以被访问，其中的数据的意义取决于被系统或者其他APP所写入的数据，但是访问后，有可能会引起系统或者其他APP异常。 如果是没有被使用的地址，那么就是一个野地址，那么其中的数据是随机的，无意义的

user: user-3
content: sizeof(buf)是求数组的大小是1024. buf-1时buf退化为char*，所以sizeof(buf-1)是救char*指针的大小是4，或许是留1位终止符，所以只能显示3个字符了吧. 你是想sizeof(buf)-1吧。
user-0 提问: KMP算法问题

回复:
user: user-0
content: 引用 6 楼 u010370871 的回复:距离上次手写这个算法过去已经很久了帮我看下嘛，找不出来错误。。。

user: user-1
content: 距离上次手写这个算法过去已经很久了

user: user-2
content: 第二个函数应该是错的，但是代码贴的让人看不下去，如果你还是找不到bug，就对比一下模板http://blog.csdn.net/huatian5/article/details/51307735

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

user: user-4
content: 单步跟踪程序运行过程来分析原因

user: user-5
content: kmp http://blog.csdn.net/zhangxiangdavaid/article/details/35569257

user: user-6
content: printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。  在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 int c; scanf("%c",&c); //时，都改为 char s[2]; int c; scanf("%1s",s); c=s[0];
user-0 提问: 一个关于Windows日志提取的代码，求怎么修改

回复:
user: user-1
content: 除了ofstream这个用于输出的流外，其它都是C的代码。改成C，只要把相关地方改成fopen，fwrite就行了。如果不会，请去复习下C语言

user: user-0
content: 引用 6 楼 luciferisnotsatan 的回复:除了ofstream这个用于输出的流外，其它都是C的代码。改成C，只要把相关地方改成fopen，fwrite就行了。如果不会，请去复习下C语言  大神，现在和没学过没啥区别了，能不能教我改成直接可以运行的形式，现在毕设就差这个程序了。。。

user: user-0
content: 引用 6 楼 luciferisnotsatan 的回复:除了ofstream这个用于输出的流外，其它都是C的代码。改成C，只要把相关地方改成fopen，fwrite就行了。如果不会，请去复习下C语言谢谢我试一下

user: user-2
content: Event Logging Functions The following functions are used with event logging.        BackupEventLog   ClearEventLog   CloseEventLog   DeregisterEventSource   GetNumberOfEventLogRecords   GetOldestEventLogRecord   NotifyChangeEventLog   OpenBackupEventLog   OpenEventLog   ReadEventLog   RegisterEventSource   ReportEvent

user: user-0
content: 不太会用。。请问有这种读取日志的C语言代码吗

user: user-2
content: 这个软件似乎有命令行接口。

user: user-0
content: 引用 楼主 baidu_35012751 的回复:是在一篇论文上看到的，本人小白不会在VC6.0下实现，求大神帮忙改改~~ 这个软件倒是有，只是想 搞清楚怎么在VC6.0下实现这段代码~

user: user-0
content: 这个软件倒是有，只是想 搞清楚怎么在VC6.0下实现这段代码~

user: user-2
content: http://www.nirsoft.net/utils/my_event_viewer.html
user-0 提问: 求助，为什么运行没有结果

回复:
user: user-1
content: #include<stdio.h>  void main() { 	int i=1,j=0; 	printf("以下的数据能同时被2，3，7整除：\n"); 	while(i<=1000) 	{ 		if(i%(2*3*7)==0) 		{printf("%d\n",i); 		   j++;	} 		   i++; 	} 	printf("%d",j); }

user: user-2
content: 因为当不满足if的时候，i不会递增，下次依然不满足    #include<stdio.h> void main() { 	int i=1,j=0; 	printf("以下数据能同时被2,3,7整除:\n"); 	while(i<=1000) 	{ 		if(i%(2*3*7)==0) 			printf("%d",i),j++,i++; 		else 			i++; 	} 	printf("共有%d个",j); }

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

user: user-4
content: 因为i++放在if语句里，只有当i%（2*3*7）==0时才自增，否则i永远为1，而1%（2*3*7）始终为1，if结果始终为假，所以i始终没有自增。

user: user-5
content: #include <stdio.h> #include<stdio.h>  void main()  {  int i=1,j=0;  printf("以下数据能同时被2,3,7整除:\n");  while(i<=1000)  { 	 if(i%(2*3*7)==0){ 		printf("%5d",i),j++; 	 } 	 i++;  }  printf("共有%d个",j);  }   i++不应该在if语句中

user: user-6
content: #include<stdio.h> void main() { int i=1,j=0; printf("以下数据能同时被2,3,7整除:\n"); while(i<=1000) { if(i%(2*3*7)==0) {   printf("%d\n",i);    j++; }   i++; } printf("共有%d个",j); } 注意一下执行顺序就好了

user: user-6
content: 问题解决了吗?
user-0 提问: 关于大顶堆的疑问

回复:
user: user-1
content: 不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？

user: user-2
content: 楼主的理解是正确的。题目自己都矛盾呢，从其说明里面看，下标 i 是要 >=1 的，后面写实现的时候，又把 [0] 用了。

user: user-3
content: 文字说明中，下标编号，不是C 语言的这种从0开始的 然而，程序是用C,C++ 编码实现的，下标是从0开始的。 大概是这样吧，有点不够严谨了
user-0 提问: 关于localtime(&timep)取时间计算的问题求帮助解决

回复:
user: user-1
content: http://en.cppreference.com/w/c/chrono/localtime  里面说到了：1) pointer to a static internal tm object on success, or null pointer otherwise. The structure may be shared between gmtime, localtime, and ctime and may be overwritten on each invocation.  就是你下一次获取时间会改变共享的那个变量值  解决办法可以返回tm，而不是指针：  tm TIME() { 	time_t timep; 	struct tm *p; 	time(&timep); 	p=localtime(&timep); 	return p; } tm tim1; tm tim2; 先取tim1=TIME(); 再取tim2=TIME();

user: user-2
content: 如果单纯求两个时间差，不需要localtime，time(&tm1) - time(&tm2); 如果要获取开始时间和结束时间，建议用struct tm变量，而不是用指针；

user: user-3
content: 因为你保存的是获取时间的指针，再下车过去时间后会更新指针指向的内容，因此你必须每次都保存时间值而不是指向它的指针
user-0 提问: 为什么会终止程序！求解啊

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

user: user-2
content: 你这是数组越界导致的，程序退出的时候会报异常 你把int a[3][4];改为int a[4][4];就行

user: user-3
content: 老老实实这样写试下 a[i][j]

user: user-4
content: 一堆星号，内存溢出啦。

user: user-5
content: 写那一堆星号就是故意想出错
user-0 提问: 请各位大神指点迷经!!!!

回复:
user: user-1
content: printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。  在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 int c; scanf("%c",&c); //时，都改为 char s[2]; int c; scanf("%1s",s); c=s[0];

user: user-2
content: 分隔符会进入缓冲区。 忽略掉的空格、回车和tab会从缓冲区消失  scanf("%c%d",&b,&num3);这句，你输入a 5然后回车 a和5之间的空格会从缓冲区被匹配走而消失，而回车符是不会的（还留在输入缓冲区）

user: user-1
content: 因为%c不能自动跳过输入缓冲区中之前遗留的一个或多个连续的空白字符（\n,\t,空格） %1s可以。

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。  在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 int c; scanf("%c",&c); //时，都改为 char s[2]; int c; scanf("%1s",s); c=s[0]; //老师你改成这样看不懂啊，你定义整形数据变量，从键盘输入字符，变量能接收到吗？？？

user: user-3
content: 老师好，请问为什么要这么改啊？ //请今后要用 int c; scanf("%c",&c); //时，都改为 char s[2]; int c; scanf("%1s",s); c=s[0];
user-0 提问: 求大神帮忙

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

user: user-2
content: 指针操作完全不对  #include <stdio.h> #include <string.h> #include <stdlib.h>  typedef struct node { 	int a[10]; 	int length; }SeqList, *PSeqList;  void Delete(PSeqList PL, int x, int y) { 	int i, j=0;  	for(i=0; i< PL->length; i++) 	{ 		if (PL->a[i]>x && PL->a[i]<y)  		{ 			j++; //			printf("found match a[%d]=%d, j=%d\n", i, PL->a[i], j); 		} 		else 		{ 			int count = PL->length-i-1; //printf("count=%d\n", count); 			PL->length--; 			if (count > 0) { 				memmove(&PL->a[i], &PL->a[i+1], sizeof(int)*count); 				i--; 			} 		} 	} }  int main(void) { 	int k; 	PSeqList PL; 	int a[10] = {2,4,3,67,35,89,233,23232,2332,23323};  	 	PL=(PSeqList)malloc(sizeof(SeqList)); 	memcpy(PL->a, a, sizeof(a)); 	PL->length = 10; 	 	Delete(PL, PL->a[0], PL->a[3]); 	 	for(k = 0; k < PL->length; k++) 	{ 		printf("%d  ",PL->a[k]); 	} }
user-0 提问: 为什么打印不出来呢

回复:
user: user-1
content: 引用 2 楼 qq_34973450 的回复:[quote=引用 1 楼 赵4老师的回复:]for(i=7;i>=1;i--) 抱歉，一时脑子断片[/quote] 脑子断片的时候，放下手头的代码，去腐败一下。

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

user: user-0
content: 引用 1 楼 赵4老师的回复:for(i=7;i>=1;i--) 抱歉，一时脑子断片

user: user-1
content: for(i=7;i>=1;i--)
user-0 提问: 关于MIB结构体的问题，请大家赐教

回复:
user: user-1
content: 引用 3 楼 asdger 的回复:下面有比较详细的解释： http://blog.sina.com.cn/s/blog_615ec1630101kq1s.html  不是结构体转换，是指针类型转换

user: user-0
content: 下面有比较详细的解释： http://blog.sina.com.cn/s/blog_615ec1630101kq1s.html

user: user-0
content: 引用 1 楼 user-1 的回复:指针类型转换 和普通的数据类型转换一样吗？

user: user-1
content: 指针类型转换
user-0 提问: 自己写的图片浏览器怎么实现右键点击启动并打开一张图片？

回复:
user: user-1
content: 搜“Shell Extension”

user: user-0
content: 引用 1 楼 u010165006 的回复:如果是C语言： int main(int argc,char *argv[]) 可以得到参数argv[1]，就是要打开的那个文件名。  MFC不清楚，C++ Builder会知道。  int APIENTRY WinMain(HINSTANCE hInstance, 		HINSTANCE hPrevInstance, 		LPSTR     lpCmdLine, 		int       nCmdShow) 第三个参数就是..居然忘了 直接把图片拖过去可以，但按照图上面选 不行..

user: user-2
content: 如果是C语言： int main(int argc,char *argv[]) 可以得到参数argv[1]，就是要打开的那个文件名。  MFC不清楚，C++ Builder会知道。
user-0 提问: 一道关于大顶堆的C语言题目

回复:
user: user-1
content: hello，顶一个。。。。

user: user-0
content: hello，顶一个

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

回复:
user: user-1
content: 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！ 不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！）  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",...);或者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-1
content: 电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……

user: user-0
content: 引用 4 楼 自信男孩的回复:在32位系统里，指针变量都是占4个字节；但是不同的指针类型，其指向的内存区域大小一样；比如，char类型的指针，在对其引用时，读取到的数值是一个字节的大小；若是int类型的指针变量，在对其引用时，读取道德数值是4个字节的大小；结构体指针，读取的是结构体大小的区域； 在32位系统里，指针变量都是占4个字节；但是不同的指针类型，其指向的内存区域大小一样；比如，char类型的指针，在对其引用时，读取到的数值是一个字节的大小；若是int类型的指针变量，在对其引用时，读取道德数值是4个字节的大小；结构体指针，读取的是结构体大小的区域；<br />  不好意思，没明白您的意思，既然指向的内存区域大小一样，为什么char类型是一个字节，int又是4个字节呢？谢谢！

user: user-2
content: 在32位系统里，指针变量都是占4个字节；但是不同的指针类型，其指向的内存区域大小一样；比如，char类型的指针，在对其引用时，读取到的数值是一个字节的大小；若是int类型的指针变量，在对其引用时，读取道德数值是4个字节的大小；结构体指针，读取的是结构体大小的区域；

user: user-0
content: 是不是可以这样理解，指针所指向的类型比如说char类型的，系统会将这个指针指向该类型，并将这一个字节之后的内存空间留给其它变量。如果指向int类型（假设为2个字节），系统会将指针指向的地址的2个字节留给该指针，其后的空间留给其它变量。 或者说指针变量有些类似数组有长度（隐含的），这个隐含的长度就是指针的类型（char，int等），而指针变量的值将是其首地址。 不知道这样理解对不对？ 谢谢大家！

user: user-3
content: 不管什么指针，在x86平台，都占用4byte. 所以指针的类型只是给编码的人阅读理解的。 其本质上都是一个32位长度的ulong. 无论什么类型的指针变量，在内存中本质上都是一样的，都是一个整数值的地址值；而这个不同的类型仅仅是向系统说明该变量在内存中占据字节的数目，如：字符型的指针变量在内存中占据一个字节、一个整形的指针变量在内存中占据四个字节等等。

user: user-4
content: sizeof(BYTE*), 就会发现不止1，指针本身占的空间和指向的类型无关，是和硬件本身有关的数据
user-0 提问: 请教C语言数据结构中的问题

回复:
user: user-0
content: 引用 3 楼 user-1 的回复:简单地说，就是看着前面！  typedef struct { int data; struct node *next;  解析器解析到这里的时候，还不知道struct node是啥，因为前面没有申明。哦哦，懂了

user: user-1
content: 简单地说，就是看着前面！  typedef struct { int data; struct node *next;  解析器解析到这里的时候，还不知道struct node是啥，因为前面没有申明。

user: user-0
content: 引用 1 楼 user-1 的回复:typedef struct node { int data; struct node *next; }node;  试试没问题了，谢谢啊，但这是什么原因呢

user: user-1
content: typedef struct node { int data; struct node *next; }node;  试试
user-0 提问: 在字符串中查找检索多个关键词（子串）比较好的方法

回复:
user: user-1
content: 这是在做全文检索么..

user: user-2
content: 谈及字符串的匹配问题的话，就不得不说字符串里面的算法了，当然本人还不熟练。 可以像楼主说的一一进行匹配，但是这种方法太麻烦，时间复杂度还高，优化后的KMP算法和ac自动机和后缀数组都很好用，当然这些算法不是很简单的。如果楼主不是搞算法的，建议稍微接触一下KMP算法就好了，这种方法毕竟使用简单点。

user: user-3
content: 每次查找时不要都从头查找，必要时记录strstr返回值，从上一次查找到的位置继续查找

user: user-4
content: 无profiler不要谈效率！！尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代！
user-0 提问: 注释到只剩下main.c的return 0;还是报错,不把头文件移除就不行请问要怎么解决

回复:
user: user-0
content: 引用 4 楼 qq423399099 的回复:如果用的是ide的话重新创建工程试试 还是不行呢... 试过重置默认,调过toolchain executable的,  引用 10 楼 zhao4zhong1 的回复:项目、属性、C/C++、附加包含目录：填写附加头文件所在目录 分号间隔多项 并不是这个问题呢

user: user-0
content: 已经解决了 是因为我在工程头文件的option处点了link和complie 不管怎样,感谢各位的回答

user: user-1
content: 项目、属性、C/C++、附加包含目录：填写附加头文件所在目录 分号间隔多项

user: user-1
content: 附加包含目录错误。我猜

user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:附加包含目录错误。我猜 错误显示为 -------------- Build: Debug in queue (compiler: GNU GCC Compiler)---------------  gcc.exe  -o bin\Debug\queue.exe C:\Users\DEREK\Desktop\duilie\bigline.h.gch obj\Debug\C\Users\DEREK\Desktop\duilie\budaitou.o obj\Debug\C\Users\DEREK\Desktop\duilie\daitou.o obj\Debug\C\Users\DEREK\Desktop\duilie\main.o obj\Debug\C\Users\DEREK\Desktop\duilie\port.o obj\Debug\C\Users\DEREK\Desktop\duilie\xunhuan.o    C:\Users\DEREK\Desktop\duilie\bigline.h.gch: file not recognized: File format not recognized collect2.exe: error: ld returned 1 exit status Process terminated with status 1 (0 minute(s), 0 second(s)) 0 error(s), 0 warning(s) (0 minute(s), 0 second(s)) 是您说的路径问题吗?

user: user-2
content: 如果用的是ide的话重新创建工程试试

user: user-3
content: 把编译命令贴出来或者代码贴出来

user: user-4
content: 这是什么文件夹不存在的意思？查看代码是否有写错路径

user: user-0
content: 代码比较长不方便贴出来,注释了依然出错可能不是代码本身的问题? 现在Bulid 上的错误是把注释去掉之后的结果 好像是路径方面的问题,不大熟悉,请大家继续指点

user: user-0
content: 更换ide版本之后点击构建,在build message处不报错 但是在Bulid log 处显示以下错误   -------------- Build: Debug in queue (compiler: GNU GCC Compiler)---------------  gcc.exe  -o bin\Debug\queue.exe C:\Users\DEREK\Desktop\duilie\bigline.h.gch obj\Debug\C\Users\DEREK\Desktop\duilie\budaitou.o obj\Debug\C\Users\DEREK\Desktop\duilie\daitou.o obj\Debug\C\Users\DEREK\Desktop\duilie\main.o obj\Debug\C\Users\DEREK\Desktop\duilie\port.o obj\Debug\C\Users\DEREK\Desktop\duilie\xunhuan.o    C:\Users\DEREK\Desktop\duilie\bigline.h.gch: file not recognized: File format not recognized collect2.exe: error: ld returned 1 exit status Process terminated with status 1 (0 minute(s), 0 second(s)) 0 error(s), 0 warning(s) (0 minute(s), 0 second(s))

user: user-5
content: https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&ch=&tn=monline_3_dg&bar=&wd=error%3A+ld+returned+1+exit+status|&rn=&oq=&rsv_pq=c543fc56000c18a7&rsv_t=ce28kApYTuAxtjle%2Faly6eqveehwnMAt0%2BxVuaURF%2B6DsHqhusMYuR8aQlMDVwo%2FqdRY&rsv_enter=1
user-0 提问: 用VC创建二叉树，感觉思路和代码都是对的，为什么总实现不了

回复:
user: user-1
content: 创建二叉树有问题,死循环  int CreateBiTree(BiTree &T) { 	char ch; 	ch = getchar(); 	fflush(stdin);/////////////////////del enter in stdin buff, only work in VC 	if(ch==' ') { 		T = NULL; 		return 0; /////////////////////need a end 	} 	else { 		if (!(T = (BiTNode *)malloc(sizeof(BiTNode)))) exit(0); 		T->data = ch; 		if (CreateBiTree(T->lchild) == 0) { //check end 			T->rchild = NULL; 			return 0; 		} 		if (CreateBiTree(T->rchild) == 0) { //check end 			return 0; 		}  	} 	 	return 1; }
user-0 提问: 请指导一个c语言题，谢谢

回复:
user: user-1
content: #include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> //isalpha   const int N = 21;  int main(void)  { 	 char num[N]; 	 gets(num); 	  	 int a = strlen(num); 	 if (a < 1) { 	 	printf("error\n"); 	 	return -1; 	 } 	 for (int b = 0; b < a; b++) // not a-1 	 { 	 	if (!isalpha(num[b])) { //not a-z or A-Z 	 		printf("error\n"); 	 		return -1; 		 } 	 	num[b] = num[b] + 4; 	 } 	 puts(num); 	  	 //pause 	 getchar();  }

user: user-0
content: 懂了，谢谢

user: user-0
content: 上面的两处{return -1}没怎么懂
user-0 提问: 为什么我运行程序之后会停止工作？是溢出了吗？

回复:
user: user-0
content: 引用 12 楼 zhao4zhong1 的回复:在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。 十分感谢，你的回答对我很有帮助，之前只是拿C语言做一些数值计算类的，现在还需要继续学习。

user: user-0
content: 引用 11 楼 qq423399099 的回复:崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。  代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。 谢谢，一直在努力。

user: user-1
content: 加几个输出语句排查一下程序是在哪块停止的

user: user-0
content: 引用 4 楼 sds428 的回复:我也是新手，学习中，呵呵，不知道可否，malloc，或，new，那东西在堆中吧，可以搞的很大的，或，全局的呢，具体我也不清楚了，共同学习 我再试试

user: user-0
content: 引用 6 楼 wenpinglaoyao 的回复:楼主，我不明白您的程序代码是怎么通过编译的。比如，在第36行的代码【double  C[numx][numy][numz];】这块，在栈上声明一个数组时，数组的大小应该是编译期就能确定的啊，但您代码里面的numx等明显不是常量啊，怎么可能编译通过呢？ 这样子在vc上的确编译不通过，但是在codeblocks上是可以编译通过的。

user: user-0
content: 引用 5 楼 user-6 的回复:出错时点中断，通过调用堆栈、变量窗口等观察分析出错原因，必要时单步跟踪程序运行，特别注意检查是否越界 好，我再试试

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

user: user-3
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。  代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-4
content: 我也是新手，学习中，呵呵，不知道可否，malloc，或，new，那东西在堆中吧，可以搞的很大的，或，全局的呢，具体我也不清楚了，共同学习

user: user-4
content: double  C[numx][numy][numz];中8*100*100*100是不是有点大了，是约8M空间吗？（呵呵，不太清楚，是不是这样计算的）如是的话，局部变量申请这大，运行时，肯定过不了吧

user: user-0
content: 引用 1 楼 sds428 的回复:刚放入vc6下跑了下，把类似于double  C[numx][numy][numz];这些改为double  C[100][100][100];等，就可以编译通过，但运行也会崩的，但把100改为10，20000改为20，就可以运行通过了， 谢谢，但是我需要的最小值就是100和20000，小一点的数值，我跑起来也会通过，那么这种情况是算溢出了吗？需要怎么改？我用的codeblocks,电脑win10 vc6不能运行。

user: user-4
content: 刚放入vc6下跑了下，把类似于double  C[numx][numy][numz];这些改为double  C[100][100][100];等，就可以编译通过，但运行也会崩的，但把100改为10，20000改为20，就可以运行通过了，

user: user-5
content: 楼主，我不明白您的程序代码是怎么通过编译的。比如，在第36行的代码【double  C[numx][numy][numz];】这块，在栈上声明一个数组时，数组的大小应该是编译期就能确定的啊，但您代码里面的numx等明显不是常量啊，怎么可能编译通过呢？

user: user-6
content: 出错时点中断，通过调用堆栈、变量窗口等观察分析出错原因，必要时单步跟踪程序运行，特别注意检查是否越界
user-0 提问: C文件处理时出了个小BUG求帮忙！

回复:
user: user-0
content: 多谢各位！已经解决！（文件问题）！

user: user-1
content: 1   #include <stdio.h>                                                                                                                                                                                          1 #include <ctype.h>     2 #include <string.h>     3       4 void  capitalization(FILE *p);     5       6 int main(void)     7 {     8     FILE *fp = fopen("1.txt", "r");     9     if (NULL == fp) {    10     |   fprintf(stderr, "Open %s Error", "1.txt");    11     |   return -1;    12     }    13     capitalization(fp);    14     return 0;    15 }    16      17      18      19      20 void  capitalization(FILE *p)    21 {    22     int i;    23     char array[100] = { 0 };    24     char str[100] = { 0 };    25      26     while (!feof(p))    27     {    28     |   fgets(array, sizeof(array), p); >> 29     |   for (i = 0; i < strlen(array); i++)    30     |   {    31     |   |   if ((isalpha(array[i])))    32     |   |   {    33     |   |   |   str[i] = toupper(array[i]);    34     |   |   }    35     |   else    36     |   {    37     |   |   str[i] = array[i];    38     |   }    39     }    40     printf("%s", str);    41     }    42 }   在Linux下测试了一下你的代码，没发现问题；我打开的文件里的数据要么是26个英文字符，要么是数字；可以将字母小写变大写，其他不变； 建议楼主查看一下要打开的文件；

user: user-2
content: 点重试——中断，断下后通过调用堆栈、变量窗口观察分析原因

user: user-3
content: 其实我也遇到过这个问题，可能是微软库的bug吧。isalpha((unsigned char)array[i])  应该就可以了。应该是你传入的字符有非ASCII字符，所以超过了127。由于MS的实现char是signed的。所以就整形提升以后就成了负数了。
user-0 提问: 一维数组与二维数组指针的区别

回复:
user: user-0
content: 谢谢回复，你的推倒很精彩

user: user-1
content: int (*p)[3]=n;  这句话是定义了一个数组指针，并且将这个二维数组的首地址赋给指针，如果p+1就代表这个指针指向二维数组第二行的首地址，printf（“%d\n”,*p),为什么输出的是数组地址呢printf("%d\n",**p);才是输出的地址中的内容呢？，，，指针p是指向一个数组，如果一个*就是取出数组第一行首地址，再加一个*就是取出内容。   而一位数组中printf("%d\n",*pn);输出的确实地址中的内容？，，，因为pn是一个指向一维数组的指针，所以pn和n差不多，只不过n是一个常量指针，不能改变指向，但是pn可以改变指向，a[1]-----*(a+1)  两者一样，数组形式只不过是编译器做了优化

user: user-2
content: 理解和讨论之前请先学会如何观察！  //char (*(*x[3])())[5];//x是什么类型的变量? // //分析C语言声明，关键是搞清楚这个变量是个什么东西（函数、指针、数组）， //是函数那么剩下的就是他的参数和返回值， //是指针那剩下部分是说明他指向什么， //是数组剩下的部分就是说明数组的成员是什么类型。 //解析C语言声明规则： //从左侧第一个标识符开始，按照优先级进行结合。*表示是..的指针，const表示只读的，volatile表示可变的，[]表示是数组，()表示是函数。 // //x和[3]结合说明是一个大小为3的数组，该数组的每个元素为一类指针，该类指针指向一类函数，该类函数无参数，返回一类指针，该类指针指向一个大小为5的char型数组 #include <stdio.h> #include <typeinfo.h> char num[5]; char (*x00())[5] {     return # } int main() {     char (*(*x[3])())[5];//是个数组，大小为3     char (*(*x0  )())[5];//数组的元素，是个函数指针     char (*( x00 )())[5];//函数原型，参数为空，返回值为指针     char (*  x000   )[5];//返回值      x0 = x00;     x[0] = x0;     x[1] = x0;     x[2] = x0;     printf("typeid(x).name() is %s\n",typeid(x).name());     return 0; } //typeid(x).name() is char (* (__cdecl**)(void))[5]

user: user-3
content: 二维数组： *p=*(p+0)=p[0]=&p[0][0] p[i][j]=*(p[i]+j)=*(*(p+i)+j)  两边取地址： &p[i][j]=p[i]+j=*(p+i)+j  如 j==0： &p[i][0]=p[i]=*(p+i)    如i==0： &p[0][0]=p[0]=*p     两边取地址：&&p[0][0]=&p[0]=p                                两边解引用：p[0][0]=*p[0]=**p

user: user-4
content: 引用 3 楼 youxirenjia90 的回复:谢谢回复，还有个问题是数组的值比如{1,2,3,4}的值是什么，是地址么  不是地址，而是数组元素的值

user: user-0
content: 如果数组{1,2,3,4}的值是地址的话，那么他的值即数组的地址，又因为数组的地址等于数组的首地址，所以该数组的值即是元素1的地址？是这样么，请问？

user: user-0
content: 谢谢回复，还有个问题是数组的值比如{1,2,3,4}的值是什么，是地址么

user: user-4
content: 因为p是指向数组的指针 *p是数组 **p才是数组中元素的值

user: user-5
content: 二维数组指针的名字是这个指针的首地址，所以*p 是指针存的内容也就是数组的地址。应该用*（p［i］）
user-0 提问: 词频统计  从文件中读取几行英文句子按字典序统计词频   结果跑出来总有段错误   望大神指点！

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

user: user-0
content: 感谢各位！问题我已经找到了，是一开始的#define MAXSIZE 太小了    line[]那个要开大一点，不过速度太慢   还需要找优化的方法

user: user-0
content: 引用 3 楼 wangyaninglm 的回复:[quote=引用 2 楼 V_ermouth 的回复:] 我单步调试可以调试到最后的return 0，然后再走一步就会报错  那是不是那里申请了空间，没有释放？[/quote] 整个程序申请的空间并没有临时用来存储的，都是在最后的链表中啊

user: user-0
content: 查看cpu窗口 然而我还看不懂汇编    请教大神是哪里错了QAQ

user: user-2
content: 在调试下运行，出错时可以断下来，通过调用堆栈、变量窗口等观察分析出错原因

user: user-3
content: 引用 2 楼 V_ermouth 的回复:我单步调试可以调试到最后的return 0，然后再走一步就会报错  那是不是那里申请了空间，没有释放？

user: user-0
content: 我单步调试可以调试到最后的return 0，然后再走一步就会报错

user: user-4
content: 单步调试 ，找到报错的代码，分析代码
user-0 提问: 求助：二维数组（已经生成并且知道行数但不知道每一列的列数）怎么冒泡排序？

回复:
user: user-0
content: 问题已经解决啦 for (i=0;_word[i][0]!='\0';i++); 	num=i;//num是单词个数 	for (i=0;i<num-1;i++){ 		for (j=0;j<num-i-1;j++){ 			if (strcmp(_word[j],_word[j+1])>0){ 						strcpy (temp,_word[j]); 						strcpy (_word[j],_word[j+1]); 						strcpy (_word[j+1],temp); 			} 		} 	} 前面有char temp[20]={0}; 不管怎么样还是谢谢你！

user: user-1
content: 新手学C，遇到相似的问题，学习一下
user-0 提问: 灵异事件，求真相。。。

回复:
user: user-1
content: 对电脑而言没有乱码，只有二进制字节；对人脑才有乱码。 void HexDump(char *buf,int len,int addr) {     int i,j,k;     char binstr[80];      for (i=0;i<len;i++) {         if (0==(i%16)) {             sprintf(binstr,"%08x -",i+addr);             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         } else if (15==(i%16)) {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);             sprintf(binstr,"%s  ",binstr);             for (j=i-15;j<=i;j++) {                 sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');             }             printf("%s\n",binstr);         } else {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         }     }     if (0!=(i%16)) {         k=16-(i%16);         for (j=0;j<k;j++) {             sprintf(binstr,"%s   ",binstr);         }         sprintf(binstr,"%s  ",binstr);         k=16-k;         for (j=i-k;j<i;j++) {             sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');         }         printf("%s\n",binstr);     } }

user: user-2
content: 字符串以\0结尾，如果找不到\0，就会一直去解析这个字符串，导致出现一些乱码

user: user-3
content: 数组没有初始化，导致printf和strlen结果错误  #include<stdio.h> #include<string.h>  const char Stop = '#'; const char Symbol_1 = '.'; const char Symbol_2 = '!'; const int MaxLen = 100;  int main(void) {   char chs[MaxLen] = {0};///////////  need init, otherwise printf chs will not work correct   int Letter; ///////////////////////// getchar return int not char   int Counts = 0;   int Times = 0;      printf("Please Input Words To Test:\n");   while ((Letter = getchar()) != Stop)   {     if (Letter == Symbol_1)     {       chs[Counts] = Symbol_2;       ++Counts;       ++Times;     }     else if(Letter == Symbol_2)     {         chs[Counts++] = Symbol_2;         chs[Counts++] = Symbol_2;         ++Times;      }      else if ((Letter == EOF) || (Letter == '\n')) //////////////////////in case the wrong input      {//parse input done      	break;      } 	 else      {         chs[Counts] = Letter;         ++Counts;      }   }   printf("%d Times\n",Times);   printf("%s\n",chs);   //<----Õâ¸öºÜÆæÝâ ---------------------->see line 10   int Len = strlen(chs);    //<---ÎÊÌâ³öÔÚÕâ3ÐÐ´úÂëÀï   for(int i = 0 ; i < Len+1 ; ++i)     printf("%c ",chs[i]);  return 0; }

user: user-0
content: 引用 3 楼 user-5 的回复:这里面有两个重点： 1. c语言的字符串是要依靠结束符'\0'来判断字符串的结尾 2. 局部变量如果不明确的初始化，它可能是任何值。可能是0，也可能不是0。1楼的memset就是一种初始化。  另一个问题：Counts不断增加的过程中每次都要判断是否超过了MaxLen，否则数组越界了很麻烦的。 其实我好奇的不是这个。。  我最好奇的是为什么我下面加了那3行（就是注释掉的），为什么上面的那句printf()会受到影响。。。

user: user-4
content: 在printf输出前面加上这个，chs[Counts] = '\0';

user: user-5
content: 这里面有两个重点： 1. c语言的字符串是要依靠结束符'\0'来判断字符串的结尾 2. 局部变量如果不明确的初始化，它可能是任何值。可能是0，也可能不是0。1楼的memset就是一种初始化。  另一个问题：Counts不断增加的过程中每次都要判断是否超过了MaxLen，否则数组越界了很麻烦的。

user: user-5
content: 大概是因为字符串结束符。 两个办法： 1. 在while之前memset(chs, 0, sizeof(chs)); 2. 在while之后chs[Counts] = '\0';

user: user-0
content: 我擦。。输出最后没的2个火星字符csdn都显示不出来。。
user-0 提问: 求解释（无法得到答案）

回复:
user: user-1
content: zdgys（）和zdgxs（）函数中没有参数abcd的事啊，怎么可能会有结果呢~

user: user-0
content: 为毛每次给分都是给分与总分不符，，，，

user: user-2
content: 1   #include <stdio.h>                                                                                                                                                                                          1        2 int greatest_common_divisor(int a, int b)   3 {      4     int common = b % a;   5     while (common != 0) {   6     |   b = a;   7     |   a = common;   8     |   common = b % a;   9     }  10     return a;  11 }     12       13       14 int main(void)  15 {     16     int n1, n2;  17     int common1, common2;    18     scanf("%d %d",&n1,&n2);  19     if (n1 > n2)  20     |   common1 = greatest_common_divisor(n2, n1);  21     else  22     |   common1 = greatest_common_divisor(n1, n2);  23     printf("Greatest Common Divisor is %d, between %d and %d\n", common1, n1, n2);  24     common2 = n1 * n2 / common1;      25     printf("Least Common Multiple is %d, between %d and %d\n", common2, n1, n2);  26 }   e, f, g, h都是什么做什么，随机变量，结果都不知道做什么的；

user: user-2
content: 最大公约数使用辗转相除法获取，最小公倍数可以通过两数相乘除于最小最大公约数；

user: user-3
content: 在你的基础上改的，其实efgh变量是多余的，直接用abcd就可以 long zdgys (int a,int b) {     int i,e = a,f = b;     for(i=e%f; i!=0;)     {         e=f;         f=i;         i=e%f;     }      return f; } long zxgbs (int c,int d) {     int j,g=c,h=d;     for (j=g;; j++)         if (j%g==0&&j%h==0)     break;     return j; }

user: user-4
content: google"辗转相除法"呗…… 祝楼主好运
user-0 提问: （long long *） double*  指针 int 数组 之间的疑问

回复:
user: user-1
content: 引用 2 楼 zhangkaiy1220 的回复:*((long long*)DataBuffer + 12) = 12;  运行结果 DataBuffer[24] = 0;  DataBuffer[25] =12  而  *((double*)DataBuffer + 12)     = 12; 的运行结果是  DataBuffer[24] = 0;  DataBuffer[25] =1076363264  比较疑惑  没问题啊，没懂你疑惑在哪，你希望的值是多少

user: user-2
content: 用%a格式输出试试

user: user-3
content: 12 的 double 在内存中占据 8 个字节。这八个字节是 0x4028000000000000 分成两个 4 字节的 int 就是 0:1076363264

user: user-4
content: 浮点数格式 http://bbs.csdn.net/topics/390676437

user: user-0
content: *((long long*)DataBuffer + 12) = 12;  运行结果 DataBuffer[24] = 0;  DataBuffer[25] =12  而  *((double*)DataBuffer + 12)     = 12; 的运行结果是  DataBuffer[24] = 0;  DataBuffer[25] =1076363264  比较疑惑

user: user-1
content: 有什么问题，楼主去网上搜索浮点数在内存中的表示形式，他与整数表示方式不一样，不是你让一个double类型变量等于12，内存中存储的就是12的二进制