Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 有一道c语言题目，想请教一下如何做

回复:
user: user-1
content: B101 = 5 n 从3 到20（小于3不用考虑）， 系数就是(5<<0), (5<<1),,, （5 <<(n-3)） 然后逐个去位与，结果不为0就+1，看最后个数呗

user: user-2
content: 仔細思考其實這些字符串是什麽？就是位數為n的所有二進制數的集合！ 所以答案就出來了：循環計算2的0次方到n次方，然後轉換成二進制數，再轉換成字符串。 生成每一個字符串時，去判斷其中有沒有101子串，有則剔除，這個思路最直接了。

user: user-3
content: 递归来做比较方便，分为末两位是00/01/11/10四种来计算

user: user-2
content: 確實如此，多謝指正！ 引用 4 楼 user-4 的回复:[quote=引用 2 楼 hzy_76 的回复:] 仔細思考其實這些字符串是什麽？就是位數為n的所有二進制數的集合！ 所以答案就出來了：循環計算2的0次方到n次方，然後轉換成二進制數，再轉換成字符串。 生成每一個字符串時，去判斷其中有沒有101子串，有則剔除，這個思路最直接了。 循环计算的应该是0到[(2^n)-1]吧，需要考虑全0或全1。[/quote]

user: user-4
content: 引用 2 楼 hzy_76 的回复:仔細思考其實這些字符串是什麽？就是位數為n的所有二進制數的集合！ 所以答案就出來了：循環計算2的0次方到n次方，然後轉換成二進制數，再轉換成字符串。 生成每一個字符串時，去判斷其中有沒有101子串，有則剔除，這個思路最直接了。 循环计算的应该是0到[(2^n)-1]吧，需要考虑全0或全1。
user-0 提问: 求大佬指点，一个二叉树删除所有叶结点算法如下:

回复:
user: user-1
content: 理解对象这个概念，C语言中的树形结构在C++中会变得非常简单，简单到你可能无法想象。

user: user-2
content: 这个函数的目的就是删除整棵树，不是删一个节点。 删除时候不考虑前后序，必然先叶子后根，不然就丢了

user: user-3
content: 这好像是前序遍历吧，你得先判断这个节点是否为空，是否含有子节点，没有的话 就删除，他是在没有左右节点的情况下被删除，所以他的优先级是最高的，其次是进左子节点，然后是右子节点，不过好像也不是很严谨。
user-0 提问: C语言数组问题

回复:
user: user-1
content: 右边本来就是地址，你初始化的数组的指针，他一定是地址喽！

user: user-2
content: 引用在初始化时，是运算

user: user-0
content: 引用 2 楼 qq_41297918 的回复:数组名在做运算或者是传递参数时， 会自动退化为指针，这也是为什么传数组首地址时，可以直接用数组名的原因  按照你的解释，好像能解释通。引用并不属于运算

user: user-2
content: 数组名在做运算或者是传递参数时， 会自动退化为指针，这也是为什么传数组首地址时，可以直接用数组名的原因

user: user-3
content: p 这里是数组名，sizeof(p)出来的是20， 而不是4 你说的p是数组的首地址，这个只是在做赋值或运算时，由数组名退化为地址， int *q = p; int *q = p + 1; 这样的，这时你 sizeof(q) 就是4
user-0 提问: RPC远程调用和C/S的区别

回复:
user: user-1
content: 我一直也不懂。rpc远程call 远程函数干嘛。

user: user-2
content: 引用 1 楼 hzy_76 的回复:我的理解，其實RPC就是一種C/S。 通常C/S框架都不會自己編寫，因爲一個優秀的C/S框架要處理很多事情，比如中斷重連，比如重複請求，雙向的信息交換等等，編寫出這麽一套C/S架構所耗費的可能遠高於業務系統，而大多數公司只是想做一套業務系統而已。

user: user-3
content: 我的理解，其實RPC就是一種C/S。 通常C/S框架都不會自己編寫，因爲一個優秀的C/S框架要處理很多事情，比如中斷重連，比如重複請求，雙向的信息交換等等，編寫出這麽一套C/S架構所耗費的可能遠高於業務系統，而大多數公司只是想做一套業務系統而已。
user-0 提问: notepad++和MinGW配置C编译环境，notepad++插件nppexce配置时老是是出错，显示找不到目录，请问这个怎么解决

回复:
user: user-1
content: 不要把文件放在复杂的路径下，做好放在根目录下，桌面是最不应该的

user: user-2
content: 你可以参考下面这篇博文，讲的还是很详细的，有问题再一起交流https://blog.csdn.net/qq_37113207/article/details/56956682
user-0 提问: 关于看图像压缩的时候遇到的一个问题

回复:
user: user-1
content: 也就是图像处理一般分块，宏块之类的原因。

user: user-1
content: 图像相关性，即相邻的像素点之间有一定的相关性。 比如一个像素点作为计算单元，那他的比重就是100%，也就算一下完事 两个像素的时候，第一个像素除了他本身，还要考虑另外一个像素的因子（比如自己占90%，另外一个占了10%，总共是100%），那他的计算就是 A = a*0.9+ b*0.1, B = a*0.1+b*0.9，需要四次运算（因子根据算法不同而不同）。 以此类推（因子随便定义啦,一般是2的n次幂分支几，好运算）：A = a*0.8+b*0.1+c*0.05+d* 0.05 , B = ....  差不多这个意思吧。

user: user-0
content: 引用 2 楼 hjwang77 的回复:图像相关性，即相邻的像素点之间有一定的相关性。 比如一个像素点作为计算单元，那他的比重就是100%，也就算一下完事 两个像素的时候，第一个像素除了他本身，还要考虑另外一个像素的因子（比如自己占90%，另外一个占了10%，总共是100%），那他的计算就是 A = a*0.9+ b*0.1, B = a*0.1+b*0.9，需要四次运算（因子根据算法不同而不同）。 以此类推（因子随便定义啦,一般是2的n次幂分支几，好运算）：A = a*0.8+b*0.1+c*0.05+d* 0.05 , B = ....  差不多这个意思吧。  谢谢！

user: user-0
content: 是通过什么原理
user-0 提问: 好诡异，void*指针强转后发生诡异偏移

回复:
user: user-1
content: 那这个问题无非是踩内存导致的，建议gdb watch看下哪里被串改了 引用 6 楼 mumufan05 的回复:[quote=引用 4 楼 colinfang2006 的回复:] 你是说类型转换后是对的？但是到调用函数内部了就有问题？  [quote=引用 3 楼 mumufan05 的回复:] [quote=引用 2 楼 colinfang2006 的回复:] 你贴的代码不会有这个问题，我怀疑会不会是代码和运行的程序不匹配？ 或者你可以从便宜0x50=80字节来入手，结构体大小是不是刚好是80字节 并加一些调试打印，最好是刚刚转换类型后就打印两个指针的值 这两个方法我都试过了，结构体大于80个字节，前后加printf，打印的数据没问题，但实际调用的数据还是不对，所以说很诡异，而且目前只在一台机器上有这个问题，其他机器都没事，怀疑是硬件问题，但具体怎么回事想不明白[/quote][/quote] 不是，用printf打印是对的，但用gdb看就是错的[/quote]

user: user-2
content: 需要重新构建项目

user: user-3
content: 学会使用数据断点。

user: user-4
content: 把所有的obj文件删除，全部重新编译一次看看 makefile写的不好有时候会有这个问题

user: user-5
content: 建议看一下反汇编。

user: user-0
content: 引用 4 楼 colinfang2006 的回复:你是说类型转换后是对的？但是到调用函数内部了就有问题？  [quote=引用 3 楼 mumufan05 的回复:] [quote=引用 2 楼 colinfang2006 的回复:] 你贴的代码不会有这个问题，我怀疑会不会是代码和运行的程序不匹配？ 或者你可以从便宜0x50=80字节来入手，结构体大小是不是刚好是80字节 并加一些调试打印，最好是刚刚转换类型后就打印两个指针的值 这两个方法我都试过了，结构体大于80个字节，前后加printf，打印的数据没问题，但实际调用的数据还是不对，所以说很诡异，而且目前只在一台机器上有这个问题，其他机器都没事，怀疑是硬件问题，但具体怎么回事想不明白[/quote][/quote] 不是，用printf打印是对的，但用gdb看就是错的

user: user-6
content: 确实诡异呀，同求答案。

user: user-7
content: 用printf打印是对的，但用gdb看就是错的 你相信哪个是对的？

user: user-8
content: 我感觉你你的函数破坏了堆栈的原因。 你尝试不要调用里面的函数，直接检测试试看。 或者把断点设置在进入 EvoSdtpFieldsGetBCD 函数之前。

user: user-0
content: 引用 2 楼 colinfang2006 的回复:你贴的代码不会有这个问题，我怀疑会不会是代码和运行的程序不匹配？ 或者你可以从便宜0x50=80字节来入手，结构体大小是不是刚好是80字节 并加一些调试打印，最好是刚刚转换类型后就打印两个指针的值 这两个方法我都试过了，结构体大于80个字节，前后加printf，打印的数据没问题，但实际调用的数据还是不对，所以说很诡异，而且目前只在一台机器上有这个问题，其他机器都没事，怀疑是硬件问题，但具体怎么回事想不明白

user: user-1
content: 你贴的代码不会有这个问题，我怀疑会不会是代码和运行的程序不匹配？ 或者你可以从便宜0x50=80字节来入手，结构体大小是不是刚好是80字节 并加一些调试打印，最好是刚刚转换类型后就打印两个指针的值

user: user-1
content: 你是说类型转换后是对的？但是到调用函数内部了就有问题？  引用 3 楼 mumufan05 的回复:[quote=引用 2 楼 colinfang2006 的回复:] 你贴的代码不会有这个问题，我怀疑会不会是代码和运行的程序不匹配？ 或者你可以从便宜0x50=80字节来入手，结构体大小是不是刚好是80字节 并加一些调试打印，最好是刚刚转换类型后就打印两个指针的值 这两个方法我都试过了，结构体大于80个字节，前后加printf，打印的数据没问题，但实际调用的数据还是不对，所以说很诡异，而且目前只在一台机器上有这个问题，其他机器都没事，怀疑是硬件问题，但具体怎么回事想不明白[/quote]

user: user-9
content: 道行太浅，还真没看出什么毛病。
user-0 提问: 关于程序代码错误求助！ 小白求助~~~~~~

回复:
user: user-1
content: scanf("%d", &youliang);     scanf("%d", &youhao); 	getchar(); 	//fflush(stdin);     scanf("%c", &fuwu); 改成这样，即可解决； 原因跟楼上所说的一样，把上一个输入的换行作为了下一个fuwu的值，你如果调试就会发现fuwu的值为10，就是换行的Ascii码  另外C，变量必须要初始化才可以

user: user-2
content: scanf()函数都不能处理回车符。即把回车符看作再次输入的字符。例如  int ret_int;  char ret_char;  scanf(“%d”, &ret_int);  scanf(“%c”, &ret_char);  此时，在控制台中输入数字“5”然后按下回车键，此时ret_int的值是5，而ret_char的值是0x0a，即回车的ASCII码值。 请参考《scanf()、gets()和getline()读取输入》 [code=c]	int youhao; 	int youliang; 	char fuwu; 	char huichefu;//---------------用来屏蔽回车符--------------- 	double price = 0.0;//------------赋初始值------------------ 	double sum = 0.0;//-------------赋初始值-----------------  	scanf("%d", &youliang); 	scanf("%d", &youhao); 	scanf("%c", &huichefu);//-------屏蔽输入油耗时输入的回车符------------- 	scanf("%c", &fuwu);  	switch (youhao) { 	case 90: price = 6.95; 		break; 	case 93: price = 7.44; 		break; 	case 97: price = 7.93; 		break; 	} 	if (fuwu == 'm') { 		sum = price* youliang*0.5; 	} 	else if (fuwu == 'e') { 		sum = price*youliang*0.3; 	}  	printf("%.2f", sum);[/code]

user: user-3
content: scanf用%c时会将输入的回车作为输入 因此你输入两个参数后，第二个参数后的回车就作为fuwu的入参了 可以这么改： scanf("%d", &youliang); scanf("%d\n", &youhao); scanf("%c", &fuwu);  还有你的编程习惯不是很好，建议变量先初始化。

user: user-4
content: 报错不是 sum 没有初始化吗

user: user-5
content: 注意scanf是格式化输入函数，%d对应的就是0~9的字符，%c格式就是对应所有字母和数字了，包括换行符等其他字符

user: user-5
content: scanf输入%c格式的比较特殊。如果在输入第二个%d回车时，换行符就赋值给了fuwu变量。解决办法是在输入第二个youhao后加一条语句:getchar();这调语句就是为了“吸收”上个变量%d格式残留在输入缓存里的'\n'。

user: user-6
content: 你的程序在gcc5.4中，是不会崩溃的，会走常规的退出流程。不过程序处理上，确实不太对。问题，大概就像前面所说的。 但是有两点，有些问题。  1. scanf()函数都不能处理回车符？？ 2. 另外C，变量必须要初始化才可以？？   scanf在某些情况下可以处理回车符。。。当输入为整数（%d）时，空格、回车都可以作为分割符。。当输入为字符(%c)，如果输入的是空格或回车，会认为时输入的内容，赋给字符变量。。  C语言中，变量即使不初始化，也可以，只不过会报wranning。当然，某些老旧版本的C语言编译器，可能不初始化会Error。
user-0 提问: 请教switch语句

回复:
user: user-1
content: 看不明白你说啥，但我估计新手的话是忘了break ，嘿嘿

user: user-2
content: 我是萌新来着所以理解可能不太对

user: user-2
content: 我个人理解满足哪个条件就进哪个门

user: user-3
content: 百度百科        遵守switch语句规则              switch语句非常有用，但在使用时必须谨慎。所写的任何switch语句都必须遵循以下规则：         只能针对基本数据类型中的整型类型使用switch，这些类型包括int、char等。对于其他类型，则必须使用if语句。          switch()的参数类型不能为实型 。         case标签必须是常量表达式(constantExpression)，如42或者"42"。         case标签必须是惟一性的表达式；也就是说，不允许两个case具有相同的值。   猜测错误原因：       1. scanf 占位符不对       2.  case  参数不对

user: user-4
content: emmm没有代码

user: user-5
content: 大家觉得发起一个根据BUG描述还原BUG代码的活动怎么样？

user: user-5
content: 代码贴出来吧，不然原因说不清楚

user: user-6
content: 老铁，你的源码呢？？？

user: user-7
content: 估计又是这个问题： scanf 用%c时需要屏蔽回车

user: user-8
content: 建议贴出代码，这样描述大家更能理解一些。 switch case 只支持整型，char类型也归为整型范畴

user: user-9
content: 亲，C++的switch只支持数字类型，不支持符号或字符串类型

user: user-10
content: 同学麻烦把代码贴上来，不然大家不知道你的意思。

user: user-11
content: 上代码啊，不知道你在说啥
user-0 提问: 关于C语言编程题求解，小白求大神帮忙！

回复:
user: user-1
content: 直接对5求余判断是否大于3就行了

user: user-0
content: 引用 2 楼 此生注定孤独 的回复：第一题：三天加2天，周期就是5天，用你输入的天数对5求余，如果小于3就是在打鱼，如果大于3就是在晒网，这么说你明白了吧。 第二题：车速a,限速b，比较a和1.1b的大小，小于就ok，大于的话再比较a和1.5b的大小，如果不超过1.5b，罚款，大于1.5b，吊销行驶证，明白了吧。   PS：感觉你的帖子会被删掉。。。谢谢啦

user: user-0
content: 引用 3 楼 niiiloc 的回复：没看出任何的难点，楼主该说说你觉得不会的点在哪里？ 是题目理解不到位还是不知道用什么编程语言去表达还是题目没有思路？ 如果是这种题目没有思路的话，建议多看看数学相关的书题目没有思路～～～

user: user-2
content: 没看出任何的难点，楼主该说说你觉得不会的点在哪里？ 是题目理解不到位还是不知道用什么编程语言去表达还是题目没有思路？ 如果是这种题目没有思路的话，建议多看看数学相关的书

user: user-3
content: 第一题：三天加2天，周期就是5天，用你输入的天数对5求余，如果小于3就是在打鱼，如果大于3就是在晒网，这么说你明白了吧。 第二题：车速a,限速b，比较a和1.1b的大小，小于就ok，大于的话再比较a和1.5b的大小，如果不超过1.5b，罚款，大于1.5b，吊销行驶证，明白了吧。   PS：感觉你的帖子会被删掉。。。

user: user-4
content: 直接要代码 在CSDN看起来有点不要脸了
user-0 提问: 字符数组和字符串

回复:
user: user-1
content: 在main中的s2并未初始化，其存储的内容是无意义的随机数。这种情况只是碰巧，copy了abcd之后，s2[4]也许正好是\0，或者是s2[4]是看不见的字符如空格,\b等，然后s2[5]正巧是\0，等等。 你可以单步调试，把s2放到监视中，看看里面的实际存储内容，这样就一目了然了。

user: user-2
content: 你不是做了copy操作么。。。将s5中的数据赋值给了s2

user: user-0
content: 引用 4 楼 hjwang77 的回复:首先，你这个重新应该编译失败，s5换成s1才行 另外s2没做初始化，里面的值是随机的，拷贝完了只是前面4个字节被赋值，后面依然是随机，不过运气好才能打印正常。 你可以将s2初始化成‘1234567890’，然后拷贝完了在打印看看还是你这个结果不。  嗯嗯  截图的时候  不小心按错了。。但还是那个意思、。。我试试你的操作

user: user-0
content: 引用 2 楼 zangfong 的回复:在main中的s2并未初始化，其存储的内容是无意义的随机数。这种情况只是碰巧，copy了abcd之后，s2[4]也许正好是\0，或者是s2[4]是看不见的字符如空格,\b等，然后s2[5]正巧是\0，等等。 你可以单步调试，把s2放到监视中，看看里面的实际存储内容，这样就一目了然了。  我试试

user: user-0
content: 引用 5 楼 cfjtaishan 的回复:代码有问题呢，s5在哪里？把s5拷贝给s2 后面打错了，但是问题还是那个意思。。

user: user-3
content: 代码有问题呢，s5在哪里？把s5拷贝给s2

user: user-4
content: 首先，你这个重新应该编译失败，s5换成s1才行 另外s2没做初始化，里面的值是随机的，拷贝完了只是前面4个字节被赋值，后面依然是随机，不过运气好才能打印正常。 你可以将s2初始化成‘1234567890’，然后拷贝完了在打印看看还是你这个结果不。

user: user-5
content: s5 哪里定义的变量？？
user-0 提问: 小白新手求助，求大神帮帮忙！！关于scanf在for循环中的问题

回复:
user: user-1
content: 15个字符整好是循环15次呢

user: user-2
content: 在控制台中通过键盘输入数据时，以回车键作为结束标志。当输入结束后，键盘输入的数据连同回车键一起被输入到输入缓冲区中。在程序中第一次调用getchar()函数从输入缓冲区中读取一个字节的数据。需要注意的是，如果此时在程序中第二次调用getchar()函数，因为此时输入缓冲区中还有回车键的数据没有被读出，第二个getchar()函数读出的是回车符。 解决的方法请参考《C++中getchar()的使用方法》 希望能够帮到你

user: user-3
content: 回车也是一个字符，当你第一次输入按完回车后，回车会被留在缓冲区，下一次循环就会直接把缓冲区里的回车接收了，你可以用getch()来输入一个字符，这个是不需要按回车的，也可以在scanf里的%c前面加一个空格，这样子会跳过空格回车之类的字符
user-0 提问: foreach

回复:
user: user-1
content: 引用 4 楼 jianwen0529 的回复:C++没有foreach语法（标准库倒是有这么个函数/方法）  C#中int 和 struct是值类型，就算能修改也只是修改到副本的东西 而class都是引用类型，即修改可以影响到它 所以C#的设计者干脆把这规定死，不给这么用  不保证说法正确性，C#我只是了解皮毛，在内存的方向猜测其可能性，仅供参考。 C#不太懂，接着楼上的这段说一说c++11里面的for (:) string s("Hello World!!!"); for (auto &c : s)   // for every char in s (note: c is a reference) 修改这个c可以直接修改s的值 for (auto c : s)   // for every char in s (note: c is a value) 修改这个c，仅仅更改的是c的值

user: user-2
content: 可以靠这样的测试去摸索实现 但最好的方法是了解内部的实现原理

user: user-3
content: 不錯，學習了！

user: user-4
content: C++没有foreach语法（标准库倒是有这么个函数/方法）  C#中int 和 struct是值类型，就算能修改也只是修改到副本的东西 而class都是引用类型，即修改可以影响到它 所以C#的设计者干脆把这规定死，不给这么用  不保证说法正确性，C#我只是了解皮毛，在内存的方向猜测其可能性，仅供参考。

user: user-5
content: 你这个是C#吧？前几个例子，你修改的是容器内部元素，最后一个例子你修改内部元素的本身
user-0 提问: foreach

回复:
user: user-1
content: 都问过了，怎么还来问一遍？还在C区问？这玩意有啥特别的？

user: user-2
content: 试试c++看看能改变吗？应该不行吧!

user: user-3
content: C语言没有foreach

user: user-4
content: 老哥，这个是C#的吧？
user-0 提问: Linux和windows下字符数组的问题

回复:
user: user-1
content: 这个问题就是栈的问题，越界了，不一定越到那个地方，可能是别的函数栈上，所以随机性很大。

user: user-2
content: s2没有初始化，又只复制了前4个字符，作为字符串输出结尾没有'\0'来结束所以乱码。 字符串"abcd"后面实际还有一个'\0'，所以实际应该是5个字符，所以s3[4]长度不足。

user: user-0
content: 引用 8 楼 cfjtaishan 的回复:[quote=引用 7 楼 songsong2017 的回复:] [quote=引用 5 楼 colinfang2006 的回复:] linux进程内存分布和windows不一样 你的程序还是错的，只不过恰好在linux能够运行罢了，而且也不能保证每次运行都是正确的  我试了好多遍，都成功了  .....[/quote] 随机性，如果了解内存，就不这么认为是好多遍没问题就是没问题了[/quote]  大佬，我对内存的理解只存留在内存四大区（堆栈这些），你说的这个随机性，我有点理解不了。有没有建议看下哪部分知识，谢谢

user: user-1
content: 引用 7 楼 songsong2017 的回复:[quote=引用 5 楼 colinfang2006 的回复:] linux进程内存分布和windows不一样 你的程序还是错的，只不过恰好在linux能够运行罢了，而且也不能保证每次运行都是正确的  我试了好多遍，都成功了  .....[/quote] 随机性，如果了解内存，就不这么认为是好多遍没问题就是没问题了

user: user-0
content: 引用 5 楼 colinfang2006 的回复:linux进程内存分布和windows不一样 你的程序还是错的，只不过恰好在linux能够运行罢了，而且也不能保证每次运行都是正确的  我试了好多遍，都成功了  .....

user: user-0
content: 引用 4 楼 cfjtaishan 的回复:%s输出是遇到'\0'停止输出，如果一直找不到'\0'，也可能会导致程序越界，出现段错误。  对啊，没错啊，这些在windows下都是正常的。但是在Linux下就不按常理出牌了 （1）s3[6]=“123456”能正常打印，压根没有内存去存放‘\0’；（2）s2，copy，注释加'\0'代码，结果s2也能正常打印。

user: user-3
content: linux进程内存分布和windows不一样 你的程序还是错的，只不过恰好在linux能够运行罢了，而且也不能保证每次运行都是正确的

user: user-1
content: %s输出是遇到'\0'停止输出，如果一直找不到'\0'，也可能会导致程序越界，出现段错误。

user: user-1
content: 引用 2 楼 songsong2017 的回复:[quote=引用 1 楼 watersoft 的回复:] s2没有初始化，又只复制了前4个字符，作为字符串输出结尾没有'\0'来结束所以乱码。 字符串"abcd"后面实际还有一个'\0'，所以实际应该是5个字符，所以s3[4]长度不足。  你说的我都懂，并在windows下都符合以上所说。 但是这些，在linux下不一样，能正常使用，这才是我百思不得其解的地方。[/quote] 出现乱码是因为没有加'\0'，不论是windows下还是Linux下，'\0'是字符串的结束标记都是一样的。 如果不加'\0'，那么输出的结果可能是乱码也可能不乱码，这个是未定义的。

user: user-0
content: 引用 1 楼 watersoft 的回复:s2没有初始化，又只复制了前4个字符，作为字符串输出结尾没有'\0'来结束所以乱码。 字符串"abcd"后面实际还有一个'\0'，所以实际应该是5个字符，所以s3[4]长度不足。  你说的我都懂，并在windows下都符合以上所说。 但是这些，在linux下不一样，能正常使用，这才是我百思不得其解的地方。

user: user-0
content: 引用 10 楼 cfjtaishan 的回复:这个问题就是栈的问题，越界了，不一定越到那个地方，可能是别的函数栈上，所以随机性很大。  https://blog.csdn.net/yes_i_am/article/details/52005602 我找了找，感觉和这个博主说的挺像，我回头在调试调试，感谢大佬回答。先结贴再说！
user-0 提问: 数组案例测试有误——来自《C程序设计语言》第2版

回复:
user: user-1
content: 引用 3 楼 Byrdman 的回复:[quote=引用 1 楼 cfjtaishan 的回复:] 因为没有输入EOF吧；Linux 下输入ctrl + d， windows下输入ctrl+ z可以输入EOF 这个是一个经典问题了，建议查一下EOF 怎么把点数给你？？ [/quote] 问题解决了就好～

user: user-0
content: 引用 1 楼 cfjtaishan 的回复:因为没有输入EOF吧；Linux 下输入ctrl + d， windows下输入ctrl+ z可以输入EOF 这个是一个经典问题了，建议查一下EOF 怎么把点数给你？？

user: user-2
content: 在命令行下面运行试试吧

user: user-1
content: 因为没有输入EOF吧；Linux 下输入ctrl + d， windows下输入ctrl+ z可以输入EOF 这个是一个经典问题了，建议查一下EOF
user-0 提问: 关于嵌套if()else语句，小白求助！

回复:
user: user-1
content: 你和我第一次，做这个 题一样吧结果都写出来了，你可以进行转化，给个变量赋值，之后判断a  b  c的大小就不用这么麻烦了

user: user-2
content: 排版真好，和体育老师学的么？

user: user-3
content: 你这排版，跟谁学的，你看着就不晕么？竟然还有看下去的勇气

user: user-4
content: 我愣是没数清楚有几对花括号。

user: user-5
content: 你这，花括号用的太频繁

user: user-6
content: 我也习惯这样 总觉得不弄得整整齐齐会别扭

user: user-7
content: 如果你是在VS中编译的，那么在你函数return之前需要将屏幕暂停，不然程序运行完直接退出了，因为太快，所以你会什么也看不到。这时候在return之前加上symtem("pause");或者getchar();让屏幕暂停就能看到输出的结果啦。

user: user-8
content: #include<stdio.h>  int main(void) {     int a,b,c;     scanf("%d%d%d",&a,&b,&c);      if (a>b)         if (a>c)             if (b>c)                 printf("%d%d%d",a,b,c);             else                 printf("%d%d%d",a,c,b);         else             printf("%d%d%d",c,a,b);     else if (b>c)         if (c>a)             printf("%d%d%d",b,c,a);         else             printf("%d%d%d",b,a,c);      else         printf("%d%d%d",c,b,a);       return 0;  } 没发现问题，能正常输出（Linux）

user: user-9
content: 这排版真心恶心人

user: user-10
content: 在代码最后添加system("pause")  #include<stdio.h> #include <stdlib.h>//----------添加的头文件--------- int main() { 	int a, b, c; 	scanf("%d %d %d", &a, &b, &c);  	if (a>b) { 		if (a>c) { 			if (b>c) { 				printf("%d %d %d", a, b, c); 			} 			else { 				printf("%d%d%d", a, c, b); 			} 		} 		else { 			printf("%d %d %d", c, a, b); 		} 	} 	else if (b>c) { 		if (c>a) { 			printf("%d %d %d", b, c, a); 		} 		else { 			printf("%d %d %d", b, a, c); 		} 	} 	else { 		printf("%d %d %d", c, b, a); 	} 	system("pause");//----------------添加的代码------------------ 	return 0; }

user: user-11
content: 用命令行试试吧
user-0 提问: 函数结束会自动释放未释放的动态内存吗？

回复:
user: user-1
content: 但是那块malloc的内存肯定是没有释放的，而L又被释放了，所以你在想free掉malloc的内存就没法操作了，这时候就会造成内存泄漏了。

user: user-1
content: malloc的内存如果不手动free，函数退出后肯定是不会释放的，除非程序退出了，系统会把内存全部回收。你测试的L->elem在函数推出后没有指向malloc的内存是因为L是形参，局部变量，在函数推出后就释放了。

user: user-2
content: 函数执行结束——退栈。退栈：所属栈区所有数据都会被清除。 其它内存： 1.栈，就是那些由编译器在需要的时候分配，在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。 2.堆，就是那些由new分配的内存块，他们的释放编译器不去管，由我们的应用程序去控制，一般一个new就要对应一个delete。如果程序员没有释放掉，那么在程序结束后，操作系统会自动回收。 3.自由存储区，就是那些由malloc等分配的内存块，他和堆是十分相似的，不过它是用free来结束自己的生命的。 4.全局/静态存储区，全局变量和静态变量被分配到同一块内存中，在以前的C语言中，全局变量又分为初始化的和未初始化的，在C++里面没有这个区分了，他们共同占用同一块内存区。 5.常量存储区，这是一块比较特殊的存储区，他们里面存放的是常量，不允许修改。

user: user-3
content: 因为你传给那个函数的参数是指针，函数返回后，指针指向的地址还是传进来之前的

user: user-0
content: 引用 1 楼 自信男孩的回复:函数退出不等于动态内存自动被释放，若程序退出了，那么它所申请的空间才会被释放。 可是我调用Createdsqlist()之后，L->elem并没有指向我所分配的内存啊？

user: user-4
content: 函数退出不等于动态内存自动被释放，若程序退出了，那么它所申请的空间才会被释放。

user: user-5
content: 其实这玩艺也有例外，通常动态申请是发生在堆上的。但是如果内存是在栈上动态申请的，比如标准库函数alloca，就不允许free，因为没有对应的释放函数，它申请的动态内存会在调用者返回之后自动释放。

user: user-6
content: 程序退出动态内存 会释放。 函数退出不会释放动态内存。

user: user-7
content: 不会，自己malloc的，自己free，不释放就会泄漏

user: user-8
content: 所有内存，在函数结束后不会被释放的

user: user-4
content: 引用 2 楼 ZhnagJ1an 的回复:[quote=引用 1 楼 自信男孩的回复:]函数退出不等于动态内存自动被释放，若程序退出了，那么它所申请的空间才会被释放。 可是我调用Createdsqlist()之后，L->elem并没有指向我所分配的内存啊？[/quote] 代码太少，看不出来你的逻辑是否跟动态内存有关

user: user-5
content: 是不是忘记传递length的值了，malloc参数里用到的length貌似只是结构体的成员，没看到同名的变量
user-0 提问: c语言递归

回复:
user: user-1
content: 如果递归的逻辑不会写，建议先不用递归的方法写出来这个实现。然后找出规律，再改为递归方式

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

回复:
user: user-0
content: 引用 7 楼 qq_35091933 的回复:请问客户端如何实现长连接，调用mg_connect_http每次都返回一个新的连接 HTTP请求头加keep-alive了吗

user: user-1
content: 请问客户端如何实现长连接，调用mg_connect_http每次都返回一个新的连接

user: user-2
content: 我尝试改了SOMAXCONN的值 验证连接限制的问题，但是好像没什么效果。可能是我理解错了，如果给你开发造成困扰了那可真是太抱歉了。

user: user-0
content: 引用 5 楼 bluish_white 的回复:我尝试改了SOMAXCONN的值 验证连接限制的问题，但是好像没什么效果。可能是我理解错了，如果给你开发造成困扰了那可真是太抱歉了。 其实你在MG_EV_ACCEPT的时候计数就可以了，这样就可以限制连接数了。 多线程的我也弄出来了，可以参考官方实例，在我看来官方实例很啰嗦，其实在MG_EV_HTTP_REQUEST的时候就可以开启一个线程去处理请求就好了，官方实例中借用的一个IO处理多个请求，还有两个socket这样我觉得加重了通信效率，因为内部还要通信。不过值得官方实例值得学习。  结贴~~~

user: user-3
content: 学会使用grep（Linux）或findstr（windows）

user: user-0
content: 已解决，还有部分问题没解决，对Mongoose这个又深入的了解了一番。

user: user-4
content: 楼主怎么解决的，目前我在学校mongoose这个玩意儿

user: user-0
content: 引用 1 楼 bluish_white 的回复:1、有个宏定义“SOMAXCONN”，是listen的参数，默认8个。如何在程序里修改，我也在找。  3、struct mg_connection 有个字段“flags”。默认 mg_send() 之后是保持连接，如果要在一次发送后主动断开，只要或操作一下这个flags就行。  struct mg_connection *c; /* 省略代码 */ mg_send_head(c, 200, strlen(content), "Connection: close\r\nContent-Type: application/json; charset=utf-8"); c->flags |= MG_F_SEND_AND_CLOSE; mg_send(c, content, strlen(content));  1.默认是长连接的，但是为什么，官方实例中多线程每次访问都是新的端口号？单线程的就可以是长连接。 2.您有没有用mongoose做多线程，我在改造多线程的时候，在处理第一个请求的过程中，poll会将上一个请求的http_message清空，以至于我在处理第一个请求的时候半路就因为某些值为空（如method、body）报错了，我在MG_EV_HTTP_REQUEST将需要的信息保存下来，在后续的处理过程中还是变空了，已经做不下去了~~~

user: user-2
content: 1、有个宏定义“SOMAXCONN”，是listen的参数，默认8个。如何在程序里修改，我也在找。  3、struct mg_connection 有个字段“flags”。默认 mg_send() 之后是保持连接，如果要在一次发送后主动断开，只要或操作一下这个flags就行。  struct mg_connection *c; /* 省略代码 */ mg_send_head(c, 200, strlen(content), "Connection: close\r\nContent-Type: application/json; charset=utf-8"); c->flags |= MG_F_SEND_AND_CLOSE; mg_send(c, content, strlen(content));
user-0 提问: 小白新手问题，switch case问题求助！！

回复:
user: user-1
content: 不像你说的啊，我这里没错，你全完全代码贴出来看

user: user-2
content: 这样看不出问题，贴出完整的代码吧。。

user: user-3
content: 从你贴出的代码里看不出会执行case 1的逻辑。建议提出完整代码，看看是不是其他地方的问题。

user: user-4
content: 虽然没有default分支，但是完全不可能输出case 1的打印。 你不会是修改了代码，没有重新编译吧？

user: user-5
content: 加打印调试下，你贴的代码是不会有这个问题的

user: user-6
content: 加上defalut试试

user: user-0
content: 引用 1 楼 风影-取名字真烦 的回复：不像你说的啊，我这里没错，你全完全代码贴出来看我上面就一个for循环 5次，然后就没了
user-0 提问: 用c语言，这个要怎么写?

回复:
user: user-1
content: 为何不能复制？

user: user-2
content: 用APL这么写： A←{0~¨⍨a⌽⊃⌽∊¨0,¨¨a∘!¨a←⌽⍳⍵} A 5 生成任意阶Pascal三角形都是这么简单

user: user-3
content: 引用 4 楼 jdgdf566 的回复:[quote=引用 2 楼 cfjtaishan 的回复:] [quote=引用 1 楼 qq_34851925 的回复:] #include<stdio.h> int main(  ) {   int i,j,k,m; for(i=1;i<=5;i++) {   for(m=1;m<=5-i;m++)printf(" "); 	   for(j=1;j<=i;j++)printf("%d",j);   for(k=j-2;k>=1;k--)printf("%d",k);   printf("\n"); } } 下面是改的通用版本：  #include<stdio.h>  int main(void) {     int i, j, k, m, n;      scanf("%d", &n);      for(i = 1;i <= n; i++)     {         for(m = 1; m <= n-i; m++)             printf(" ");         for(j = 1; j <= i; j++)             printf("%d",j);         for(k = j-2; k >= 1; k--)             printf("%d", k);         printf("\n");     } }[/quote]空格不对[/quote] 那个空格不对？

user: user-4
content: 引用 2 楼 cfjtaishan 的回复:[quote=引用 1 楼 qq_34851925 的回复:] #include<stdio.h> int main(  ) {   int i,j,k,m; for(i=1;i<=5;i++) {   for(m=1;m<=5-i;m++)printf(" "); 	   for(j=1;j<=i;j++)printf("%d",j);   for(k=j-2;k>=1;k--)printf("%d",k);   printf("\n"); } } 下面是改的通用版本：  #include<stdio.h>  int main(void) {     int i, j, k, m, n;      scanf("%d", &n);      for(i = 1;i <= n; i++)     {         for(m = 1; m <= n-i; m++)             printf(" ");         for(j = 1; j <= i; j++)             printf("%d",j);         for(k = j-2; k >= 1; k--)             printf("%d", k);         printf("\n");     } }[/quote]空格不对

user: user-5
content: m=1,是不是单独考虑一下，第一行前面没有空格

user: user-3
content: 引用 1 楼 qq_34851925 的回复:#include<stdio.h> int main(  ) {   int i,j,k,m; for(i=1;i<=5;i++) {   for(m=1;m<=5-i;m++)printf(" "); 	   for(j=1;j<=i;j++)printf("%d",j);   for(k=j-2;k>=1;k--)printf("%d",k);   printf("\n"); } } 下面是改的通用版本：  #include<stdio.h>  int main(void) {     int i, j, k, m, n;      scanf("%d", &n);      for(i = 1;i <= n; i++)     {         for(m = 1; m <= n-i; m++)             printf(" ");         for(j = 1; j <= i; j++)             printf("%d",j);         for(k = j-2; k >= 1; k--)             printf("%d", k);         printf("\n");     } }

user: user-6
content: #include<stdio.h> int main(  ) {   int i,j,k,m; for(i=1;i<=5;i++) {   for(m=1;m<=5-i;m++)printf(" "); 	   for(j=1;j<=i;j++)printf("%d",j);   for(k=j-2;k>=1;k--)printf("%d",k);   printf("\n"); } }
user-0 提问: 字符串倒序，找出错误，求救

回复:
user: user-1
content: #include <stdio.h> #include <stdlib.h> #include <string.h>  int main() {     char *src = "Hello World!";     char *dest = NULL;     int len = strlen(src);      dest = (char *)malloc(len+1);     char *d = dest;     //char *s = src[len];     char *s = &src[len-1]; // or s = src + len - 1;      while(len--!=0)         *d++ = *s--;         //d++=s--;     //d[len+1]=0; //modefy dest[len] = 0;     *d = 0;    //add '\0'      printf("%s\n",dest);      free(dest);     dest=NULL;      return 0; } 参考一下吧

user: user-2
content: 最大的问题就是13行的：    d++=s--; 没有加*号

user: user-3
content: Windows10+VS2015调试通过  #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { 	char *src = "Hello World!"; 	char *dest = NULL; 	int len = strlen(src); 	dest = (char*)malloc(len + 1); 	char *d = dest; 	char *s = src+len-1; 	while (len-- != 0) 	{ 		*d = *s; 		d++; 		s--; 	} 	*d = 0; 	printf("%s\n", dest); 	free(dest); 	dest = NULL; 	system("pause"); 	return 0; }

user: user-4
content: 楼主自己对比，不一样的地方，你的都是错误！
user-0 提问: C语言指针问题

回复:
user: user-1
content: *engines这个是函数指针数组，数组长度是5，每个元素都是一个函数指针。这5个指针可以指向5个函数，但是函数的返回需要是float类型，并且参数的格式需要和定义的必须一致

user: user-2
content: 函数指针数组，包含5个成员；

user: user-3
content: 函数指针数组，没毛病，可以理解成函数重命名

user: user-4
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]   不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！

user: user-5
content: *engines[5] 函数指针 数组

user: user-0
content: 是函数指针数组，包含五个指向函数的指针
user-0 提问: 求问,C头文件#define 宏定义一个数,运行时值不是定义的值

回复:
user: user-1
content: 先检查定义，再删除，重新定义，肯定是重复定义了

user: user-2
content: ifndef和endif常用在头文件里，和他们相应的define一般只定义，但是不给这个宏相应的文本替换对象
user-0 提问: 求大佬帮帮忙，好吧好吧

回复:
user: user-1
content: C++ 循环列表

user: user-2
content: 你都让“CSDN推荐”无语了。  贴张图片还是需要转头才能看的。  两个问题，不算很难：  1）struct node { DataType data; struct node *next }; 2）假设已知循环链表的一个节点为p，如下处理等于x的节点：  int minus_nodes (struct node *p, DataType x) {     struct node *q, *prev;     int flag = 0;      prev = p;     q = p->next;     while (q != p) {         if (q->data == x) {             pre->next = q->next;             free(q);             q = prev->next;         } else {             prev = prev->next;             q = q->next;         }     }     if (p->data == x) {         prev->next = p->next;         free(p);     } } 可能不完善，欢迎指正
user-0 提问: 本人小菜鸟，求助！

回复:
user: user-1
content: 引用 15 楼 baidu_41922630的回复:你可以把+2后面看做有一个逗号运算符， 然后就相当于i+2，之后遇到逗号运算符i++

user: user-1
content: 你可以把+2后面看做有一个逗号运算符，

user: user-2
content: i++是用完了自增，++i是增完了再用

user: user-3
content: 这条语句全部执行完之后执行

user: user-4
content: 其实i++，i放在++前面就是先i后加，直接i++看成i即可，所以就是i先+2再执行i+1

user: user-5
content: 先printf，后++

user: user-6
content: 引用 3 楼 小丫么小菜鸡的回复:引用 1 楼 死国之神 的回复：i ++,表示这条语句执行完了就自增。你这里，可以看做是printf后自增。这边是i＋2完了以后i自加么？ 打印结束后，这个你可以再编译器上试试

user: user-0
content: 引用 4 楼 上班這麼困呢 的回复：使用过i之后  i自增  这里是 i + 2是i＋2完了以后，然后i＋＋么

user: user-7
content: 使用过i之后  i自增  这里是 i + 2

user: user-0
content: 引用 1 楼 死国之神 的回复：i ++,表示这条语句执行完了就自增。你这里，可以看做是printf后自增。这边是i＋2完了以后i自加么？

user: user-8
content: 搞明白++在前在后的区别，以及原理，然后会使用就可以了，我觉得没有必要在此类的问题上花较多的时间

user: user-9
content: i ++,表示这条语句执行完了就自增。你这里，可以看做是printf后自增。

user: user-9
content: 引用 3 楼 abzzc 的回复:引用 1 楼 死国之神 的回复：i ++,表示这条语句执行完了就自增。你这里，可以看做是printf后自增。这边是i＋2完了以后i自加么？ en

user: user-10
content: 关于C,C++表达式求值顺序 http://blog.csdn.net/fefe82/article/details/37833767，http://bbs.csdn.net/topics/370153775

user: user-11
content: i＋＋ 表示与2相加的仍然是 i，但是该语句执行完后，i=i +1

user: user-12
content: 你这个解释可以假想一下cpu的操作，i++就是从把内存中的i放入cpu寄存器，然后进行其它所有操作，什么时候需要再次使用此寄存器了，然后需要把i的值再放回原来内存，放回的时候加1，再放回原来的内存地址,实在纠结这个问题你可以查看一下你这第语句执行的汇编代码，那么就一清二楚了
user-0 提问: 关于printf 函数中的一些疑问

回复:
user: user-1
content: 注意是+=，建议注意看一下+=的使用

user: user-2
content: ap += _INTSIZEOF(t） ap不是变了么？宏就是替换

user: user-3
content: 嗯，a+=1 也就是a=a+1 ap += _INTSIZEOF(t） 也就是 ap=ap+_INTSIZEOF(t） ap当然要变
user-0 提问: c语言问题求助

回复:
user: user-1
content: 因为先输入start和len之后，'\n'还残留在输入缓存里，while循环收到的第一个字符ch就是'\n'。因此src[0]就是'\n'。解决办法，就是scanf输入start和len之后加一条语句: getchar();这条语句要在while之前。或者在while中如此处理  while( ( ch = getchar() ) != EOF ) {     if (ch == '\n')         continue;     src[i] = ch;     i++; }

user: user-2
content: 先写while循环你的ch没有get到任何东西，因为是先执行的循环，循环退出后你才输入。所以要先输入再用循环get到你输入的。  而且你这个有些问题，数组没有初始化，还要数组位置有小错误，下面贴出了我运行过的代码。  #include<iostream> using namespace std; #include<stdio.h> #include<string.h> using  std::string; //#define MAX 1000 int substr(char dst[], char src[], int start, int len);  int main() { 	int start, len, sum; 	char src[5] = {0,0,0,0,0};     //初始化为0，注意输入的时候只输5个字符，因为数组大小是5，这个可以随意改。 	char dst[5] = { 10,10,10,10,10 };  //10代表回车‘\n’ 	int ch; 	int i = 0;  	cout << "请输入start：" << endl; 	cin>>start;     cout << "请输入len：" << endl; 	cin >> len;  	while ((ch = getchar()) != EOF) 	{ 		if (ch != '\n') 		{ 			src[i] = (char)ch; 			i++; 		} 	} 	sum = substr(dst, src, start, len);  	cout << src << endl; 	cout << dst << endl; 	cout << sum << endl; 	getchar();  }  int substr(char dst[], char src[], int start, int len) { 	int j;  	if (start >= strlen(src) && start < 0 && len < 0) 		dst == NULL;  	for (j = 0; j<len; j++) 	{ 		if (src[start-1] != '\n')  //数组从0开始的 		{ 			dst[j] = src[start-1]; 			start++; 		} 	} 	return len;  //代表了dst中元素的个数 }
user-0 提问: 编写程序 定外卖可以有优惠券 求大佬指点

回复:
user: user-1
content: do {     if (has("优惠券"))     {         use("优惠券");         buy("外卖");     }     else     {         try_get("优惠券");         continue;     } } while(account.has_money());

user: user-2
content: 要想写好程序，首先就需要吃透需求，你感觉你的需求很明确和合理吗？

user: user-3
content: 你先要和美团有py交易才能进行下去

user: user-4
content: 你这不是问问题吧，可能是来逗着玩的，没有想法，没有具体的问题，怎么搞
user-0 提问: 引发了异常: 读取访问权限冲突。 s 是 0xD94000。

回复:
user: user-1
content: if语句多一个分号，while里面应该是*s

user: user-2
content: while (s != 0) while (*s != 0) s是指针不是字符，因此应该是*s和0比较

user: user-3
content: 还需要说明的是，你的while判断是写错了，还是本来是这么设计了，s !=0 ；s是一个指针，你是不是要写成*s ！= 0

user: user-3
content: if (a[*s - 'a'] == 2);         {    这个地方有一个分号 ，  因为这个分号的存在，这个是一个死循环，S指针会一直自增，然后超出分配的内存区域，就溢出了。

user: user-3
content: 这种错误一般是内存溢出，要么数组溢出了，要么没有分配内存。
user-0 提问: C语言中,static 在头文件里声明了变量.print1被调用了,为啥a没变??

回复:
user: user-0
content: 感谢回答,明白了.  引用 5 楼 user-2 的回复:你在x.h文件中定义的static int a = 123;即定义了一个静态全局变量a，a只在定义它的源文件内有效，其他源文件无法访问它。然后你的c1.cpp和c2.cpp分别包含了x.h文件，在预处理阶段代码展开，c1.cpp和c2.cpp就会插入x.h和iostream文件的代码，所以c1.cpp和c2.cpp中都会存在一个static int a = 123;（注意，这两个a分别只在各自的源文件内有效，其他源文件无法访问它），那么这两个文件可能就是这样了：  // ----  file: c1.cpp ///iostream的代码展开。。。 static int a = 123; void print1() {     a = 1;     std::cout << __FILE__ << "a is " << a << std::endl; }  // ---- file: c2.cpp ///iostream的代码展开。。。 static int a = 123; void print2() {     std::cout << __FILE__ << "a is " << a << std::endl; } 那么你的m.cpp在调用的时候 // ------  file: m.cpp #include <iostream> extern void print1(); extern void print2(); int main() {     print1();//a = 1     print2();//a = 123 } 结果自然就是1和123

user: user-1
content: 所以，简单地说，当static修饰全局变量的时候，全局变量变成了局部的（即全部变量局限于引用它的文件内）；当static修饰局部变量的时候，布局变量成了静态的（局部变量始终有效）。  引用 4 楼 yt_42370304 的回复:感谢您的回答,  在C系统的编程语言中，#include是为了声明在这个地方插入别的文件中的代码。 展开后,在每一.c文件中都会存在a变量. 都是相互独立的.   [quote=引用 3 楼 super_admi 的回复:] 你这么说，就说明你没弄明白#include的含义。 你把#include展开试试。  [quote=引用 2 楼 yt_42370304 的回复:] [quote=引用 1 楼 super_admi 的回复:] static  有多重含义。一般来说，像你这种定义方式，表示的是局部，而不是全局。  在print1()中,这个a 是局部变量吗?  为啥没声明呢?[/quote][/quote][/quote]

user: user-2
content: 你在x.h文件中定义的static int a = 123;即定义了一个静态全局变量a，a只在定义它的源文件内有效，其他源文件无法访问它。然后你的c1.cpp和c2.cpp分别包含了x.h文件，在预处理阶段代码展开，c1.cpp和c2.cpp就会插入x.h和iostream文件的代码，所以c1.cpp和c2.cpp中都会存在一个static int a = 123;（注意，这两个a分别只在各自的源文件内有效，其他源文件无法访问它），那么这两个文件可能就是这样了：  // ----  file: c1.cpp ///iostream的代码展开。。。 static int a = 123; void print1() {     a = 1;     std::cout << __FILE__ << "a is " << a << std::endl; }  // ---- file: c2.cpp ///iostream的代码展开。。。 static int a = 123; void print2() {     std::cout << __FILE__ << "a is " << a << std::endl; } 那么你的m.cpp在调用的时候 // ------  file: m.cpp #include <iostream> extern void print1(); extern void print2(); int main() {     print1();//a = 1     print2();//a = 123 } 结果自然就是1和123

user: user-0
content: 感谢您的回答,  在C系统的编程语言中，#include是为了声明在这个地方插入别的文件中的代码。 展开后,在每一.c文件中都会存在a变量. 都是相互独立的.   引用 3 楼 super_admi 的回复:你这么说，就说明你没弄明白#include的含义。 你把#include展开试试。  [quote=引用 2 楼 yt_42370304 的回复:] [quote=引用 1 楼 super_admi 的回复:] static  有多重含义。一般来说，像你这种定义方式，表示的是局部，而不是全局。  在print1()中,这个a 是局部变量吗?  为啥没声明呢?[/quote][/quote]

user: user-1
content: 你这么说，就说明你没弄明白#include的含义。 你把#include展开试试。  引用 2 楼 yt_42370304 的回复:[quote=引用 1 楼 super_admi 的回复:] static  有多重含义。一般来说，像你这种定义方式，表示的是局部，而不是全局。  在print1()中,这个a 是局部变量吗?  为啥没声明呢?[/quote]

user: user-0
content: 引用 1 楼 super_admi 的回复:static  有多重含义。一般来说，像你这种定义方式，表示的是局部，而不是全局。  在print1()中,这个a 是局部变量吗?  为啥没声明呢?

user: user-1
content: static  有多重含义。一般来说，像你这种定义方式，表示的是局部，而不是全局。
user-0 提问: 大神帮忙看看，菜鸟新手求助

回复:
user: user-1
content: #include<stdio.h>  int main(void) {     int x;     float y;      printf("Enter x :\n");     scanf("%d",&x);     if (0 == x) {         y = 0;     } else {         y = 1.0 / x;     }     printf("y = f(%d) = %.2f\n", x, y);     return 0; } 参考一下吧  若将x == 0换成0 == x这样就不会有问题了即使写成0 = x，编译器也会提醒你的

user: user-2
content: 说好的判断搞成了赋值。。。

user: user-3
content: if条件里的x=0-->x==0
user-0 提问: 输入两个二进制数x和y，转换为8位二进制数(最高位为符号位)

回复:
user: user-0
content: 是输入两个十进制数，转换成8位二进制

user: user-1
content: 用itoa转换一下即可

user: user-2
content: 仅供参考：#include <stdio.h> #include <stdlib.h> #include <string.h> #include <locale.h> int main() {     int i,v;     char bs[33];     char b[33];     char hs[9];     char h[9];     char s[4];     char *e;  // 十进制整数转二进制串；     i=1024;     ltoa(i,b,2);     sprintf(bs,"%032s",b);     printf("i=%d,bs=%s\n",i,bs); // 十进制整数转十六进制串；     i=1024;     ltoa(i,h,16);     sprintf(hs,"%08s",h);     printf("i=%d,hs=%s\n",i,hs); // 十六进制字符串转成十进制数     strcpy(hs,"00000400");     sscanf(hs,"%x",&i);     printf("hs=%s,i=%d\n",hs,i); // 二进制字符串转化为十六进制字符串；     strcpy(bs,"00000000000000000000010000000000");     i=strtol(bs,&e,2);     ltoa(i,h,16);     sprintf(hs,"%08s",h);     printf("bs=%s,hs=%s\n",bs,hs); // 二进制字符串转化为十进制数；     strcpy(bs,"00000000000000000000010000000000");     i=strtol(bs,&e,2);     printf("bs=%s,i=%d\n",bs,i); // 十六进制字符串转成二进制串     strcpy(hs,"00000400");     sscanf(hs,"%x",&i);     ltoa(i,b,2);     sprintf(bs,"%032s",b);     printf("hs=%s,bs=%s\n",hs,bs); // ASC\GBK字符串转十六进制串     strcpy(s,"a汉");     i=0;     while (1) {         if (0==s[i]) break;         sprintf(hs+i*2,"%02X",(unsigned char)s[i]);         i++;     }     setlocale(LC_ALL,"chs");     printf("s=%s,hs=%s\n",s,hs); // 十六进制字符串转成汉字（GBK）及字符(ASC)     strcpy(hs,"61BABA");     i=0;     while (1) {         if (1!=sscanf(hs+i*2,"%2x",&v)) break;         s[i]=(char)v;         i++;     }     s[i]=0;     printf("hs=%s,s=%s\n",hs,s);      return 0;  } //i=1024,bs=00000000000000000000010000000000 //i=1024,hs=00000400 //hs=00000400,i=1024 //bs=00000000000000000000010000000000,hs=00000400 //bs=00000000000000000000010000000000,i=1024 //hs=00000400,bs=00000000000000000000010000000000 //s=a汉,hs=61BABA //hs=61BABA,s=a汉
user-0 提问: 【C语言单链表】学生求助各位老师

回复:
user: user-1

user: user-2
content: typedef int datatype;    对于你这个写法  真是感觉你是不是特别闲。 如果是教材练习一下typedef  当我没说。

user: user-3
content: 数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633

user: user-4
content: #include<stdio.h> #include<stdlib.h>  typedef int datatype;  typedef struct link_node{     datatype info;     struct link_node *next; }node;  node* init() {     return NULL; }  void display(node *head) {     node *p;     p = head;     if(!p)  {         printf("单链表是空的！");         return;     }      printf("单链表各结点的值为：\n");     while (p) {         printf("%5d", p->info);         //p->next;         p = p->next;     }     putchar(10); }  node *find(node *head,int i) {     int j=1;     node *p = head;     if(i<1)         return NULL;     while(p && i!=j)     {         p = p->next;         j++;     }     return p; }  node *insert(node *head, datatype x,int i) {     node *p,*q;      q = find(head,i);     if (!q && i != 0) {         printf("\n找不到%d个结点，不能插入%d！",i,x);         return head;     }     p = (node *)malloc(sizeof(node));     p->info = x;     if (i == 0) {         p->next = head;         head = p;     }     else {         p->next = q->next;         q->next = p;     }     return head; }  int main() {     node *head;     int i,x,n;      //init();    //函数不使用返回值没有意义     head = init();      //for(n=0;n<2;n++){     for(i = 0; i < 5; i++){         printf("输入插入位置：");         scanf("%d", &n);         printf("输入插入元素：");         scanf("%d", &x);         head = insert(head, x, n);     }     display(head);      return 0; } 参考一下吧  楼主的链表还是尾插法，不是先插头结点，头结点必须是第一个，不论是尾插法还是头插法。

user: user-0
content: 哎呀低级错误，不好意思打扰各位了
user-0 提问: c需要char型数字转换为，int型。

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: 没懂什么问题哦

user: user-3
content: 也就只能是个位数的转化而已，两位甚至是三位就不行了

user: user-4
content: 引用 1 楼 smwhotjay的回复:int b=atoi(a)-'0'; 减48就行

user: user-5
content: 引用 17 楼 俗人的回复:这个有语病吧，在定义一个变量的时候不能直接将表达式赋值 可以的啊，，，，，，，，，，

user: user-6
content: 减去字符0 就可以解决这个问题

user: user-7

user: user-8
content: 这个有语病吧，在定义一个变量的时候不能直接将表达式赋值

user: user-9
content: 结果    9

user: user-10
content: 挺好的，并没有什么问题呀

user: user-11
content: 这么写应该没问题，你想说啥？

user: user-12
content: char型数字转换为int型 差不多是你这种写法..

user: user-13
content: 写得挺好的，并没有什么问题

user: user-14
content: 程序没问题啊

user: user-15
content: 这方法没错啊，问题在哪里？

user: user-16
content: 楼主的问题是什么？数字0~9对应的ASCII的值是val + '0'，val为0~9

user: user-17
content: 挺好的，输出9

user: user-18
content: 减 ‘0’ 之前 判断一下 a 是否 在 ‘9’ ‘0’ 之间

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

user: user-20
content: 这样写写得挺好的，没有什么问题
user-0 提问: 这段编码编译没出错但是运行起来就错了，到循环那块直接提示错误

回复:
user: user-0
content: 引用 7 楼 smwhotjay 的回复:scanf_s("%d", &(L->data[i])); 应该就是这个取地址的问题了十分感谢，是我自己太马虎了！

user: user-0
content: 引用 4 楼 ziyu666666的回复:第三十七行  scanf_s("%d", L->data[i]); 改为  scanf_s("%d", &L->data[i]); 嗯嗯，我真是太粗心了！谢谢啦

user: user-0
content: 这里是有点问题，但主要问题还是下面scanf那边漏了个取址符号，太马虎了，不过还是很感谢啦

user: user-1
content: scanf_s("%d", &(L->data[i])); 应该就是这个取地址的问题了

user: user-2
content: scanf_s("%d", &L->data[i]);   这里的指针有问题 你只需要把数组的【0】的地址赋值给这个指针再输出就可以了。

user: user-3
content: scanf_s()的第二的参数开始，要求是地址，L->data[i]是一个值，所以要取地址。

user: user-3
content: 第三十七行  scanf_s("%d", L->data[i]); 改为  scanf_s("%d", &L->data[i]);

user: user-4
content: int main() {     Seqlist* L = new Seqlist;     initList(L);     printf("How much information do you want to input?：\n");     int a;     scanf_s("%d", &a);     Print(&L,a);     system("pause");     if(L)     delete L;     return 0; };

user: user-4
content: 你没new内存就直接用了，使用的是野指针。

user: user-0
content: 附上错误提示
user-0 提问: 学习数据结构与算法，有没有大佬推荐一下什么书好

回复:
user: user-1
content: 程序员的进阶课-数据结构与算法 网盘地址：https://pan.baidu.com/s/1OJOBGZLbUnubUqulfpVYqw&shfl=shareset 提取码: meum 备用地址（腾讯微云）：https://share.weiyun.com/5K9uLmJ 密码：hbwre2

user: user-2
content: 理解和讨论之前请先学会如何观察！  http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素

user: user-3
content: 如果看视频的话，推荐你看一下郝斌老师的，挺详细的之前我们大学也是老师推荐看。

user: user-4
content: 网上或本站下载里搜   数据结构：c语言描述（第3版）

user: user-5
content: 看你是怎么个“学习”了。如果是为了考试，那么我再和你说下去就是鸡同鸭讲。

user: user-6
content: 《大话数据结构》有意思，讲的也好

user: user-7
content: 大多数人都推荐《算法导论》，这本书确实非常好，但是初学者很难看懂。我建议先看看《啊哈算法》，非常浅显易懂，书中配有大量的图画，帮助理解。然后可以看看《图解算法》也是入门级别的，补充了一些啊哈算法中没讲到的。看完这两本书，对算法已经有了很好的基础。这时就可以去看看比较系统比较经典的书籍。《算法》简单一点，《数据结构与算法分析》（c语言描述）评分非常高的一本经典之作。《算法导论》比较全面，经典，书中有大量的理论推导。最后如果想在算法上更深一步，可以了解一下《算法竞赛入门经典》，了解一下ACM.希望能帮到博主。

user: user-8
content: 有个网站，https://visualgo.net/en，个人感觉挺好的

user: user-9
content: 《算法导论》理论性太强，不适合学习。 还是《算法》好一些。

user: user-10
content: <<数据结构与算法>> 另外,配合一本C++语言的书一起看,较好些.

user: user-2
content: 《数据结构（C语言描述）》 《算法精解（C语言描述）》 为什么要有数据结构这个东东？ 因为要将现实世界或者抽象理论中的各种数据保存在计算机外存（光盘、硬盘、U盘……）或内存（ROM、RAM、SRAM……）里面的二进制字节数组中。 然后让CPU这个只会执行预先保存好的加减乘除移位条件转移……等机器指令的家伙按照人的意志去处理这些数据。至于具体如何处理就是所谓算法。  电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……

user: user-11
content: 算法导论 虽然看了几次也只是看到动态规划。书还是非常好的

user: user-12
content: 你可以先看一下《数据结构与算法》

user: user-13
content: 《算法导论》可以考虑看一下
user-0 提问: 请教（C语言）

回复:
user: user-1
content: 或者你可以用switch语句更简单明了？

user: user-2
content: 输出没有规律的话就用楼上写的数组映射的方式

user: user-3
content: https://bbs.csdn.net/topics/380157851

user: user-3
content: #include <stdio.h> char mod_a[10][20] ={     "1 3"      "\n" //0     "1 2 3 4"  "\n",//0     //-----------------     "0 1"      "\n" //1     "0"        "\n",//1     //-----------------     "1"        "\n" //2     "1 2"      "\n",//2     //-----------------     "0 2 3"    "\n" //3     "0 1 2"    "\n",//3     //-----------------     "2 3"      "\n" //4     "2"        "\n",//4     //-----------------     "0 1 2 3"  "\n" //5     "0 2"      "\n",//5     //-----------------     "0 1 3"    "\n" //6     "1 3 4"    "\n",//6     //-----------------     "0 3"      "\n" //7     "0 1 3 4"  "\n",//7     //-----------------     "3"        "\n" //8     "3 4"      "\n",//8     //-----------------     "0 1 3"    "\n" //9     "0 3 4"    "\n",//9     //----------------- };  int main() {     int a;     scanf("%d",&a);     printf("%s",mod_a[a%10]);     return 0; }

user: user-4
content: 是这样吗？ #include <stdio.h>  char mod_a[10][20] = {     "1 3\n1 2 3 4",     "0 1\n0",     "1\n1 2",     "0 2 3\n0 1 2",     "2 3\n2",     "0 1 2 3\n0 2",     "0 1 3\n1 3 4",     "0 3\n0 1 3 4",     "3\n3 4",     "0 1 3\n0 3 4" };  int main() {     int a;     scanf("%d",&a);     printf("%s\n",mod_a[a%10]);     return 0; }
user-0 提问: 请教各位一个指针问题

回复:
user: user-1
content: 绕弯弯，如果a是short a[x]; 那么跟a[0]=rand 执行一样。

user: user-2
content: a[0]中，a应该是char或unsigned char。不然没必要用强制类型转换

user: user-3
content: 那得看 a 怎么定义的, 是什么类型
user-0 提问: system函数失效问题

回复:
user: user-1
content: 在IDE中重新编译后运行也是这样子？ 你这个exe是最新生成的吗

user: user-2
content: 关闭UAC、防火墙、杀毒软件、…… 以管理员身份运行 ……

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:system <process.h> or <stdlib.h>  加了stdlib.h也试过了，也是不行， #include <stdio.h> #include <string.h> #include <stdlib.h>  int main(int argc, char **argv) {        int rc=0;     printf("---begin---\n");     rc=system("qqq");     printf("---over--rc:%d-\n",rc); } 这样随便执行一个命令，也不报错，就是啥反应也没，，返回值打出来是-1，有没有可能跟什么环境变量有关？

user: user-0
content: 引用 1 楼 jianwen0529 的回复:在IDE中重新编译后运行也是这样子？ 你这个exe是最新生成的吗   在windows下用mingw32  gcc编译的，程序可以肯定是最新的

user: user-2
content: system <process.h> or <stdlib.h>
user-0 提问: vs2015怎么报错fatal error C1083: 无法打开包括文件: “hotel.h”: No such file or directory

回复:
user: user-1
content: 文件路径不对吧，他们是不是不在同级目录下

user: user-2
content: 三个文件放在同一个文件夹下

user: user-3
content: //程序清单9.11 hotel.h头文件  /* 与程序清单9.10一起编译　　 */  你确定这两个是同一个头文件，放对地方了？

user: user-0
content: 引用 2 楼 jianwen0529 的回复:三个文件放在同一个文件夹下 这个是C primer PLUS 第9章的程序清单，应该没错吧，都按原来程序敲上去的！

user: user-0
content: 这个是C primer PLUS 第9章的程序清单，应该没错吧，都按原来程序敲上去的！
user-0 提问: linux popen执行成功 fgets获得数据程序崩溃

回复:
user: user-1
content: popen("pgrep -f paper", "r"); 这个直接指定文件名试试吧 Core was generated by `./paper.out'.

user: user-2
content: 试了一下你的代码（贴出来的），没发现有段错误的情况。另外，建议确认一下pgrep -f paper命令是否能够执行成功  #include <stdio.h> #include <stdlib.h>  void Mutex() {     FILE *fp = popen("pgrep -f paper", "r");     //FILE *fp = popen("cd .. ", "r");     if (fp == (void *)0) {         puts("fp is null");         exit(0);     }     char buf[256]={0};     fgets(buf, 256, fp);     printf("%s", buf);     pclose(fp); }  int main(void) {      Mutex();     return 0; }

user: user-3
content: 单就你贴出来的代码，我跑了一下，没出问题。问题是不是出在其它地方

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

回复:
user: user-1
content: 记住指针是个变量，跟int、double一样的变量

user: user-2
content: 指针即地址 引用即别名

user: user-3
content: 引用可以用指针代替，引用也可以代替指针（一重指针）。 对于用什么方式，也可以根据自己的理解程度，也可以根据实际情况来定。 比如，实参是一个变量，那么用指针/引用作为形参都是可以。如果实参是一重指针，那么用二重指针或引用也都是可以的。若实参是多重指针，而形参再用指针，会在原来的基础上要增加一重，若用引用就可以不用增加指针的重数。  个人理解，仅供参考

user: user-4
content: 其实吧 我觉得人类总是在进步的，既然是不断进步研究出来的东西，定然有他存在的道理，我们就欣然取之，当然也不能盲目的非用不可，楼上几位都解释的很清楚了，能用则用，不能用则换之。

user: user-5
content: 虽然我不是大佬，但我说说我的想法。幸好我不是大佬，说错了也没关系。  我记得早期的C里面确实是没有引用一说的，但新的C标准，似乎也有引用了？（没确认过）  我对引用的理解是：如果变量A1是变量A的引用，就意味着A1和A是同一个东西，就好比：在下姓关名羽，字云长，其实关羽（A）和关云长（A1）是同一个人，只不过关云长是关羽的别名。 但是，传指针的时候，传入指针的变量和接收指针的变量，一定是两个不同的变量，只是它们都指向同一个地址。在实际编程中，遇到需要传出参数值的时候，“传入指针的变量”和“接收指针的变量”这两个玩意都不是我们关注的目标，甚至它们很多时候会干扰我们的思考。我们关注的是它们指向的共同目标：指向的地址。从某种程度上来说，引用最终还是靠指针实现的，但它隐藏了上述两个变量，让你能够更清晰地关注问题的主体。  1.引用的优势在于增强了代码可读性，降低了出错概率； 2.指针的优势在于更加灵活； 3.能使用引用的地方，一定可以使用指针，但反之则不一定。 4.能使用引用的地方，我建议尽量使用引用。

user: user-6
content: 引用在编译器上通常实现为一个地址不可变的常量指针，主要区别是，引用能够自动解引用，指针不行。 1 传递类时，推荐使用引用，既能减少内存拷贝的消耗，也能保证安全。 2 指针优于引用？我觉得引用通常可以作为是一个常量指针，如果能用引用，尽量用引用，如果引用满足不了，再用指针，毕竟指针没啥干不了的，但也是很容易出问题的。 3 如果不考虑安全，效率，可读性等因素，个人觉得引用不是一定要用的。  总之，记住一点，从编译器角度来看，把引用当作一个地址不可变的常量指针，且可以自动解引用，区别和用法自然就很明了。
user-0 提问: linux下多线程malloc会出现什么问题吗？

回复:
user: user-0
content: 引用 8 楼 hjwang77 的回复:每个线程分配的空间都是单独的，几个线程就消耗几块内存。 多个线程后时间变化，应该和你recv函数实现有关，不止那块内存的问题。  现在在开启线程之前就 malloc了一块空间，分成100份，给每个线程使用，为什么recv的时间还是会缩短很多呢？

user: user-1
content: 感觉问题不够清晰，楼主提到的时间是指什么时间，每个子线程里的recv是指同一个fd中接收数据吗?还是每个线程的fd是不一样的？

user: user-2
content: 首先解释一下你的问题，就比如一桶水，一个人能喝一天，两个人只能喝半天，4个人6个小时就喝完了，水是一定的，每个人也都在喝水，用的是同样的杯子，但是他们终究是不同的人，你不能因为他们长得几乎一样，用同样的杯子就判定他们接的水都给一个人喝了。线程也是一样的，虽然是调用的同一个函数，但是他们都在独立的运行，而数据是一定的，时间也就和数量成比例了。其次，你这样频繁申请释放内存，会造成楼上所说的问题，建议每个线程固定一块内存，最后再释放。

user: user-3
content: 既然频繁需要用到内存，为何不在初始化申请好大块内存，每个线程只用指定的一段内存呢？ 性能要好上很多，不用频繁申请释放，只需要清零一次就好

user: user-4
content: 楼主这么干，不管空间成本还是时间成本应该都是很高的吧，频繁使用malloc非常消耗时间，而且会产生内存碎片，你这样多次申请再释放，会导致原先正常使用的内存，由于内存碎片的缘故不能再继续使用了，所以会出现首地址不同的现象。 个人建议，楼主还是用数组或者内存池来存储数据吧。

user: user-5
content: 每个线程分配的空间都是单独的，几个线程就消耗几块内存。 多个线程后时间变化，应该和你recv函数实现有关，不止那块内存的问题。

user: user-0
content: 听了大家的意见， 是总共malloc了 一大片空间。 但是recv的时间依然会减半。 是什么原因呢

user: user-0
content: 引用 4 楼 qq_39850605 的回复:首先解释一下你的问题，就比如一桶水，一个人能喝一天，两个人只能喝半天，4个人6个小时就喝完了，水是一定的，每个人也都在喝水，用的是同样的杯子，但是他们终究是不同的人，你不能因为他们长得几乎一样，用同样的杯子就判定他们接的水都给一个人喝了。线程也是一样的，虽然是调用的同一个函数，但是他们都在独立的运行，而数据是一定的，时间也就和数量成比例了。其次，你这样频繁申请释放内存，会造成楼上所说的问题，建议每个线程固定一块内存，最后再释放。  但是我每个线程都有一个buffer去接收数据。 并不是用的同一个杯子。是用不同的杯子 去接收数据

user: user-0
content: 现在就发现一个问题。 例如： 如果我同时开2个线程 去接受数据， 那时间是20秒、 如果我同时开4个线程 去接受数据， 那时间是10秒。 如果我同时开8个线程 去接受数据， 那时间是5秒。 看起来像，他们都往同一个malloc的 buffer中recv数据。  但是我又简单写了个测试程序， 同时开很多线程去malloc， 接着去打印他们的首地址，发现首地址是不同的。 那么，为什么还会出现这种情况呢？？
user-0 提问: 递归函数返回值

回复:
user: user-1
content: 我的if条件中的return语句，返回的只是当前递归的这一层  不是很清楚你k是代表什么含义，在这里来看貌似是查找第k个（从根开始，从左到右，深度的顺序）  也有逻辑的问题，查找到之后，部分递归路径依旧还在继续查找

user: user-2
content: 为什么我觉得这个程序有问题呢？

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

回复:
user: user-1
content: 你的代码写的不错，就是稍微改动以下就可以了 #include <stdio.h>  int main() { 	int n, i, j, boo, a = 0;//-------------对a赋初值-------------- 	scanf("%d", &n); 	for (i = 2; i <= n; i++) 	{ 		boo = 0; 		for (j = 2; j<i; j++) 		{ 			if (i%j == 0) 			{ 				boo = 1; 				break; 			} 		} 		if (boo == 0) 		{ 			printf("%d ", i); 			a++;//-----------此时表示素数的个数加1------------- 		} 		else//------------如果不是素数，则判断下一个数-------- 		{ 			continue; 		} 		if (a % 3 == 0)//---------------是模3而不是模5--------- 		{ 			printf("\n"); 		} 	} 	return 0; } 运行的结果如下所示

user: user-2
content: 哪里有对a赋值了？

user: user-3
content: 引用 5 楼 hou09tian 的回复:你的代码写的不错，就是稍微改动以下就可以了 #include <stdio.h>  int main() { 	int n, i, j, boo, a = 0;//-------------对a赋初值-------------- 	scanf("%d", &n); 	for (i = 2; i <= n; i++) 	{ 		boo = 0; 		for (j = 2; j<i; j++) 		{ 			if (i%j == 0) 			{ 				boo = 1; 				break; 			} 		} 		if (boo == 0) 		{ 			printf("%d ", i); 			a++;//-----------此时表示素数的个数加1------------- 		} 		else//------------如果不是素数，则判断下一个数-------- 		{ 			continue; 		} 		if (a % 3 == 0)//---------------是模3而不是模5--------- 		{ 			printf("\n"); 		} 	} 	return 0; } 运行的结果如下所示   引用 5 楼 hou09tian 的回复:你的代码写的不错，就是稍微改动以下就可以了 #include <stdio.h>  int main() { 	int n, i, j, boo, a = 0;//-------------对a赋初值-------------- 	scanf("%d", &n); 	for (i = 2; i <= n; i++) 	{ 		boo = 0; 		for (j = 2; j<i; j++) 		{ 			if (i%j == 0) 			{ 				boo = 1; 				break; 			} 		} 		if (boo == 0) 		{ 			printf("%d ", i); 			a++;//-----------此时表示素数的个数加1------------- 		} 		else//------------如果不是素数，则判断下一个数-------- 		{ 			continue; 		} 		if (a % 3 == 0)//---------------是模3而不是模5--------- 		{ 			printf("\n"); 		} 	} 	return 0; } 运行的结果如下所示  把换行打印放到boo==0里面更合理，你这个效率低了

user: user-4
content: 行尾多一个空格会被很多自动判断答案是否正确的系统判为错误的。

user: user-0
content: 引用 1 楼 赵4老师的回复:#include<stdio.h> int main() {     int n,i,j,boo,a=0;     scanf("%d",&n);     for(i=2;i<=n;i++) {         boo=0;         for(j=2;j<i;j++) {             if(i%j==0) {                 boo=1;                 break;             }         }         if(boo==0) {             printf("%d",i);             if(a%3==2) {                 printf("\n");             } else {                 printf(" ");             }             a++;         }     }     return 0; }  谢谢大佬

user: user-4
content: #include<stdio.h> int main() {     int n,i,j,boo,a=0;     scanf("%d",&n);     for(i=2;i<=n;i++) {         boo=0;         for(j=2;j<i;j++) {             if(i%j==0) {                 boo=1;                 break;             }         }         if(boo==0) {             printf("%d",i);             if(a%3==2) {                 printf("\n");             } else {                 printf(" ");             }             a++;         }     }     return 0; }

user: user-5
content: 这类问题debug是可以发现且解决的
user-0 提问: VS2017中如何调试带参数的C语言WIN32控制台程序？

回复:
user: user-0
content: 搞定，感谢  引用 1 楼 hdt 的回复:项目-》设置-》调试-》参数

user: user-1
content: 项目-》设置-》调试-》参数
user-0 提问: linux 中allow_signal signal_pending flush_signals  这三个函数问题  显示未定义函数

回复:
user: user-1
content: 头文件添加#include <linux/sched/signal.h>和 #include <linux/uaccess.h>，问题解决

user: user-2
content: 内核高于4.4，这两个方法都没有了，降内核吧