Question: 求教大佬

加个打印很难么？

运算中出现无效数据，许多情况会导致-nan(ind) 如0除以0，负数开平方等 参看以下博文 https://blog.csdn.net/acoolgiser/article/details/81188440  试过这个代码，do-while循环多次就会导致-nan(ind)

建议你这样，把142行 涉及到的变量都打到日志里面，看下哪个变量有问题？


Question: 求教大佬DEV C调试出现的问题

太长了没细看 你把142行的 sqrt 里面的表达式的计算结果打印出来看看，是不是为负数了

devc无敌


Question: C语言指针问题，新手小白求教，被绕得头晕了

第一个是指向指针的指针

函数指针了解下，把一个函数作为一个参数，一般用于回调函数。

（1）float (**p)(10);  //这个是否有笔误(圆括号->方括号)？感觉像指向flat f(int)的函数指针的指针，且在以参数为10调用；如果确定没有笔误是个声明，那么可以解读为p为float f(int a = 10)这样函数类型的函数指针的指针 （2）double *(*p)[10]; //p是一个指向长度为10的，存放类型为double*的数组指针（也就是p是个指针，指向一个数组，该数组长度为10，类型为double*） （3）double (*p[10])();//p是长度为10的，存放类型为double (*f)()这样的函数指针类型的指针数组（也就是p是个指针数组，该数组长度为10，类型为double (*f)()这样的函数指针） （4）int *((*p)[10]);//同(2)，[]优先级高于*，所以外层圆括号有没有是一个效果 （5）int (*(p)(int,int))(int);//p是一个void* f1(int，int)的指针函数，该指针函数返回一个指向int (*f2)(int)函数类型的指针  个人理解供参考。 一般复杂的指针定义，建议用typedef


Question: 打印数字平行四边形

然后问题是？


Question: C语言

哇哦，谢谢啦，程序可以运行了，非常感谢。

看上去像是工程设置类型错误，应该设置为控制台类型。(win32 console application)

我删除了第一行之后，编译时没有错误，但是组建是还是有一个错误，说是我的外部符号有一个未解决的错误，这个该怎么解决呢？

楼上加一，删除第一行就可以了

删除第一行就可以了。  stdafx.h 不是 c语言 必要 头文件 没有，无需包含。


Question: 设计软件界面的软件是哪个，按钮啊之类的链接到相应的函数代码

图形用户界面（GUI）编程可以学习C++ Builder，架构先进（和C#一样拖控件），入门比较容易。  　　C++ Builder是真正的可视化的开发工具。C++ Builder可以用鼠标拖拉控件加上设置属性轻松的“设计”出一个程序的图形用户界面，利用可视的组件/控件像“搭积木”一样，以“所见即所得”的方式搭建应用程序的界面，这也是C++ Builder这个名字中Builder的概念。这样，只需要用C++语言编写业务逻辑代码，类似于DOS下文本界面编程，只要专注于实现业务逻辑功能就可以了，代码非常简洁。数据的输入和表现，都在图形用户界面，非常直观、易用。这就是RAD开发（Rapid Application Development，快速应用程序开发）。  书籍推荐： 《C++Builder 6程序设计教程（第二版）》 （陆卫忠，刘文亮　等编著 /2011-04-01 /科学出版社）（当当网） 《C++Builder 6编程实例精解》（赵明现），PDF，是数字版的，非扫描版的，里面还有一个俄罗斯方块游戏的完整实现。 《精彩C++Builder 6程序设计》（台湾 吴逸贤），里面有10几个简单小游戏的实现，可以自己看懂以后再重写，才是自己掌握的。 《C++ Builder 5高级编程实例精解》（刘滨 编著）都是较大的实用的程序。  C++ Builder书籍下载： https://pan.baidu.com/s/13n9hxwVj9ai1p5L2rQC83Q

很多啊，MFC、QT、WPF等等，你现在要学一个界面框架


Question: printf输出遇到问题

好久没有登录了，现在上来缺无法发帖，有人知道为什么？

可能你和scanf搞混了，scanf是通过地址传入参数，例如int a；scanf（“%d”,&a）; 输出是变量的值，例如printf（“%d”,a）,而不是地址输出，如例如printf（“%d”,&a） 你说每次输出的整数一直是那个，多半打印的是地址

&是取地址符，printf输出带上这个就是取地址的意思，所以输出的不是值

第一，你如果真的要学，这种问题就压根不会来论坛上问，直接就去搜索了 第二，我回的就是在告诉你两点，发帖自己都不看看图看得清看不清的，你的printf使用有问题 第三，像你这种发帖不会结贴更不可能会的人，没人有义务帮你回答问题 引用 8 楼 qq_43320728 的回复:[quote=引用 1 楼 niiiloc的回复:]自己发上来的帖子不看看的么？这图片谁看的清？ 好好网上搜搜printf怎么用的吧 直接说printf出问题不会吗?谁不会去搜[/quote]

图片质量不错

要输出sum的数值就改成printf("%d",sum); 要输出sum的地址就改成printf("%p",&sum);

输出sum的地址，建议用%p，而不是%d.因为地址是一个无符号整型，即unsigned int  如果是想输出sum的值，去掉&

你 可能把 printf 和 scanf 搞混了  #include<stdio.h> int main() {     int i, j;     scanf("%d %d", &i, &j);     printf("i=%d;j=%d", i, j);     return 0; }

如果我看图片没看错的话，你的是printf("%d", &sum);，可这是错的，你的sum是变量，&sum是取sum变量的地址，输出的是sum的地址，printf()输出变量内容的格式是直接放变量名的，像这样，printf("%d",sum); 另外还有你的图片太模糊了，一般你可以采用截图的方式发图会更清晰

VC6的补丁包SP6 安装了没？


Question: 新生求问

引用 2 楼 636f6c696e 的回复:学习下怎么加调试信息吧，不然有的是苦吃谢谢

引用 1 楼 独孤过 的回复:gets函数读入成功，返回与参数buffer相同的指针 读入过程中遇到EOF(End-of-File)或发生错误，返回NULL指针  上述错误代码是一直循环执行gets(s1)  另外，在2011年12月，ANSI采纳ISO/IEC 9899:2011标准，弃用gets函数 可以使用fgets代替，不过fgets会保留Enter键产生的字符至内存缓冲区，在Windows系统会多一个'\n'，需要手动去除，用法如下：  fgets(s1, 100, stdin); s1[strlen(s1) - 1] = '\0'; 谢谢

学习下怎么加调试信息吧，不然有的是苦吃


Question: 请教C结构体与结构体指针的应用场景问题

当需要空间大，尽量使用指针动态分配堆空间，避免直接使用局部数组，把栈空间耗尽 还有其它应用场景，慢慢会遇到

如果在作用域结束之前，结构体变量不再使用，其空间可以回收，则可以使用变量的形式 而退出作用域之后，结构体变量仍要使用，其空间不可以回收，就使用指针动态分配变量空间 另外数组空间需要动态变化时，也使用指针动态调整空间大小 注意有分配就要有释放，避免内存泄露 有malloc分配内存空间，就要有对应的free释放内存空间

其实这两者最大的区别，通俗讲就是作用域的区别，看你的结构体数据是否需要一直维护更新调用，如果不需要，就可以直接使用结构体

一个例子，形参。如果传递结构体变量，传过去的实参就是一个结构大小的变量，如果传递指针，那么就是4/8个字节的变量，这样效率是不是会增加，另外，也节省了空间。

struct Stu stu用的是栈内存， malloc上是堆内存 两者最大的区别在于： 1. 栈内存的作用域仅限于函数内，函数调用结束后自动回收。而堆内存的作用域是整个进程，只要没有调用free释放，这段内存一直存在。 2. 函数栈内存空间大小限制较小，一般在xk级别；而堆内存空间大小限制就要大得多。  综上两点，如果使用场景严格在一个函数内，且所需要的内存较小的情况下，建议用栈内存；如果使用场景较大或者内存使用较大，建议用堆内存。


Question: 请问这个while循环在用scanf函数为什么达不到预期效果

引用 8 楼 weixin_43534549的回复:do  while时whilj 打错了，想说的是do while 中while加分号，while循环时不用加

do  while时whilj

while循环的判断（）里scanf返回值要等于3才执行循环体，而似乎scanf（）会返回3这个值？

去掉while后面的分号，否则就是一个死循环（输入正确）

嗯(⊙_⊙)~弱弱的问一句，这个在手机上这么解贴啊？Σ( ° △ °|||)︴

哭晕在厕所，查了大半天(╥﹏╥)

while后面有个分号啊

嗯，我是看《c primer plus》上仿写的，也不太熟-_-||，按思路应该是输入三个float类型的数据，scanf()返回3，进入循环，但不知道那里出了错，实现不了预期功能。Ｏ(≧口≦)Ｏ


Question: makefile 想将.o文件直接输出到指定的 obj目录下，碰见奇怪问题

那正确的是咋样滴？

引用 5 楼 happy_lin2006 的回复:问题解决了，但是不知道为什么： 后来将： $(OBJ_FILES): $(CPP_FILES)     $(CXX) $(CXXFLAGS) -c -o $@ $< 改成： $(OBJ_PATH)/%.o:%.cpp 	$(CXX) $(CXXFLAGS) -c -o $@ $<  就可以了。 不清楚这里的%.o:%.cpp   和 $(OBJ_FILES): $(CPP_FILES)什么差别？  刚看到。  %.o:%.cpp   和 $(OBJ_FILES): $(CPP_FILES)  他俩的差别在于，我是这么理解的。 第一种，%.o:%.cpp ，两者为同时赋值，进行循环。 1.o 1.cpp 2.o 2. cpp 所以，$@ $< ，这么取，可以取到每个cpp。  第二种，$(OBJ_FILES): $(CPP_FILES)。。$(CPP_FILES)就是个固定的数组， 每次取。 $<  ，只能取到$(CPP_FILES)的第一项。

额。。。抱歉，才发现，我刚才传上去的，是错误的。

$<  表示第一个依赖文件。按照你之前的写法。自然是只有 a.cpp了

你应该这么写。  CXX    = g++  CXXFLAGS = -g -shared -fPIC -Xlinker --unresolved-symbols=ignore-in-shared-libs LDPFALGS = -lrt -lpthread # define compiling temporary dir CPP_FILES := $(wildcard *.cpp) OBJ_FILES := $(addprefix ./obj/,$(notdir $(CPP_FILES:.cpp=.o))) TARGET := test  all:$(TARGET)  %.o: $(CPP_FILES) 	$(CXX) $(CXXFLAGS) -c -o $@ $<  $(TARGET):$(OBJ_FILES) 	$(CXX) $(CXXFLAGS) -o $@ $^  clean: 	rm -rf $(OBJ_FILES)


Question: 求解！！！用c语言写了一个贪吃蛇小游戏，用的软件是code::block,调试和发布都能运行成功，可是将生成的exe文件复制到别的路径执行时蛇吃食物会闪退

gcc没有加-static编译吧。

引用 1 楼 user-1的回复:gcc没有加-static编译吧。 嗯，编译用了下GCC -static，可惜还是会闪退，看来不是缺少组件的问题，不过我学到了原来加-static是将依赖项也一起编译，谢谢啦！其实问题我今天上午已经解决了，是我学艺不精，学c语言的内存管理没有深刻了解，所以程序里分配内存那里错了，导致添加蛇身时会闪退，总而言之，谢谢你让我学到了另一个知识点！


Question: 无法成功生成项目怎么办？    急急急

先学会搜索，论坛提问的效率是很低的

如果不熟悉创建项目和程序运行步骤，参看以下博文 https://blog.csdn.net/xucongyoushan/article/details/86017602 VS2010和VS2013类似，着重看项目创建和程序运行

新建一个空白的win32控制台应用程序，把你的main函数拷贝进去

怎么定义啊，因为刚开始学都不是很懂

是不是未定义控制台入口main函数


Question: 一个堆砌分类的问题

需求 基本思路 和应用的算法

分数实在有点少  实在抱歉   请问各位大牛 是不是用python 比c++合适？

机器人竞赛  遇到的问题  有点类似汉诺塔

数学题吗？ 这是


Question: 如何用批处理实现计算机与Internet时间服务器同步？

如果不是强制要求， 使用系统配置就可以实现时间同步 配置： 控制面板--日期和时间—更改配置 勾选  与Internet时间服务器使时间同步 下方服务器栏，输入Internet时间服务器 国家授时中心：ntp.ntsc.ac.cn


Question: 求助，牛客网的采花生题目

题目本身就有歧义 你先找出花生最多的植株，去采摘它的花生;然后再找出剩下的植株里花生最多的，去采摘它的花生;依此类推，不过你一定要在我限定的时间内回到路边 这个策略并非一定是最优策略


Question: 蓝桥杯基础练习求大佬帮忙看看有什么错误，多谢。。。。

引用 1 楼 niiiloc的回复:你的t1赋值逻辑有问题，存在重复+s的情况 还有，最后的结果比较用l1就可以了，为什么还要用t1去比较 对哦，谢谢大佬了。。。。


Question: 杭电oj题目及答案

请问杭电OJ上1431用java语言做的在哪里问？

各位大佬，请多包涵，新手上路

不是，没弄好，本来要删的

Would you buy a used car from this man?

是否需要考虑大数的加法

所以 你这帖子是准备做什么? 问题解决了 代码也贴了 展示这段糟糕的代码??


Question: 结构体指针，内存分配问题请教

我想回复一下Randolf_A,sizeof(strup_1)=8,说明系统不是64位的吗？？？？

题主，这个问题需要考虑到内存对齐。 内存对齐有几条规则，以你定义的结构体为例，第一个元素的内存偏移从零开始： 1.变量的内存偏移是变量实际占用内存的整数倍； 2.占用的总内存需要是最大元素大小的整数倍；  实际来看，你的系统应该是32bits： 1.int类型，实际大小 4 字节，内存占用 0-3； 2.float类型，实际大小 8 字节，内存占用 8-15，规则1 3. double类型，实际大小 8 字节，内存占用16-23； 4.指针，32位系统下实际大小 4 字节，内存占用24-27； 5.指针，4字节，内存占用28-31； 6.指针，4字节，内存占用32-35； 实际来看，共计 36 字节，规则2指出，内存占用应该是8的倍数，故sizeof()输出的结果是40

给你解释一下啊，指针和给指着开辟空间的关系，，指针呢他就是一个固定大小的变量，他这个变量呢存放的就是一个地址（这跟int i 中i存放一个int值是一个道理的），所以记住这句话指针就不难：指针就是个变量，存放的就是一个地址值，，然后地址知道了，你需要知道这个地址里面放的啥，这就好像开发楼盘，我知道在这个楼在5号大街，所以你知道去这个找这个楼，但这个地方还没建起来呢，所以他没有这个楼的。你只是知道，应该有。。这就跟你开辟空间是一个道理，你知道了楼的地址，然后你需要盖楼，楼的大小是100，你就malloc（100）的，如果小了，那就完了。这就好像你malloc（sizeof(struct Stu*)）,你只是把门牌号的大小分配出来了。但盖楼的大小需要的是sizeof(Struct Stu)，那你的楼就完蛋了。这里楼的大小就是sizeof(struct Stu)40, 楼地址的大小就是sizeof(struct stu*)也就是8，那结果可想而知，你在8大小的地方要存放40大小的楼，，，这个sizeof就是个运算符，运算符！！！他就能得出个size_t（这里你就理解成int值）的结果。也就是说，如果你能保证你的值没错而且以后不更改，那malloc(40)自己往里塞值就行了，，除非你指针用的特别好，否则不要这么做，还是sizeof吧。然后还有一点，指针这个东西是不需要分配空间的，也就是说你需要给楼分配空间，但不需要给楼的地址分配，这个解释起来比较深奥，涉及到堆栈的知识，新手就先别探讨了，总之门牌号不需要分配大小。。malloc(sizeof(struct stu*))这种情况除非特殊高手用来计算，否则是不会有的。再说说你的那个类似等式的东西，等号前面就是楼的地址，等号后面就是实际的楼，懂了吧。你可以根据楼的地址找到楼，但楼这个实体有没有，还得取决于你盖没盖，还是那句话，除非你是指针高手，就sizeof（类型）就完事了，如果是数组就sizeof(类型)* 数组的数量

引用 6 楼 niiiloc 的回复:你的所有问题实质是对malloc理解不深刻导致 malloc的入参是申请内存的大小，出参是申请出来内存的位置，两者不要搞混了  谢谢，也就是说，要用 malloc ( sizeof( 结构体 ) ) ， 这样就申请了结构体大小的内存，然后= ，表示指针指向了这块

首先需要了解sizeof的原理，sizeof返回类型的长度（占用内存的字节数），sizeof结构体类型，得到的是类型的大小。sizeof结构体指针是指针类型的大小，指针类型要根据系统的CPU位数，如果是32位系统，那么指针类型长度为4，若为64位系统，则是8.

指针大小 永远 4字节(32位程序）  或8字节(64位程序)  , 仅仅一个地址而已

如你所愿，编译器已经为你分配了你所请求的存储空间，你还有什么满意的尼。  为什么一个是 40 个字节，而另一个 8 字节？ 那是因为，你请求的就那么多，编译器没有克扣你1个字节。

引用 1 楼 qq_40223493 的回复:sizeof函数里是类型的大小。*p和p是不同类型，没有指向空间一说，第一个结构体类型名大小40没错，第二个结构体指针类型，三四都是结构体指针类型，编译器指针类型占用八个字节。   那么，接一下问题4，继续请教下： 结构体指针分配内存，到底应该 malloc ( sizeof ( 结构体 ) ) ， 还是 malloc ( sizeof ( 结构体指针 ) )  ？？？  比如， 我应该使用 struct Stu *p = malloc(sizeof(struct Stu)) ; 还是该使用 struct Stu *p = malloc(sizeof(struct Stu*)) ;  请教下


Question: 外部内存使用memcpy时遇到的问题

外部ram是外部设备映射到主存的存储地址？有没有特殊用途，比如映射为设备控制寄存器/数据寄存器有访问顺序？否则不会出现这种情况的。

请加入printf打印调试信息，并贴出完整可运行的代码

出现内存重叠了吧。有没有完整的代码呀。

datatest2 的地址是多少 截图看看

图片说明错位了，第一张是第一次cpy,第二张是清空，第三张是第二次cpy，第四张是第一次赋值1~A.

引用 4 楼 林多 的回复:出现内存重叠了吧。有没有完整的代码呀。  引用 1 楼 niiiloc 的回复:两次memcpy的目的地址有很大的重叠部分，是什么原因？ 我理解最终的结果应该是 1 1 2 3 4  5 6 7 8 9 10 引用 3 楼 自信男孩 的回复:#include <stdio.h> #include <string.h>  int main(void) {     short datatest[100];  //定义到外部ram     short datatest2[100];  //定义到外部ram     short k;      for(k=0;k<10;k++)     {         datatest2[k]=k+1;     }     memcpy(&(datatest[0]), datatest2, 10*2);      for(k=0;k<10;k++)         printf("%d ", datatest[k]);     putchar(10);      memcpy(&(datatest[1]), datatest2, 10*2);     for(k=0;k<10;k++)         printf("%d ", datatest[k]);     putchar(10);     return 0; }  如上的代码测试结果如下：  1 2 3 4 5 6 7 8 9 10  1 1 2 3 4 5 6 7 8 9   10 × 2建议改成10 * sizeof(U16)    UI16 datatest[100];  //定义到外部ram UI16 datatest2[100];  //定义到外部ram UI16 k;  	for(k=0;k<10;k++) 		datatest2[k]=k+1; 		         memcpy(&(datatest[0]),datatest2,10 * sizeof(UI16)); 	for(k=0;k<50;k++) 			datatest[k]=0;  	memcpy(&(datatest[1]),datatest2,10 * sizeof(UI16));   datatest2赋值后  第一次memcpy后的datatest数据  清空datatest的数据  第二次memcpy后的datatest数据，1和A两个值都丢失了


Question: 128字节签名后得到256字节，用RSA可以实现吗？是用2048bit的私钥对128字节消息摘要签名后得到256字节签名数据吗？

你的前提就搞错了，摘要算法只有一个最大输出长度，一般性使用的时候都会进行截取的 引用 4 楼 xjatipanel 的回复:应用场景是这样的：对一个二进制源文件数据做签名验证，从验证的过程看是将256字节的签名数据（非base64编码数据）解密后得到128字节长度的明文aa，然后对源文件数据进行一系列操作（可以确定涉及base64编码）得到128字节长度的明文bb，然后对比aa和bb进行文件签名的验证。 这里对源文件的操作推测是先进行hash or md5之类的操作得到文件摘要信息（长度96字节？？），然后base64对摘要进行编码得到128字节明文数据，再进行RSA秘钥（1024bit还是2048bit？？）签名得到256字节。 这种推测有2个疑问点： 1、由于确定256字节签名数据解密后的长度是128字节，如果这128字节数据是base64编码数据，那么编码之前的长度应该是96字节，使用哪种hash算法可以得到96字节摘要？ 2、解密后的长度是128字节，通过rsa算法加密时，秘钥必须是2048bit才能得到签名长度为256字节的签名数据吗？  哪位大牛能帮忙看看这种情况从源文件数据到128字节明文再到256字节数据签名数据的可能实现过程是怎样的吗？

引用 2 楼 北纬22.5度的攻城狮 的回复:核心思想就是要先填充到256字节再输入，进行RSA运算，得到256字节的结果，对方拿到数据后，先解密，再去填充，最后拿到原文 要得到256字节签名数据，必须对256字节长度原文数据加密吗？

建议参考下我用#CSDN#这个app发现了有技术含量的博客，小伙伴们求同去《数字签名和消息验签》, 一起来围观吧 https://blog.csdn.net/szullc/article/details/84727701


Question: C# socket

出错重传是自己写的？逻辑上出错？

这个可以网上搜，理解之后，根据需求进行修改 https://www.cnblogs.com/wangkaining/p/6089627.html


Question: 常量存储问题

引用 2 楼 赵4老师的回复:http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素 老师你这课怎么下架了？

这个3? 3是常数，从来不存储的啊。  最多只是个临时变量，不过数在计算机里会被存成二进制，注意下

引用 6 楼 自信男孩 的回复:3不存储，看汇编就可以知道，它是一个立即数。  3.1415925的PI可以认为是存储在只读数据段（数据段分为只读和可读可写的两部分， Linux）纠正 3.1415926 的确会占用内存 而PI 还是不存的 预编译之后 不存在 编译器看不到PI这个符号更别说存了

引用 6 楼 自信男孩 的回复:3不存储，看汇编就可以知道，它是一个立即数。  3.1415925的PI可以认为是存储在只读数据段（数据段分为只读和可读可写的两部分， Linux）没有  3.1415925 和 3 一样 至于PI 不存在

PI是宏，在预编译的时候，PI会被替换成3.1415920 对于3、3.1415920这些立即数，采用立即寻址方式，在执行至相应语句时，直接用mov指令存放至变量地址，或者用mov存放至寄存器，进行运算

不存

存储在内存中，数据段中。。

从反汇编的代码中可以看到，对于a=b+3这种表达式，3并没有存储在哪个寄存器中，而是直接使用，就是楼上朋友说的，立即数寻址  对于#define PI 3.14.1920 这种宏，从反汇编的代码中可以看到，是保存在内存中的


Question: 本人新手求各位大神看看代码有什么问题，蓝桥杯基础练习

引用 3 楼 梦屿~千寻的回复:#include<stdio.h> #include<string.h> int main() { 	int m,n,i,j,x,y,tot=0; 	scanf("%d%d",&m,&n); 	int a[210][210],c[210][210]; 	int b[4400]; 	memset(c,1,sizeof(c)); 	for(i=0;i<m;i++) 	{ 		for(j=0;j<n;j++) 		{ 			scanf("%d",&a[i][j]); 		} 	} 	b[0]=a[x=0][y=0]; 	c[0][0]=0; 	while(tot<m*n-1) 	{ 		while(x+1<m&&c[x+1][y]) {b[++tot]=a[++x][y];c[x][y]=0;} 		while(y+1<n&&c[x][y+1]) {b[++tot]=a[x][++y];c[x][y]=0;} 		while(x-1>=0&&c[x-1][y]){b[++tot]=a[--x][y];c[x][y]=0;} 		while(y-1>=0&&c[x][y-1]){b[++tot]=a[x][--y];c[x][y]=0;} 	} 	for(i=0;i<m*n;i++) 	{ 		printf("%d ",b[i]); 	} 	return 0; }   代码改进了之后提交还是会有测试程序显示运行超时，能帮忙看一下还有哪些问题吗? 好吧，数组b应当是200×200=40000

引用 1 楼 niiiloc的回复:死循环了 简单看了下有几个问题： 1. a[0][0]没有清零 2. 边界问题：while(tot<m*n) ->while(tot<m*n - 1) 3. m行每行n个整数，没说不能等于0，所以你的算法要调整 请问哪里造成死循环了？


Question: socket connect成功后，从新连网后数据发着发着socket就不通了

使用下列函数显示收发的每个字节值，脑查问题：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);     } }

求帮忙解答一哈


Question: gcc内联汇编如何写中断调用？

在DosBox环境下，运行mouse.com或者mouse.exe安装int 33h鼠标中断后，用BC，使用 asm 嵌入汇编。应该可以。 在Linux下，鼠标驱动是否还使用int 33h我不了解。

我刚刚测试了asm("mov $4,%%ax": :)编译通过，但鼠标仍然没有一点反应，您知道是怎么回事吗？

赵老师，我想调用0x33号鼠标中断，asm("int $0x33")编译通过，但鼠标一点反应都没有，设置ax（eax也试了）的用的是register int ax asm("%ax")=4。没效果，于是我试了用mov给ax赋值，但我试了很多种方法都不行，您链接里的这个也编译不通过。


Question: 一个关于键盘实时读入的问题

#include <conio.h> #include <windows.h> int main() {     int k;      while (1) {         if (kbhit()) {             k=getch();             if (0==k || 0xE0==k) k=k<<8|getch();             if (27==k) break;//按Esc键退出             cprintf("\r\n%04X\r\n",k);         }         Sleep(200);         cprintf(".");     }     return 0; }  #include<iostream> #include<conio.h> #include<stdlib.h> #include<windows.h> using namespace std; int main() {     int c;     while(1)     {         if(kbhit()!=0) {             c=getch();             if (0==c || 0xE0==c) c=c<<8|getch();             if (27==c) break;//按Esc键退出             cout<<c;             while (kbhit()!=0) {                 c=getch();                 if (0==c || 0xE0==c) c=c<<8|getch();             }         }         Sleep(1000);         system("cls");     }     return 0; }  如果还是满足不了你的需求，参考 GetKeyState GetKeyboardState

while (1) 	{ 		//if (kbhit() != 0) 		c = getch(); 		cout << (int)c; 		Sleep(1000); 		while (kbhit()!=0) {//----使用while()语句把Sleep()期间所有的按键读取出来 			getch(); 		}; 		system("cls"); 	}


Question: 这个程序运行不了，小白求指教

《C++Primer第五版中文版》中提到 含有typedef的声明语句定义的不再是变量而是类型别名。 所以，在代码 typedef struct persons {	char name[20]; int age; int height; int weight; }person; 中，person并不是变量，而是类型别名。 所以，在main()函数中所有对person的操作都是错误的，因为person不是变量。 解决的方法 typedef struct persons {	char name[20]; int age; int height; int weight; }; persons person;

楼主的person不是结构体变量，而是结构体类型的别名。因此编译时肯定会出错。解决办法是去掉typedef，然后再加上string.h，因为strcpy要用到这个头文件里的函数声明。  #include <stdio.h> #include <string.h>  struct persons { char name[20];     int age;     int height;     int weight; }person;  int main() {     strcpy(person.name, "李刚");     person.age = 21;     person.height = 175;     person.weight = 65;     printf("姓名：%s\n", person.name);     printf("年龄：%d\n", person.age);     printf("身高：%d\n", person.height);     printf("体重：%d\n", person.weight);     return 0;  }

#include <stdio.h> #include<string.h> struct persons {	 	char name[20]; 	int age; 	int height; 	int weight; }person;  //persons person;  int main() { 	strcpy(person.name, "李刚"); 	person.age = 21; 	person.height = 175; 	person.weight = 65; 	printf("姓名：%s\n", person.name); 	printf("年龄：%d\n", person.age); 	printf("身高：%d\n", person.height); 	printf("体重：%d\n", person.weight); 	return 0;  } 不用typedef也可以，如上。

#include <stdio.h> #include<string.h> typedef struct persons {	 	char name[20]; 	int age; 	int height; 	int weight; }persons;  persons person;  int main() { 	strcpy(person.name, "李刚"); 	person.age = 21; 	person.height = 175; 	person.weight = 65; 	printf("姓名：%s\n", person.name); 	printf("年龄：%d\n", person.age); 	printf("身高：%d\n", person.height); 	printf("体重：%d\n", person.weight); 	return 0;  } 少了strcpy()函数需要头文件string.h 对typedef的理解有偏差，看看书。


Question: 求助新手小白用VC++运行C，编译无错误 执行有错误 麻烦详解谢谢

运行按钮的左边的两个按钮   点了吗  没点的话试一下

路径配置不对，关断工程，重新创建，如果还是不行的话，就要去修改系统路径，网上有教程，或者直接卸载，重新安装，但切记安装时的路径与工程文件的路径的区别

路径配置不对路径配置不对，关工程，重创建

编译失败。修正代码，重新编译

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

Visual C++与Windows不兼容，未正确安装也会出现这种问题

路径不正确， VC配置输出路径出错 或者把debug 删除再编译链接， 要不重建工程吧

又见VC++6.0，我最喜欢的编译器，没有之一。 在创建控制台程序时，选择一个空项目，然后把代码写入到cpp文件中，即可。


Question: 这是一个逆波兰式的程序，但是输入加括号的表达式如(a+b)，得不出结果，求神指教！

尴尬，谢谢🙏

while(!sop.empty()&&sop.top!='(')这里不少东西么。。sop.top()


Question: 练习线性表时realloc出错 Error in `./a.out': realloc(): invalid next size: 0x00000000

刚测试，发现问题是在输入num为大于100，比如134时会出现问题。其实问题主要是因为内存越界，而不是realloc导致的，数组越界导致realloc出错。  可以看一下你的main函数里，先初始化了队列elem，但是申请的长度是100，但是如果num大于100，那么如下的赋值已经越界了。  scanf("%d",&num);     for(i=0;i<num;i++)     {         list.elem[i]=i;         list.length++;     } 这个地方越界，就会导致realloc出错。  解决办法时，若num的输入大于100，那么只对100以内的空间赋值，比如： for(i=0;i < ((num > 100)?100:num);i++)     {         list.elem[i]=i;         list.length++;     }  供参考！

#include<stdio.h> #include<stdlib.h> #include<string.h> //#ifndef SEQUENCE_LINER_LIST_H //#define SEQUENCE_LINER_LIST_H  /*线性表的顺序实现*/  #define LIST_INIT_SIZE 100 //初始化分配量 #define LIST_INCREMENT 10 //增量 #define LIST_TYPE int //存储类型  typedef struct strSequenceLinerList {     LIST_TYPE *elem; //存储空间基址     unsigned int length; //当前长度     unsigned int listSize; //当前存储容量 }SequenceLinerList; typedef enum _status {     OK,     FAILED,     OVERFLOW }Status;  /*线性表的初始话*/  Status initSequenceLinerList(SequenceLinerList *list) {     list->elem = (LIST_TYPE *)malloc(sizeof(LIST_TYPE)*LIST_INIT_SIZE);     if(!list->elem)     {         return OVERFLOW;     }     memset(list->elem,0,sizeof(LIST_TYPE)*LIST_INIT_SIZE);     list->length = 0;     list->listSize = LIST_INIT_SIZE;     return OK; }  /*扩展*/  Status resizeSequenceLinerList(SequenceLinerList *list) {     printf("Resize...list->elem:%p,sizeof(LIST_TYPE):%d *((list->listSize:%d)+LIST_INCREMENT:%d):%d\n",         list->elem,         sizeof(LIST_TYPE),         list->listSize,         LIST_INCREMENT,         sizeof(LIST_TYPE)*((list->listSize)+LIST_INCREMENT)     );    LIST_TYPE *newbee = (LIST_TYPE*)realloc(list->elem,sizeof(LIST_TYPE)*((list->listSize)+LIST_INCREMENT));     if(!newbee){         return OVERFLOW;     }     list->elem = newbee;     list->listSize += LIST_INCREMENT;     return OK; }  /*打印*/  Status printSequenceLinerList(SequenceLinerList *list) {     printf("Begin printf list...\n");     printf("length = %d,listSize = %d\n",list->length,list->listSize);     if(list->length == 0 || list->elem == NULL){         printf("SequenceLinerList is NULL\n");         return FAILED;     }     else     {         unsigned int i=0;         for(;i<list->length-1;++i)         {             printf("%d,",list->elem[i]);         }         printf("%d\n",list->elem[i]);         printf("End print list\n");         return OK;     } } /*线性表插入：position表示插入的位置从1开始 第一个元素是list->elem[0]*/  Status insertSequenceLinerList(SequenceLinerList *list,unsigned int position,unsigned int value) {     if(position < 1 ||position > (list->length + 1))     {         printf("insert error\n");         return FAILED;     }     if(list->length > list->listSize-1)     {         Status res = resizeSequenceLinerList(list);         if(OK != res)         {             return FAILED;         }     }     LIST_TYPE *q = &(list->elem[position - 1]);     LIST_TYPE *p = &(list->elem[list->length - 1]);     for(; p >= q;--p)     {         *(p + 1)=*p;     }     *q = value;     ++list->length;     return OK; }  /*删除元素*/  Status deleteSequenceLinerList(SequenceLinerList *list,unsigned int position) {     if(position < 1 || position > list->length)     {         return FAILED;     }     LIST_TYPE* p = &list->elem[position - 1];     LIST_TYPE* q = &list->elem[list->length];     for(;p != q;++p)     {         *p = *(p + 1);     }     --list->length;     return OK; }  /* 查找一个值的下标*/  unsigned int findSequenceLinerList(SequenceLinerList *list,int value) {     unsigned int i=0;     for(;i<list->length;i++)     {         if(value == list->elem[i])         {             return i;         }     }     return -1; }  /*排序(冒泡)*/  Status sortSequenceLinerList(SequenceLinerList *list) {     unsigned int i=0;     unsigned int j=0;     for(;i<list->length - 1;++i)     {         for(j=i+1;j<list->length;++j)         {             if(list->elem[i] > list->elem[j])             {                 LIST_TYPE tmp = list->elem[i];                 list->elem[i] = list->elem[j];                 list->elem[j] = tmp;             }         }     }     return OK; }  /*销毁*/  Status destroySequenceLinerList(SequenceLinerList *list) {     free(list->elem);     list->elem = NULL;     return OK; } //#endif int main(void){     SequenceLinerList list;     initSequenceLinerList(&list);     int i;     int num;     scanf("%d",&num);     for(i=0;i<num;i++)     {         insertSequenceLinerList(&list,i+1,i+1);     }     printSequenceLinerList(&list);     return 0; }  // 132 // Resize...list->elem:00382088,sizeof(LIST_TYPE):4 *((list->listSize:100)+LIST_INCREMENT:10):440 // Resize...list->elem:00383288,sizeof(LIST_TYPE):4 *((list->listSize:110)+LIST_INCREMENT:10):480 // Resize...list->elem:00383288,sizeof(LIST_TYPE):4 *((list->listSize:120)+LIST_INCREMENT:10):520 // Resize...list->elem:00383288,sizeof(LIST_TYPE):4 *((list->listSize:130)+LIST_INCREMENT:10):560 // Begin printf list... // length = 132,listSize = 140 // 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30 // ,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57 // ,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83 // ,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107 // ,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127 // ,128,129,130,131,132 // End print list

/*扩展*/  Status resizeSequenceLinerList(SequenceLinerList *list) { 	printf("Resize...list->elem:%p,sizeof(LIST_TYPE):%d *((list->listSize:%d)+LIST_INCREMENT:%d):%d\n",         list->elem,         sizeof(LIST_TYPE),         list->listSize,         LIST_INCREMENT,         sizeof(LIST_TYPE)*((list->listSize)+LIST_INCREMENT) 	); 	LIST_TYPE *newbee =	(LIST_TYPE*)realloc(list->elem,sizeof(LIST_TYPE)*((list->listSize)+LIST_INCREMENT)); 	if(!newbee){ 		return OVERFLOW; 	} 	list->elem = newbee; 	list->listSize += LIST_INCREMENT; 	return OK; }  运行观察一下。


Question: 一个大的长方体里摆放不同规格小长方体问题

难道dp正解？

引用 6 楼 qq_37543978 的回复：你们可以下一个“装箱大师”，官网的应用不太好用，可以去淘宝买一个破解版的，装箱大师还是很适合这种题目的。望采纳，谢谢。人才啊！

暴力枚举 （问题不一定在30分钟内就解决的，一般要1~3小时，要写代码的一般要3~5小时，以后提问题不用再喊有没有人了）

+ 结果飞机返回房间都是


Question: 为啥用VS2015控制台啥信息也没有？

等你输入两个整数，不过c未初始化，而且交换数的if语句块也有问题  #include <stdio.h> #include <stdlib.h>  int main() { 	int a, b, c; 	printf("请输入两个数字"); 	scanf("%d%d", &a, &b); 	if (a > b) 	{ 		c = a; 		a = b; 		b = c; 	} 	printf("%d,%d", a, b); 	system("pause"); 	return 0; }


Question: 以菜单的方式工作：学籍查询系统

引用 3 楼 zzuli111的回复:你已经做出来了吗 我毕业了，做出来了

你已经做出来了吗

我这里有个类似的，但是代码太长，不好上传。你可以先写，不会的可以问。

不知道如何帮你，把代码写出来，不过这样似乎不合适。


Question: 小白，求教各位大佬

void main改成 int main

[Error] C:\Users\Administrator\Documents\C-Free\Temp\未命名1.cpp:4: error: `main' must return `int' [Error] C:\Users\Administrator\Documents\C-Free\Temp\未命名1.cpp:8: error: `Printf' was not declared in this scope 分析错误，第一个，1.cpp冒号4，就是第四行，main必须return    int，那么void定义的main函数不行，需要改成int  main 第二个 1.cpp冒号8，第8行，Printf在这个没有声明，那就是错误写法了。改成printf小写。

3.保存的格式是.c不是.cpp  .cpp是C++了。

1.没有返回值return语句。

你好，这题呢你可以自己分析一下人家给出的error，尝试去翻译理解，找出问题所在，其中的乐趣是尤为有趣的。 这里的错误有两个 第一个  main 必须返回一个整型  说明你这个void 人家不认可  所以你可以定义为  int main（） 然后返回一个值 第二个  Printf在该行没有定义    你是想输出   但是 p大写了   在编程语言中  大写和小写是有区别的，平时要多注意一些 还有就是  你这是c语言   文件的后缀要改为 .c  而不是.cpp  .cpp是c++的文件后缀

首先，要避免使用返回值为空的main()函数，可以使返回值为int,在函数结尾return 0;即可； 其次，printf需要小写， 最后，.cpp后缀是C++编译器编译，.c是C编译器编译。当然，C语言程序用.cpp后缀大部分情况下是可以编译成功的，前提是无语法错误。 耐心点仔细点，你可以的，加油！

return语句呢

#include <stdio.h>  int main (void) {     int b=-130,c;      c=(30+b)/2;     printf("c=%d\n",c);      return 0; } 供参考！  编译器已经给指出问题所在，因此编程需要首先明白编译器提示的error和warning

不懂英文请去谷歌翻译 第一句话是main函数必须返回int类型 第二句话是找不到Printf函数的声明

Ptintf的P要小写


Question: 求助dalao

这是最最基础的动态规划，看不懂的话自行百度，这里说再多你也无法完全理解

有没有大佬能帮帮我啊

写了一个简单的，趁着上班没事做。  #include <stdio.h> #include <stdlib.h> #include <time.h>  //10*10的地图  int cur = 0; //初始化地图，和打印地图。sign标志是打印还是初始化 void init_map(int pmap[10][10], int sign) {     int i=0, j=0;     for(i=0; i<10; i++)     {         for(j=0; j<10; j++)         {             if(sign){                 pmap[i][j] = 0;             }             printf("%d ", pmap[i][j]);         }         printf("\n");     }       }  void add_mine(int pmap[10][10], int num) {     srand(1);     int i=0, j=0, k=0;     //手动加地雷     pmap[3][0] = 1;     pmap[0][4] = 1;     pmap[4][2] = 1;     pmap[2][1] = 1;     pmap[1][6] = 1;     pmap[2][9] = 1;     pmap[6][1] = 1;     pmap[8][6] = 1;     pmap[5][6] = 1;      //随机加地雷     //for(k=0; k<num; k++)     //{     //    i = rand()%9;     //    j = rand()%10;     //    pmap[i][j] = 1;     //} }  //添加结果，走过那些格子 int add(int *arr, int i, int j) {     int last_i = arr[cur-1] / 100;     if(last_i > i)     {         cur -= 1;     }     arr[cur] = i*100 + j;     printf("static value cur %d %d:\n", cur, arr[cur]);     cur += 1; }  int walk(int pmap[10][10], int *arr) {     int i=0,j=0;     while(i<10 || j<10)     {                  if(pmap[i+1][j] != 1 && i <10) //默认向下走         {             //先向下移动             i += 1;             add(arr, i, j);         }         else if(pmap[i][j+1] != 1 && j < 10) //向下不行向右走         {             j += 1;                 add(arr, i, j);         }          else if(pmap[i+1][j] == 1 && pmap[i][j+1] == 1) //如果下面和右面都有地雷，退回去,还有很多种可能，只考虑了一种 从开始的向下错误的一步改为向右         {             i -= 1;             j += 1;             add(arr, i, j);         }         else         {             printf("堵死了，右下都不能走");             break;             return 0;         }     }         return 1; }  int main() {     int map[10][10];     int arr_res[100] = {0}; //保存行走的路径      //初始化地图     init_map(map, 1);     //添加地雷     add_mine(map, 10);     //查看结果     printf("=================\n");     init_map(map, 0);      int i = 0;     //     int res = walk(map, arr_res);      if(res)     {         printf("可以到达，路径如下:\n");         for(i = 0;i<100; i++)         {             if(arr_res[i]==0)             {                 break;             }             else             {                 printf("[%d][%d] ", arr_res[i]/100, arr_res[i]%100);             }         }         printf("\n");     }     return 0; }

引用 1 楼 user-3的回复:基础入门的动态规划 到达边缘坐标的方法只有 1 种  到达非边缘左边有两种 从左边或者上边过来 所以到达这一点的方法种数是 到达左边节点的个数 加上 到达上边节点的个数  再注意一下跳过地雷就好了 我不是特别的懂


Question: PTA程序设计

pta的格式比较严格，比如让你输出的值之间的空格个数不对就会说你格式错误

好的，谢谢了。

主函数没有返回值 一定要记得return 啊

贴题目  完整的

需要提交的格式就是三楼运算出来的结果那样

就是我写的那个程序在PTA上的那道题提交后，他反馈给我的结果就是格式错误，而我并不清楚错在哪。

要求什么格式呢？


Question: 关于opencv中phaseCorrelate函数运行速度的问题

算了 沉了就沉了吧

难道沉了..?

硬件不同，你希望怎么样~~~


Question: 小白求助

首先str的每个元素都是一个char*指针，你为它们装入内容之前没有分配内存。所以需要利用malloc分配内存。 其次， str+i的类型是 char**, 它的意思是数组的第i个元素的地址，而第i个元素本身是char*, 所以它的类型是char **. 去掉这个警告，修改为 str[i]就可以了。 str[i]表示数组的第i个元素，所以类型为char*. 或者用*(str+i) 也可以。修改代码如下：  #include<stdio.h> #include <stdlib.h>  int main() {     char *str[7];     int i;     for(i=0; i<7; i++)     {         printf("请输入第%d个学生的姓名：\n",i+1);         str[i] = (char*)malloc(100);  //分配内存。估计长度100够用。         scanf("%s",str[i]);         //scanf("%s",*(str+i));   这个也可以     }     for(i=0; i<7; i++)     {         printf("第%d个学生的姓名为%s\n",i+1,str[i]);         //printf("第%d个学生的姓名为%s\n",i+1,*(str+i));  这个也可以     }    //这里需要释放内存     return 0; }

%s表示输出一个char *的变量，类型不匹配 你可以试一试改成    printf("第%d个学生的姓名为%s\n",i+1,(char*)str+i);

取出警告的方法:  scanf("%s",str[i]); printf("第%d个学生的姓名为%s\n",i+1, str[i]); 这只是取出警告。不能保证程序正常运行。因为你没有给str[i]分配有效的空间。  解决方法： #include<stdio.h> #include <stdlib.h>  #define MAX_STR_SIZE    32  int main() {     char *str[7];     int i;     for(i=0;i<7;i++)     {         printf("请输入第%d个学生的姓名：\n",i+1);         str[i] = (char *)malloc(sizeof(char) * MAX_STR_SIZE);         if (!str[i])             return -1;         scanf("%s",str[i]);     }     for(i=0;i<7;i++)     {         printf("第%d个学生的姓名为%s\n",i+1, str[i]);         free(str[i]);     }      return 0; } 供参考！


Question: 通讯中判断数据无效后，怎么将上次缓存的数据清零

倒数2，3，4行的作用就是将缓存的数据清零。

清零？memset？


Question: hdoj1002大数相加WA不知道哪儿错了求解

仅供参考：#include <stdio.h> #include <string.h> #define MAXLEN 1000 char a1[MAXLEN]; char a2[MAXLEN]; static int v1[MAXLEN]; static int v2[MAXLEN]; static int v3[MAXLEN]; int i,j,n,L,z; void main(void) {     scanf("%d",&n);     for (j=0;j<n;j++) {         scanf("%s%s",a1,a2);          L=strlen(a1);         for (i=0;i<L;i++) v1[i]=a1[L-1-i]-'0';          L=strlen(a2);         for (i=0;i<L;i++) v2[i]=a2[L-1-i]-'0';          for (i=0;i<MAXLEN;i++) v3[i]=v1[i]+v2[i];          for (i=0;i<MAXLEN;i++) {             if (v3[i]>=10) {                 v3[i+1]+=v3[i]/10;                 v3[i]=v3[i]%10;             }         }          printf("Case %d:\n", j+1);         printf("%s + %s = ", a1, a2);          z=0;         for (i=MAXLEN-1;i>=0;i--) {             if (z==0) {                 if (v3[i]!=0) {                     printf("%d",v3[i]);                     z=1;                 }             } else {                 printf("%d",v3[i]);             }         }         if (z==0) printf("0");          printf("\n");     } } //Sample Input //3 //0 0 //1 2 //112233445566778899 998877665544332211 // //Sample Output //Case 1: //0 + 0 = 0 //Case 2: //1 + 2 = 3 //Case 3: //112233445566778899 + 998877665544332211 = 1111111111111111110


Question: 求助，关于C语言中函数调用结构体的问题，帮帮小弟

Init(MakeEmpty(PtrL)); 以上代码并没有改变PtrL的值，此时PtrL的值是NULL，所以在运行时会报错！ 可以修改为 PtrL = Init(MakeEmpty(PtrL)); 以下是运行效果图

#include<stdio.h> #include<stdlib.h> #include<iostream>  #define MAXSIZE 100  typedef struct LNode* List;  List PtrL; //typedef struct LNode{ struct LNode{     int Data[MAXSIZE];     int Last; };  List MakeEmpty(List PtrL) {      PtrL = (List)malloc(sizeof(struct LNode));     PtrL->Last = -1;      return PtrL; }  List Init(List PtrL) {     int k;     for(k=1; k<10;++k){         PtrL->Data[k-1] = k;         printf("%d\t",PtrL->Data[k-1]);         //PtrL->Last = PtrL->Last+1;         PtrL->Last++;     }     printf("\n最后元素位置=%d\n", PtrL->Last);      return PtrL; }  int Find(int x,List PtrL) {     int i = 1;     for (i=1;i<PtrL->Last;++i)         if (x == PtrL->Data[i] )             return 1;      return -1;  }  void Insert(int x,int i, List PtrL) {     int t=1,k=1;     printf("旧表内容：");     //for (k=1;k<10;++k)     for (k=0; k <= PtrL->Last; ++k)         printf("%d\t",PtrL->Data[k]);     printf("\n");     //if (i <= 0 || i>100)     if (i <= 0 || i > MAXSIZE) {         printf("overflow!");         return;     }     if (PtrL->Last > 100) {         printf("表满！");         return;     }     if (i >= PtrL->Last + 1) {         PtrL->Data[PtrL->Last+1] = x;         return;     }      //if(i<100 && i>0) {     for (k = PtrL->Last; k >= i; k--)         PtrL->Data[k+1] = PtrL->Data[k];       PtrL->Data[i] = x;     PtrL->Last = PtrL->Last+1;     printf("新表内容：");     for (t = 0; t <= PtrL->Last;++t)         printf("%d", PtrL->Data[t]);     //} }  int main(void){      PtrL = Init(MakeEmpty(PtrL));    //这个地方需要将Init的返回值给PtrL     Insert(1,1,PtrL);     system("pause");     return 0; }  供参考！

Init和MakeEmpty函数形参是一个临时指针，在调用函数时只是把传入实参的值复制给形参，在函数中的操作都是针对形参，未改变实参的值，即未实现初始化PtrL。 有两种解决方案，第一种使用二级指针，把函数参数改为List*，传入Ptrl的地址，这样通过二级指针寻址，改变Ptrl的值。 第二种，既然PtrL已经定义为全局变量，那就不必进行参数传递步骤。

为什么索引-1是错误的呢？-1只是last的值啊 而且在初始化的时候last不是已经变成了8吗？ 抱歉我是新手上路 实在想不明白 还望指点

你的问题在于LAST一开始赋值是-1，直接访问数组索引-1就错了 但深层次讲，既然你可以支持任意位置插入元素，你LAST的作用就完全没有意义了

黃色在哪裏？

为什么我编辑不了颜色啊 抱歉各位 出错的代码在48行  printf（“旧表内容%d”，PtrL->Data） 引用Ptrl->data的时候报错了


Question: 对于侯捷深度探索c++对象模型译注的疑问

不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素


Question: 使用VC++6.0中栈功能总是报错，求大神指导！急！

果然文件后缀名换成.cpp就可以了，谢谢各位！

引用 10 楼 棉猴 的回复:VS2015运行没问题。  请问你的文件名的后缀是.c还是.cpp？

引用 8 楼 user-3 的回复:你的文件名后缀是 .c 这是C语言代码 哪里来的 stack模板给你用  文件名1.c改为1.cpp再试试。

VS2015运行没问题。

引用 8 楼 user-3 的回复:你的文件名后缀是 .c 这是C语言代码 哪里来的 stack模板给你用  也就是不可用？那C语言中栈需要自己定义，操作也要自己写吗？

你的文件名后缀是 .c 这是C语言代码 哪里来的 stack模板给你用

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

引用 5 楼 赵4老师 的回复:VC6EN http://pan.baidu.com/s/1jImOtAe赵老师，安装失败

VC6EN http://pan.baidu.com/s/1jImOtAe

引用 3 楼 赵4老师 的回复:Visual C++ 2010 Express简体中文版http://pan.baidu.com/s/1bnwRVLt 赵老师，针对VC++6.0这个版本，这个问题应该怎么解决，因为我的考试必须使用这个版本

再补一张

有两张图未显示，现补上


Question: 麻烦大佬帮忙看看这个链表问题的错误在哪儿？

我自己解决了，分享给大家看看 #define LEN sizeof(struct Student) #define NULL 0  struct Student {     int num;     float score;             //这里之前复制错了，不影响     struct Student* next; };  int Unit9_10() {     struct Student* linenage_creation(void);     void linenage_printer(struct Student* head);         //函数之前也是复制错了     struct Student* linenage_delete_thesame(struct Student* from, struct Student* to);      struct Student *ahead, *bhead, *abhead;      ahead=linenage_creation();     linenage_printer(ahead);      bhead=linenage_creation();     linenage_printer(bhead);      abhead=linenage_delete_thesame(bhead,ahead);     linenage_printer(abhead);      return 0; }  struct Student* linenage_delete_thesame(struct Student* from, struct Student* to) {     struct Student *f1,*f2;     struct Student *t1,*t2,*thead;      f1=f2=from;     thead=t1=t2=to;     while(f1!=NULL && thead!=NULL)     {         while(t1!=NULL)         {             if(f1->num!=t1->num)                 t2=t1;             else             {                 if(t1==thead)                     {t2=t1->next; thead=t2;}      //这里前驱结点指针之前有问题                 else                     t2->next=t1->next;             }             t1=t1->next;         }         t1=thead; t2=t1;         //每次指针回归链首需要保持一致         f1=f1->next;     }      return thead; }

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


Question: C语言：使用字符指针的问题

str = "hello word!" ; "hello world!"是字符常量，因此不能修改，但是str_cut函数是对str进行写操作（因为是修改），所以会出现问题。解决办法：  char str[] = "hello word!"; 因为由指针编程数组，数组是在栈上的空间，因此可以进行读写。

main函数中应是*str="hello world!"

#pragma comment(linker,"/SECTION:.rdata,RW") //加这句可以让常量区可写，后果自负！

注意这句话 char *str = "hello word!"; str存放于栈区 "hello word!"存放于常量区，不允许随意修改 如果要测试的话，使用下面定义和初始化 char str[] = "hello word!";


Question: 大佬们帮我看下这题，结果正确，但却Runtime Error(ACCESS_VIOLATION)

VS2015运行没有错误

memset(dp, 0, sizeof(dp)); 这行可以去掉的，因为全局变量数组编译器会给初始化为0.因此这句是重复做一件事情。  if(j>=mo[i]) dp[j] = dp[j] > (dp[j - mo[i]] + mo[i] )? dp[j] : (dp[j - mo[i]] + mo[i]); else if(j>=mo[i]) dp[j] = dp[j] > (dp[j - mo[i]] + mo[i] )? dp[j] : (dp[j - mo[i]] + mo[i]); else dp[j] = dp[j]; 这里的else内容是不是也是无用的。或者不是你的想法所在。建议改一下。 dp[j] = dp[j];

本来就没有错误。 但是在评测系统会检测main函数的返回值是否为0，不为0的话系统会以为程序出了问题，于是报RE。 可以在最后加一行 return 0; 。


Question: VS 报C4047警告 间接级别不同的问题

函数调用为啥没有括号？？


Question: BIOS可以算是一个操作系统吗？中断向量表是指向驱动程序的函数指针的数组吗？

引用 16 楼 六道佩恩 的回复:[quote=引用 14 楼 赵4老师的回复:]至少我知道是否开启CPU虚拟化支持是需要在BIOS中设置的。 请问离开bios的windows还会有中断吗？也就是pc的中断是否都依赖bios？[/quote] BIOS中有中断处理程序，但是并不是所有的中断处理程序都在BIOS中。 在DOS模式下，程序可以设置中断处理程序。在Windows系统上，驱动程序内部也可以设置中断处理程序。

引用 14 楼 赵4老师的回复:至少我知道是否开启CPU虚拟化支持是需要在BIOS中设置的。 请问离开bios的windows还会有中断吗？也就是pc的中断是否都依赖bios？

引用 1 楼 northwesternwind的回复:BIOS不是操作系统。操作系统会利用BIOS来操作硬件。所以BIOS可以认为是操作系统的一部分。 中断向量表是一些处理中断的函数如果地址，可以认为是数组。驱动程序中可以有中断处理函数，但是终端处理函数不一定属于某个驱动程序。它们不在一个层次上。概念上认为BIOS在驱动程序更底层的位置。 Windows感觉上很多东西都利用自己的驱动程序实现了. BIOS的中断例程完全不利用估计不可能。 例程：Routines. 可以认为是处理函数或者过程(function, procedure)。  这些是我自己的理解，估计八九不离十，但是不敢保证全对。 我之前问过一次，答者说windows并不通过bios控制硬件

引用 2 楼 northwesternwind的回复:错别字太多了，修改一下： BIOS不是操作系统。操作系统会利用BIOS来操作硬件。所以BIOS可以认为是操作系统的一部分。 中断向量表是一些处理中断的函数入口地址，可以认为是数组。驱动程序中可以有中断处理函数，但是中断处理函数不一定属于某个驱动程序。它们不在一个层次上。概念上认为BIOS在驱动程序更底层的位置。 Windows感觉上很多东西都利用自己的驱动程序实现了. BIOS的中断例程完全不利用估计不可能。 例程：Routines. 可以认为是处理函数或者过程(function, procedure)。  这些是我自己的理解，估计八九不离十，但是不敢保证全对。 [quote=引用 1 楼 northwesternwind 的回复:] BIOS不是操作系统。操作系统会利用BIOS来操作硬件。所以BIOS可以认为是操作系统的一部分。 中断向量表是一些处理中断的函数如果地址，可以认为是数组。驱动程序中可以有中断处理函数，但是终端处理函数不一定属于某个驱动程序。它们不在一个层次上。概念上认为BIOS在驱动程序更底层的位置。 Windows感觉上很多东西都利用自己的驱动程序实现了. BIOS的中断例程完全不利用估计不可能。 例程：Routines. 可以认为是处理函数或者过程(function, procedure)。  这些是我自己的理解，估计八九不离十，但是不敢保证全对。[/quote] 这些入口地址可以算函数指针吗？感觉差别只是参数存取的位置不同

引用 10 楼 六道佩恩 的回复:我之前问过一次，答者说windows并不通过bios控制硬件 不知道之前的回答的原委，但是我觉得windows完全脱离bios是不可能的。比如看看微软的这个帖子： https://docs.microsoft.com/zh-cn/windows-hardware/drivers/kernel/acpi-bios 从另一个角度证明windows的行为是受到bios的影响。所以说windows很少依赖bios的话我同意, 如果说 完全不使用的话我认为不是这样。 另外，函数指针是c语言概念，入口地址是汇编语言/机器语言的概念。本质上函数指针就是汇编代码的入口地址。

至少我知道是否开启CPU虚拟化支持是需要在BIOS中设置的。

引用 11 楼 northwesternwind的回复:[quote=引用 10 楼 六道佩恩 的回复:] 我之前问过一次，答者说windows并不通过bios控制硬件 不知道之前的回答的原委，但是我觉得windows完全脱离bios是不可能的。比如看看微软的这个帖子： https://docs.microsoft.com/zh-cn/windows-hardware/drivers/kernel/acpi-bios 从另一个角度证明windows的行为是受到bios的影响。所以说windows很少依赖bios的话我同意, 如果说 完全不使用的话我认为不是这样。 另外，函数指针是c语言概念，入口地址是汇编语言/机器语言的概念。本质上函数指针就是汇编代码的入口地址。 [/quote] 那你知道有哪些操作是基于BIOS实现的吗？比如鼠标和键盘？控制台的字符输出和输入不知道是不是，屏幕显色不知道是不是，目前所知道中断例程的屏幕显色只有16位色，不知道是资料没更新还是确实没通过中断例程。还有就是不知道串口通信有没有借助中断例程。

BIOS可以看作是操作系统。

BIOS百科解释说明

错别字太多了，修改一下： BIOS不是操作系统。操作系统会利用BIOS来操作硬件。所以BIOS可以认为是操作系统的一部分。 中断向量表是一些处理中断的函数入口地址，可以认为是数组。驱动程序中可以有中断处理函数，但是中断处理函数不一定属于某个驱动程序。它们不在一个层次上。概念上认为BIOS在驱动程序更底层的位置。 Windows感觉上很多东西都利用自己的驱动程序实现了. BIOS的中断例程完全不利用估计不可能。 例程：Routines. 可以认为是处理函数或者过程(function, procedure)。  这些是我自己的理解，估计八九不离十，但是不敢保证全对。 引用 1 楼 northwesternwind 的回复:BIOS不是操作系统。操作系统会利用BIOS来操作硬件。所以BIOS可以认为是操作系统的一部分。 中断向量表是一些处理中断的函数如果地址，可以认为是数组。驱动程序中可以有中断处理函数，但是终端处理函数不一定属于某个驱动程序。它们不在一个层次上。概念上认为BIOS在驱动程序更底层的位置。 Windows感觉上很多东西都利用自己的驱动程序实现了. BIOS的中断例程完全不利用估计不可能。 例程：Routines. 可以认为是处理函数或者过程(function, procedure)。  这些是我自己的理解，估计八九不离十，但是不敢保证全对。

引用 7 楼 早打大打打核战争 的回复:砍掉老赵，CSDN就不能称之为CSDN了~~~  然也！

砍掉老赵，CSDN就不能称之为CSDN了~~~

一个人，砍掉一条胳膊，还是一个人，砍掉……，再砍掉……，直到____，就已经不能称之为人了； 一个OS，砍掉作业管理，还是一个OS，砍掉……，再砍掉……，直到____，就已经不能称之为OS了。

UEFI固件肯定算是操作系统，其规模甚至超过win 3.x，达到数十MB，但是传统BIOS算不算操作系统还是可以争议的，因为它主要实现了基本的设备管理，还没有作业管理、文件管理之类的功能。


Question: 全局变量与局部变量的疑问？

这个问题我的确不知道，如果有知道的请讲解讲解，谢谢。  下面的回答是猜的。  在全局变量下，编译器只是简单的对表达式进行静态求值，然后把表达式替换为值。也就是5-6=-1.。  在局部变量下，编译器不能进行静态求值，值是在运行时取得，所以求值结果就是 6-6=0.。

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

按照我的理解是：a-=++a,可以分成两 步：1.a=a+1; 2. a=a-a; 如果a为局部变量，那么a=a+1=5+1=6;此时a=6, 那么a=a-a=6-6=0； 如果a为全局变量，那么a=a+1=5+1=6,但此时的a的含义并不等于全局变量a,而是系统中有一个中间变量如t存储了这个值(6),所以当执行a=a-a时，就变成了a=a-t=5-6=-1; 但不同编译器会有不同的结果，你这个应该是在UNIX系统的Shell编译器吧

新手都喜欢玩这个 ++,--,还研究的一本正经

什么版本gcc？虽然说求值顺序未定义，但是同一个编译器，只是全局变量和局部变量的不同，对同一个表达式就出现不同的求值结果，也是比较奇葩的。就我的测试结果，C++Builder 7.3、VC++ 14.0、intel c++ 15.0、gcc 5.1.0，32位/64位、开/不开优化，输出都是0

不同位置作用域不同

编译器不同，得到的结果就不同

不要把精力放在这种牛角尖上，写语法清晰的代码。

是啊，为什么同一个编译器编译结果不一致尼

这种式子不建议用，也不建议去深度研究，根据编译器的不同，给出的结果也是不同的，总之不太建议去用或者写这种式子。

最近这种日经帖特别多，请百度序列点 在一个序列点对同一个变量多次赋值产生的结果是不可预期的。

引用 2 楼 qq_34300249 的回复:定义的地方不一样，。。。。 和定义的地方没关系 a -= ++a这个表达式是未定义行为  结果没意义  如果写的是符合要求的表达式  这段代码 不管是全局变量还是局部变量结果都是一样的

定义的地方不一样，。。。。

a -= ++a 这样的表达式不建议写，也不建议深究。因为这样的表达式具有歧义性，不同的编译器可能处理不一样。


Question: UDP通信 数据接收方select函数一直返回0

貌似select 的第一个参数不正确。


Question: 多线程环境下，传入指针后，函数里打印出传入的指针发现地址变了！！！！！

贴上那个函数的操作！

想明白了，谢谢各位

引用 4 楼 niiiloc 的回复:你的日志应该打印下第一个入参，不然很可能会误导你，从现场看，根本看不出这日志是哪一个调用打印的  你看我日志开头就打印了第一个参数，最后面的地址是第二个参数打印出来的，giReadParam函数内部我没加锁，但没加锁也不应该导致地址变动了呀，百思不得其解

换我这个土造MyLog再试试：#include <stdio.h> #include <stdlib.h> #include <string.h> #ifdef _MSC_VER     #pragma warning(disable:4996)     #include <windows.h>     #include <io.h> #else     #include <unistd.h>     #include <sys/time.h>     #include <pthread.h>     #define  CRITICAL_SECTION   pthread_mutex_t     #define  _vsnprintf         vsnprintf #endif //Log{ #define MAXLOGSIZE 20000000 #define MAXLINSIZE 16000 #include <time.h> #include <sys/timeb.h> #include <stdarg.h> char logfilename1[]="MyLog1.log"; char logfilename2[]="MyLog2.log"; static char logstr[MAXLINSIZE+1]; char datestr[16]; char timestr[16]; char mss[4]; CRITICAL_SECTION cs_log; FILE *flog; #ifdef _MSC_VER void Lock(CRITICAL_SECTION *l) {     EnterCriticalSection(l); } void Unlock(CRITICAL_SECTION *l) {     LeaveCriticalSection(l); } #else void Lock(CRITICAL_SECTION *l) {     pthread_mutex_lock(l); } void Unlock(CRITICAL_SECTION *l) {     pthread_mutex_unlock(l); } #endif void LogV(const char *pszFmt,va_list argp) {     struct tm *now;     struct timeb tb;      if (NULL==pszFmt||0==pszFmt[0]) return;     _vsnprintf(logstr,MAXLINSIZE,pszFmt,argp);     ftime(&tb);     now=localtime(&tb.time);     sprintf(datestr,"%04d-%02d-%02d",now->tm_year+1900,now->tm_mon+1,now->tm_mday);     sprintf(timestr,"%02d:%02d:%02d",now->tm_hour     ,now->tm_min  ,now->tm_sec );     sprintf(mss,"%03d",tb.millitm);     printf("%s %s.%s %s",datestr,timestr,mss,logstr);     flog=fopen(logfilename1,"a");     if (NULL!=flog) {         fprintf(flog,"%s %s.%s %s",datestr,timestr,mss,logstr);         if (ftell(flog)>MAXLOGSIZE) {             fclose(flog);             if (rename(logfilename1,logfilename2)) {                 remove(logfilename2);                 rename(logfilename1,logfilename2);             }         } else {             fclose(flog);         }     } } void Log(const char *pszFmt,...) {     va_list argp;      Lock(&cs_log);     va_start(argp,pszFmt);     LogV(pszFmt,argp);     va_end(argp);     Unlock(&cs_log); } //Log} int main(int argc,char * argv[]) {     int i; #ifdef _MSC_VER     InitializeCriticalSection(&cs_log); #else     pthread_mutex_init(&cs_log,NULL); #endif     for (i=0;i<10000;i++) {         Log("This is a Log %04d from FILE:%s LINE:%d\n",i, __FILE__, __LINE__);     } #ifdef _MSC_VER     DeleteCriticalSection(&cs_log); #else     pthread_mutex_destroy(&cs_log); #endif     return 0; } //1-79行添加到你带main的.c或.cpp的那个文件的最前面 //81-86行添加到你的main函数开头 //90-94行添加到你的main函数结束前 //在要写LOG的地方仿照第88行的写法写LOG到文件MyLog1.log中

自己顶一顶，麻烦有了解的朋解答下

自己顶一顶，麻烦有了解的朋解答下

自己顶一顶，麻烦有了解的朋解答下


Question: PC对硬件的操控都是通过BIOS中断例程吗？为什么windows可以控制显示24位色，而中断例程只能控制16位色（还是8位色来着）

引用 1 楼 user-1 的回复:Windows 不通过 BIOS 来控制硬件。 只有系统在启动的时候，由 BIOS 加载并启动，Windows 接管之后有自己的处理硬件方式。 只有早年的 DOS 之类的操作系统使用 BIOS 例程来处理硬件。 那请问BIOS可以算是一个操作系统吗？中断向量表是指向驱动程序的函数指针的数组吗？


Question: 编程题

好的谢谢大佬

首先一点，unsigned定义的数组先要明白是什么类型的，默认是的unsigned int类型，那么strlen是否可以呢。建议看一下字符串函数。  第二点，sscanf的第一个参数是什么类型，建议查一下；  第三点，大数相乘，你输入的%s格式的数是字符串，那么你需要了解'1'和1的关系，你的理解是1* 1等价于'1' * '1'，建议查一下是否等价；  最重要的一点，楼主的大数乘法的算法是否正确，是否有理论参考的？


Question: 求助: c 语言字符数组赋值和函数声明问题

用memcpy

字符赋值或拷贝以及函数的定义，这应该是基本的语法知识。建议网上查一下。

参考一下自己写的strcpy  char *strcpy(char *d, constchar *s) {  char *p = d;  while (1)  {  *p = *s;  if (*p == '\0') break;   p++;  s++;  }   return p; }

这些都是最基本的库函数了，单片机里面肯定有啊

如果不用 strcpy ，怎么写 因为我要移植到单片机里  有些怕没有这个函数  谢谢！

void bb(char ss) { }  这个函数 我是要定义为  void bb(char *ss) { }  还是 void bb(char ss[]) { }

你所有的问题都可以通过strcpy并加一句调试来解决 请百度strcpy的用法

char sendBuf[7] = {"通道1"};


Question: 希望大家能指导一下

引用 4 楼 独孤由过的回复:运行了一下，加没加都可以正常输出 谢谢了 刚看到 没能及时回复 很抱歉

运行了一下，加没加都可以正常输出

比如说我输入个小写的英文字母 ch不加括号的时候就可以正常输出了但是加上括号以后就成了个问号 这是为什么啊？

先学会把问题说清楚，什么输入下输出是错的

没有人吗？？？唉~


Question: 关于j=j++的运算问题

引用 18 楼 qq_44300926的回复:要清楚j++和++j的区别，j++是 先用后加与先加后用的区别

输出的就是2吧，楼主确认代码没拷贝错？

结果可能和编译器有关吧，不同的编译器可能结果不一祥。

引用 56 楼 小熊之怒 的回复:j++   和 ++j  是不同的。 a = j++ j首先把值赋给a，然后自增。   a = ++j 首先j自增，然后赋值给a。       先后顺序不同影响语意。这个要看，c语言的符号结合先后顺序。无关

引用 48 楼 liangxin509 的回复:[quote=引用 47 楼 john_liqinghan 的回复:] 和编译器有关系，最好直接看汇编！不过这种就属于垃圾代码了。项目中不会有人写这样子代码的，写了也通不过审核的。 为啥这样写就算垃圾代码了呢？[/quote]  1、表意不清， 2、维护不便， 3、在开启编译器优化的时候，有些代码执行的顺序并非我们所看写的代码顺序。在于编译器优化程度以及编译器的类型，GCC和MSVC就有区别。

引用 59 楼 weixin_41827723 的回复:[quote=引用 58 楼 weixin_41827723的回复:]编译环境不一样结果可能不一样。 按语法规则理解，这种写法是先赋值，后加一，但你用的是同一个变量名来接收赋值和自增后的值，所以下一条语句要接收的值具体是多少就取决于编译器版本对这一点语法规则的处理方式了。[/quote]按照语法规则 这是未定义行为 你不了解语法规则

引用 8 楼 liangxin509的回复:j=j++是先赋值，再加1，没错的 问题就在于，printf已经是下一条语句了，此时赋值结束，j的值应该已经增加到2，这样理解此时应该输出2。

引用 58 楼 weixin_41827723的回复:编译环境不一样结果可能不一样。 按语法规则理解，这种写法是先赋值，后加一，但你用的是同一个变量名来接收赋值和自增后的值，所以下一条语句要接收的值具体是多少就取决于编译器版本对这一点语法规则的处理方式了。

编译环境不一样结果可能不一样。

++在前，++在后的问题，避免这种写法

大部分回答全都是错的，特别是那些强行用结果去解释的 正解是结果不可预知 在一个序列点对同个变量多次赋值的结果是不可预知的 j = ++j 是一个序列点，有两次赋值，所以结果是不可预知的，可能是1也可能是2，具体看编译器怎么生成汇编语言的

引用 47 楼 john_liqinghan 的回复:和编译器有关系，最好直接看汇编！不过这种就属于垃圾代码了。项目中不会有人写这样子代码的，写了也通不过审核的。 为啥这样写就算垃圾代码了呢？

i++ 先赋值再加一 ++i 先加一再赋值

引用 楼主 weixin_44566068的回复:#include<stdio.h> main() { 	int j=1; 	j=j++; 	printf("%d",j);  }  结果j为什么等于1呢？ 先运算j啊，然后再算++，如果是j=++j的话，输出就是2了

j＝j＋＋（先赋值然后自增）

j++是自身赋值然后在进行+1。++j是自身+1后然后在进行赋值。j--和--j同理

j++  表示  先把原来的值先赋值给j  然后在自增   ++j就表示原值先加1   赋值给j   通俗就是一个是先赋值在加一  一个是先加一再赋值

# include <stdio.h>  int main(void) { 	int j = 1 ;  	j = j++ ; 	printf("%d\n" , j);  	return 0 ; }  ———————————— 执行结果：  2 Press any key to continue ————————————  兄弟你什么编译器。


Question: C语言编程

如果你密码长度已经限制在一定范围，而且比较小（16位或32位），递归应该是没有什么问题的，毕竟算法的体量和需要使用的栈内存很小

匹配该密码是指跟什么数据比较？数量多大？ 还有不是很清楚你目的是要生成字符串还是仅仅比较字符串  （1）比较字符串 如果数据量很大，做两个Key，一个Key为密码长度，一个Key为密码本身，并且是有序存储 先比较长度再比较密码本身（二分查找或快速查找）  （2）生成字符串 先把可能的字符串字符用数组指出，然后随机0~（N-1)的整形数，直接提取字符数组对应的下标的字符填充 循环次数等于要生成的字符串长度 然后根据（1）的办法匹配数据库，如果已经存在再次调用（2）生成一个新的个字符串

不用递归 也不用嵌套多层for 一层循环就好了 十进制 转换 62进制 遍历

用递归是可以的，但是递归也有其弊端。因为递归是不停的申请自身函数栈，若是无穷或者特别多次的递归调用，可能会导致栈溢出。


Question: 请问如何计算出#QNAN

这就是C库函数，不支持C99的编译器可以用NAN常量，C++中有quiet_NaN（#include <limits>）

对浮点异常值NAN、QNAN、 SNAN、 IND、 INF的处理 https://blog.csdn.net/lisai17/article/details/14649419

_isnan Checks given double-precision floating-point value for not a number (NaN).  int _isnan( double x );  Routine Required Header Compatibility  _isnan <float.h> 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  _isnan returns a nonzero value (TRUE) if the argument x is a NaN; otherwise it returns 0 (FALSE).  Parameter  x  Double-precision floating-point value  Remarks  The _isnan function tests a given double-precision floating-point value x, returning a nonzero value if x is a NaN. A NaN is generated when the result of a floating-point operation cannot be represented in Institute of Electrical and Electronics Engineers (IEEE) format. For information about how a NaN is represented for output, see printf.  Floating-Point Support Routines  See Also   _finite, _fpclass

引用 4 楼 六道佩恩 的回复:[quote=引用 3 楼 _ZGq 的回复:] 0.0/0.0==#QNAN ; #INF*0.0==#QNAN 我测试0.0/0.0是#IND[/quote] #INF*0.0 呢？（1.0/0.0*0.0）

引用 9 楼 早打大打打核战争 的回复:#include <math.h> double x = nan(""); 请问这个nan函数是干什么的？C标准库没查到，MSDN里只有寥寥几句，没看懂

引用 10 楼 _ZGq 的回复:[quote=引用 8 楼 六道佩恩 的回复:] [quote=引用 7 楼 _ZGq 的回复:] [quote=引用 4 楼 六道佩恩 的回复:] [quote=引用 3 楼 _ZGq 的回复:] 0.0/0.0==#QNAN ; #INF*0.0==#QNAN 我测试0.0/0.0是#IND[/quote] #INF*0.0 呢？（1.0/0.0*0.0）[/quote] #INF只是输出时的错误表示吧。。。。还可以用来乘吗？都编译不通过[/quote] 不是已经得出了#INF==1.0/0.0吗？带进去就行了：1.0/0.0*0.0[/quote] 结果是#IND

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

引用 8 楼 六道佩恩 的回复:[quote=引用 7 楼 _ZGq 的回复:] [quote=引用 4 楼 六道佩恩 的回复:] [quote=引用 3 楼 _ZGq 的回复:] 0.0/0.0==#QNAN ; #INF*0.0==#QNAN 我测试0.0/0.0是#IND[/quote] #INF*0.0 呢？（1.0/0.0*0.0）[/quote] #INF只是输出时的错误表示吧。。。。还可以用来乘吗？都编译不通过[/quote] 不是已经得出了#INF==1.0/0.0吗？带进去就行了：1.0/0.0*0.0

#include <math.h> double x = nan("");

引用 7 楼 _ZGq 的回复:[quote=引用 4 楼 六道佩恩 的回复:] [quote=引用 3 楼 _ZGq 的回复:] 0.0/0.0==#QNAN ; #INF*0.0==#QNAN 我测试0.0/0.0是#IND[/quote] #INF*0.0 呢？（1.0/0.0*0.0）[/quote] #INF只是输出时的错误表示吧。。。。还可以用来乘吗？都编译不通过

引用 1 楼 user-4 的回复:为啥要得到这个数呢？有什么具体的用途吗？ 我确实有我的需要，但不方便说。

引用 2 楼 赵4老师 的回复:浮点数格式 http://bbs.csdn.net/topics/390676437 赵老师，这个帖子里并没有错误浮点数相关的呀。浮点数的结构我是知道的，我只是想如何计算才能得出#QNAN

引用 3 楼 _ZGq 的回复:0.0/0.0==#QNAN ; #INF*0.0==#QNAN 我测试0.0/0.0是#IND

0.0/0.0==#QNAN ; #INF*0.0==#QNAN

为啥要得到这个数呢？有什么具体的用途吗？


Question: 请问一下关于二级指针的函数调用问题

执行完sinwt_faec_new(&aecmInst,8000,8000);，实参的值并没有改变


Question: FOR函数跳出循环的条件能不能用==，我试了好像没效果

可以的，属于判断条件

基本的语句还是要先搞懂的

引用 1 楼 老马何以识途 的回复:for裏面的條件是指“符合條件則進入”，所以你搞反了。 是满足FOR中间的条件就进去，不满足出来对吧  是我搞反了   我理解成满足出来 不满足进去

肯定是不会进入循环，执行循环体的。因为fact初始化为1，而不是5。  可以考虑这样  for (i = 2; ; i++)     if ((fact = n % i) == 5)         break;   或者  for (i = 2; fact != 5; i++)     fact = n % i;   不过，楼主的这个算法是求素数的？

for裏面的條件是指“符合條件則進入”，所以你搞反了。


Question: 关于贪心法钓鱼的鱼量计算过程的输出

会写算法不会写打印？有点假了吧 12+(12-4)+(12-4*2)=24 这个不就是printf("%d+(%d-%d)+(%d-%d*%d)=%d", ……)么？


Question: 将整形数转换为byte数组的一点疑问

与ff数据本质不会变化。。。。你要是与ee数据就变了


Question: 请问我的代码为什么会runtime erorr?

这道题用c++就能过，用对应的c语言版本就euntime erorr，不知道为什么，哎，菜是原罪~

Visual Studio 6 ： vc6 Visual Studio 2003 ： vc7 Visual Studio 2005 ： vc8 Visual Studio 2008 ： vc9 Visual Studio 2010 ： vc10 Visual Studio 2012 ： vc11 Visual Studio 2013 ： vc12 Visual Studio 2015 ： vc14

没有对应的安装c++运行库？

你输入了什么 怎么输入的

char dna[55][1005]; int acgt[55][1005]={0}; char maxx[1005]={0}; 两个问题： 1.全局变量不需要初始化为0，因为编译器默认会给初始化为0.因为是全局变量。 2. 定义的长度，(55 × 1005 + 55 ×1005) * 4 + 1005 * 4 ==xxxx Bytes 这么多个字节，首先你能用这么多，另外，这么大的空间，系统需要有这么大。这也可能是runtime error的主要原因。 建议使用动态申请空间的形式完成，因为是需要多少申请多少，用完需要手动释放。

引用 赵4老师 的回复:C语言教程（附带C语言100例）http://download.csdn.net/detail/zhao4zhong1/8830817  计算机组成原理→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执行停在该断点处的时候。 ...

内存溢出了？單步調試一下，或者關鍵位置寫一些輸出語句。


Question: 如何把含有字母数字和符号的文件，提取出数字坐标，并保存到TXT文件中

plt文件中的PW指令是什么含义啊？？

fscanf就支持简单的正则的

引用 7 楼 lwd2wl 的回复:建议读取之后，以';'为分隔符，分别分割。然后再用strncmp比较，选择出PD或PU，然后再对其使用' '（空格）分割，最后atoi转换为整型，即坐标值。这个思路想到了，想到了用分号分割了，但是每行的长度不相同，总是只能出现第一行的效果，下面还是没用。不过没有用strncmp比较，而且atoi不知道是没用好还是没效果，出来的是空的。还是感谢大家的提醒  那就每行读取一个固定长度，如果没有读取完全，可以考虑把这行的最后一个;组放到下一行里。

正则表达式可以吗

谢谢大家，已经写出来了

试试正则表达式。

没有效果呀，出来的还是整体的东西， #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h>  int main() { 	FILE *fp; 	char str[1024][1024]; 	char ch; 	FILE *fpt; 	fpt = fopen("C.txt","w"); 	if ((fp = fopen("char.plt", "r")) == NULL) 	{ 		perror("fail to read"); 		exit(1); 	}  	while(!feof(fp))     {        fscanf(fp,"%*[^(-9)-9]%d",str);             while((ch=fgetc(fp))!=EOF)             {                 fputc(ch,fpt);             }             printf("%s\n",str,fpt);     }     fclose(fp);     fclose(fpt); 	return 0; }

fscanf %*[^0-9]%g 就可以了

先用分号(;)分割成好多子字符串,然后查找PU，PD开头的字符串，找到后截取后面的坐标


Question: 关于 负数补码的二进制表示有个疑问

数制表示是以计算机中数制表示为准，若是32位，则-8的原码是10000000  00000000  00000000  00000111，除符号位外取反加一，得到11111111  11111111  11111111  11111000。

因为原先前面都是0,32位的数，前面都是0，反码后就都是1了。


Question: 编译原理课设

研究一下tiny c compiler或者gcc源代码中对应功能？

你可以先定一個規則，如何定義全局變量、靜態變量等。比如在函數外部的就是全局變量，static開頭的就是靜態。  那麽搜索變量的時候，如果發現當前搜索範圍是在函數中，那麽他就不是全局變量，反之則是。而搜索到static開頭的則都是靜態變量。  沒用到的變量稍複雜點，可以分全局或局部變量，建立語句樹，每個語句又有一個變量列表。在變量的作用域中有語句提到了變量就是用到了。  其他關於變量的規則，可以繼續補充，思路就是要有一個總的框架先。


Question: 为什么同一个程序运行结果和调试结果不一样？

首先编译器不会检查数组越界的问题，越界访问运行中结果是未定义的，即越界访问可能会影响后面变量的值（如果后面还有变量）。

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


Question: 数据结构与算法

， 就像是数据结构里的堆在逻辑结构上是完全二叉树，但是在实现上可以通过动态顺序表，链表的方式实现

数据的逻辑结构是指各数据元素之间的逻辑关系，是按使用需要而建立的。 数据的物理结构是指数据在计算机内实际的存储形式。


Question: 问一下以下代码的流程图怎么做？明天就要收了！！！！！

你能用中文描述一下你的代码逻辑吗，能的话把那段话中的关键词拿出来去画流程图

自己顶一下自己


Question: 做一个酒店管理系统   中间有些没放上去 然后其他输入没问题 在输入姓名的时候就出现这种情况

scanf_s("%s", guest[count - num + i].name, xxx); xxx的地方需要加一个参数，即name数组的长度。这是scanf_s函数必须要加上的。


Question: 有大神做过UVA上的题么？小白不知道怎么回事，好好的代码提交上去就是WA，没AC一条.....

已经可以了，问题出在我提交代码时选了C++5导致的，选C++11就没问题了。谢谢。

#include<stdio.h> char s[85]; int main() {     int n, score, cnt;     int i;      scanf("%d",&n);      while(n--)     {          scanf("%s", s);         cnt = 0, score = 0;         for(i = 0; s[i]; i++)         {             if(s[i] == 'X') {                 score = 0;                 continue;             }             score++;             cnt += score;         }         printf("%d\n",cnt);     } }  试试这个。


Question: 单聊表的逆置，感觉逻辑没有错误，程序执行到最后一步打印就会崩溃 真心求解

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

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

不要用局部变量指针作为函数出参

我觉得是初始化的时候没有malloc销毁的时候却free了，发生异常。

引用 3 楼 独孤由过 的回复:注意：原来逆置返回临时变量地址，位于栈中 在返回之后，栈中函数地址、参数，以及定义临时变量、调用函数地址出栈，要么立即清零所在栈，即地址被抹掉， 要么还在，但是接着调用SListPrint，又会入栈，把原来l2所在栈区覆盖  SList* reverse_1(SList *P) { 	//头插逆置 	assert(P->first != NULL); 	SList l2; 	SListInit(&l2); 	SListNode* cur = P->first; 	while (cur != NULL) 	{ 		SListPushFront(&l2, cur->data); 		cur = cur->next; 	} 	return &l2; }  如果要实现单向链表逆置，可以用辅助栈，没必要重新创建节点并复制数据 应该也可以直接返回SList，而不是SList*

改过之后  #pragma once typedef int SLDataType;  typedef struct SListNode { 	int data; 	struct SListNode* next; }SListNode;  typedef struct SList { 	struct SListNode* first; }SList;  //初始化&销毁 void SListInit(SList* list);  //销毁 void SListDestroy(SList* list);  //头插 void SListPushFront(SList* list, SLDataType data);  //头删 void SListPopFront(SList* list);  //打印 void SListPrint(SList* list);  //尾插 void SListPushBack(SList* list, SLDataType data);  //尾删 void SListPopBack(SList* list);  //查找 SListNode* SListFind(SList* list, SLDataType data);  //在pos位置的节点后插入元素 void SListInsertAfter(SListNode* pos, SLDataType data);  //删除pos位置后的第一个节点 void SListEraseAfter(SListNode* pos);  //删除遇到的指定的第一个节点 void SListRemove(SList* list, SLDataType data); //逆置 SListNode* reverse_1(SList *P);  #include <stdio.h> #include <assert.h> #include <stdlib.h>  //初始化 void SListInit(SList* list) { 	assert(list != NULL); 	list->first = NULL; }  //销毁 void SListDestroy(SList* list) { 	SListNode* next; 	SListNode* cur; 	for (cur = list->first; cur != NULL; cur = next) 	{ 		next = cur->next; 		free(cur); 	} 	list->first = NULL; }  //头插 void SListPushFront(SList* list, SLDataType data) { 	SListNode* node = (SListNode*)malloc(sizeof(SListNode)); 	assert(node); 	node->data = data; 	node->next = list->first; 	//更新头指针的指向； 	list->first = node; }  //头删 void SListPopFront(SList* list) { 	SListNode* old_first = list->first; 	assert(list); //有无链表 	assert(list->first != NULL); //有链表，链表里是否有元素， 								 //若链表为空，则删除失败 	list->first = list->first->next; 	free(old_first); }  //打印 void SListPrint(SList* list) { 	SListNode* cur; 	assert(list); 	for (cur = list->first; cur != NULL; cur = cur->next) 	{ 		printf("%d-->", cur->data); 	} 	printf("NULL\n"); }  //尾插 void SListPushBack(SList* list, SLDataType data) { 	SListNode* node = (SListNode*)malloc(sizeof(SListNode)); 	SListNode* lastone = list->first; 	assert(list != NULL); 	for (; lastone->next != NULL; lastone = lastone->next) 	{ 	} 	assert(node != NULL); 	node->data = data; 	node->next = lastone->next; 	lastone->next = node; }  //尾删 void SListPopBack(SList* list) { 	SListNode* cur; 	SListNode* m; 	assert(list != NULL); 	assert(list->first != NULL); 	if (list->first->next == NULL) 	{ 		//若链表为空，则尾删即为头删 		SListPopFront(list); 		return; 	} 	for (cur = list->first; cur->next->next != NULL; cur = cur->next) 	{ 	}//找到倒数第二个节点 	m = cur->next; 	cur->next = m->next; 	free(m); }  //查找 SListNode* SListFind(SList* list, SLDataType data) { 	SListNode* cur = list->first; 	for (; cur != NULL; cur = cur->next) 	{ 		if (cur->data == data) 		{ 			return cur; 		} 	} 	return NULL; }  //在pos位置的节点后插入元素 void SListInsertAfter(SListNode* pos, SLDataType data) { 	SListNode* node = (SListNode*)malloc(sizeof(SListNode)); 	assert(node != NULL); 	node->data = data; 	node->next = pos->next; 	pos->next = node; }  //删除pos位置后的第一个节点 void SListEraseAfter(SListNode* pos) { 	SListNode* node = pos->next->next; 	free(pos->next); 	pos->next = node; }  //删除遇到的指定的第一个节点 void SListRemove(SList* list, SLDataType data) { 	SListNode* prev = NULL; 	SListNode* cur = list->first; 	while (cur != NULL && cur->data != data) 	{ 		prev = cur; 		cur = cur->next; 	} 	//要删除的节点不存在 	if (cur == NULL) 	{ 		return; 	} 	//要删除的节点若就是第一个节点 	if (prev == NULL) 	{ 		//即头删 		SListPopFront(list); 		return; 	} 	prev->next = cur->next; 	free(cur); }  SListNode* reverse_1(SList *P) { 	//头插逆置 	assert(P->first != NULL); 	SList l2; 	SListInit(&l2); 	SListNode* cur = P->first; 	while (cur != NULL) 	{ 		SListPushFront(&l2, cur->data); 		cur = cur->next; 	} 	return l2.first; }  void test() { 	SList l1; 	SListInit(&l1); 	SListPushFront(&l1, 1); 	SListPushFront(&l1, 2); 	SListPushFront(&l1, 3); 	SListPushFront(&l1, 4); 	SListPrint(&l1);  	SList l2; 	l2.first = reverse_1(&l1); 	SListPrint(&l2); }  int main() { 	test(); 	system("pause"); 	return 0; }


Question: 大佬们  哪里错了

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

你的输入不对啊

去掉scanf中的'\n'，因为scanf是格式化输入，没有匹配'\n'。  另外，对于浮点数和0比较不能按照整型数与0比较方法。  浮点数比较方法(float): if (x > 0 && x > 1e-6)     printf("x大于0\n"); if (x < 0 && fabs(x) > 1e-6)     printf("x 小于0\n"); if (fabs(x) < 1e-6)     printf("x等于0\n");

scanf("%f\n",&x);  的意思是，scanf()读取了缓冲区中的数据之后，继续读取缓冲区下一行的数据。如果缓冲区的下一行没有数据，则scanf()就会阻塞。所以此时没有数据输出，需要“再输入一个随便的数字”，scanf()函数才会返回程序才会向下继续运行。

scanf("%f\n",&x);   改为 scanf("%f",&x);

输入一个数字之后     还要再输入一个随便的数字才能出现结果


Question: sprintf使用中的奇怪现象

第一个sprintf没有越界，但是第二个file缓存已经越界了。越界操作的结果是未定的。因此建议考虑使用snprintf，这样通过输入数组的长度，来防止有越界访问。  另外，可以把file的长度扩大一倍试试。数组的长度建议定义为2的n次方长度。即扩大一倍变成64

字符串越界了。dir长度不够, file 长度不够。 定义这种数组的时候，一定要确保长度足够。


Question: 老师们帮忙看一下这倒C语言题目哪里错了，非常感谢！

#include <stdio.h> #include <stdlib.h>  int main() {     long int n,i,j,t,count=0;     unsigned int k;      scanf("%ld",&n);     scanf("%d",&k);     int *arr = (int *)malloc(sizeof(int) * n);     if (!arr)         return -1;     for(i=0; i<n; i++)     {         scanf("%d",&arr[i]);     }     for(i=0; i<n-1; i++)     {         for(j=i+1; j<n; j++)         {             for(t=j;t>i;t--)             {                 if(arr[i]==arr[t])    //这儿的arr[j]改成arr[i]即可。                     break;             }             if(t==i&&(arr[i]-arr[j] == k || arr[j]-arr[i] == k))                 count++;         }     }     printf("%ld\n",count);      free(arr);      return 0; }  参考一下吧。在你的基础上只改了一个地方就能得到正确的结果了（不过仅用了一个测试用例，就是你提供的，不确定在其他区用例上能否正确得到结果）。  另外，又改了一下可变数组的的申请方式。C语言里不支持可变数组组，但是可以通过malloc/free来代替。

标准做法： 1. 排序 2. 去重 3. 遍历

引用 4 楼 KarivV 的回复:找到差值为k的数字对 求出去掉重复数组对后的 数字对个数 也就是 1-3 3-5 2-4 输出3   #include <stdio.h> #include <malloc.h>  int main() { 	long n, i, j, count = 0; 	unsigned int k = 0; 	int *arr; 	scanf("%d %d", &n, &k); 	rewind(stdin); 	arr = (int *)malloc(n * sizeof(int)); 	 	for (i = 0; i < n; ++i) 	{ 		scanf("%d", arr + i); 	} 	rewind(stdin);  	for (i = 0; i < n; ++i) 	{ 		for (j = 0; j < n; ++j) 		{ 			if (arr[j] == arr[i] + 2) 				++count; 		} 	}  	printf("%ld", count); 	return 0; }  不要嫌弃 代码丑陋  忘记free了... printf下面加个free(arr);

#include<stdio.h> //我理解的是你想把差值为n-k，或k-n的数字对去掉，还剩下的数字 int main() {     long int n,i,j,t,count=0;     unsigned int k; 	printf("please input n:");     scanf("%ld",&n); 	printf("please input k:");     scanf("%d",&k);     int arr[100];//这里不能用变量的     for(i=0; i<n; i++)     {	printf("input arr[%d]",i);         scanf("%d",&arr[i]);     }     for(i=0; i<n-1; i++)     {         for(j=i+1; j<n; j++)         {             if(arr[i]-arr[j]==n-k||arr[j]-arr[i]==n-k)                 count++;         }     }     printf("%ld",n-count*2);     return 0; }

能把你说的去重说的清楚一点吗？

你这个问题是什么啊？


Question: 数列排序  请各位大神看看有什么问题？

引用 1 楼 user-5的回复:遇到什么问题说清楚 编译错误贴错误提示  运行错误贴运行截图  代码要用[c o d e = c] [ / c o d e ] 去掉空格包起来 请问怎么用代码要用[c o d e = c] [ / c o d e ] 去掉空格包起来？

你这个是数组输入几个元素，最后让数组按从小到大的顺序输出，

12行似乎错了 应该是for(int j=i+1;j<n;j++)

#include <stdio.h> #include <stdlib.h>  int main() {     int n,i,j;      scanf("%d", &n);     //int a[n],temp;     int temp;     int *a = (int *)malloc(sizeof(int) * n);     if (!a)         return -1;      for(i=0;i<n;i++) {         scanf("%d",&a[i]);     }      for(i=0;i<n;i++)     {         //for(j=i+1;j<n+1;j++)         for(j=i+1;j < n; j++)         {             if(a[i]>a[j])             {                 temp=a[i];                 a[i]=a[j];                 a[j]=temp;             }         }     }     for(i=0;i<n;i++)     {         printf("%d ",a[i]);     }     putchar(10);     free(a);     return 0; }  参考一下吧  C语言不支持动态数组，那么可以考虑malloc/free来动态申请空间。 另外，注意数组越界的问题。即排序的第二层循环里，注意j的循环最大值。

感觉没问题，选择排序。就是老一点的不支持动态数组。 还有建议输出加个换行或者 \t 什么的。


Question: #pragma comment的功能为什么是“该指令将一个注释记录放入一个对象文件或可执行文件中”？

comment #pragma comment( comment-type [, commentstring] )  Places a comment record into an object file or executable file. The comment-type is one of five predefined identifiers, described below, that specify the type of comment record. The optional commentstring is a string literal that provides additional information for some comment types. Because commentstring is a string literal, it obeys all the rules for string literals with respect to escape characters, embedded quotation marks ("), and concatenation.  compiler  Places the name and version number of the compiler in the object file. This comment record is ignored by the linker. If you supply a commentstring parameter for this record type, the compiler generates a warning.  exestr  Places commentstring in the object file. At link time, this string is placed in the executable file. The string is not loaded into memory when the executable file is loaded; however, it can be found with a program that finds printable strings in files. One use for this comment-record type is to embed a version number or similar information in an executable file.  lib  Places a library-search record in the object file. This comment type must be accompanied by a commentstring parameter containing the name (and possibly the path) of the library that you want the linker to search. Since the library name precedes the default library-search records in the object file, the linker searches for this library just as if you had named it on the command line. You can place multiple library-search records in the same source file; each record appears in the object file in the same order in which it is encountered in the source file.  linker  Places a linker option in the object file. You can use this comment-type to specify a linker option instead  placing the option on the Link tab of the Project Settings dialog box. For example, you can specity the /include option to force the inclusion of a symbol:  #pragma comment(linker, "/include:__mySymbol")  user  Places a general comment in the object file. The commentstring parameter contains the text of the comment. This comment record is ignored by the linker.  The following pragma causes the linker to search for the EMAPI.LIB library while linking. The linker searches first in the current working directory and then in the path specified in the LIB environment variable.  #pragma comment( lib, "emapi" )  The following pragma causes the compiler to place the name and version number of the compiler in the object file:  #pragma comment( compiler )  Note   For comments that take a commentstring parameter, you can use a macro in any place where you would use a string literal, provided that the macro expands to a string literal. You can also concatenate any combination of string literals and macros that expand to string literals. For example, the following statement is acceptable:  #pragma comment( user, "Compiled on " __DATE__ " at " __TIME__ )

#pragma是预处理指令，它的作用是设定编译器的状态或者指示编译器完成特定的动作。其格式为 #pragma Parameter 其中，Parameter表示参数，其值可以是message、once、resource以及comment等。当Paremeter是comment时，表示将一个注释记录放入到一个对象文件或可执行文件中。在项目中使用库文件时，就可以使用该指令。 #pragma comment指令的格式为 #pragma comment(comment-type, “commentstring”) 其中，comment-type是预定义的标识符，指定了注释的类型，其值可以是compiler、exestr、lib和linker；commentstring为comment-type提供附加信息的字符串。在项目中使用库文件时，需要将comment-type设置为lib，commentstring为库文件名。 #pragma comment(lib,"ws2_32.lib")


Question: int16_t   uint32_t   int_least8_t  intmax_t如何输出？

printf("%lld",A);  sizeof(A) format 2 %hd 4 %d 8 %ld 16 %lld


Question: 求助，怎么把内存中的16进制0x00显示出来？

可以参考下博文 我用#CSDN#这个app发现了有技术含量的博客，小伙伴们求同去《常见数据格式转换处理的代码实现》, 一起来围观吧 https://blog.csdn.net/szullc/article/details/85009998 里面有很多现成的格式数据常用形式转换，你的这种需求，我们叫“BCD形式转ASCII形式”

#include <stdio.h>  char MACDZ[] = { (char)0x00, (char)0x12, (char)0x4B, (char)0x00, (char)0x19, (char)0xAB, (char)0xF0, (char)0x66 };  int main() { 	unsigned length = sizeof(MACDZ); 	char buffer[BUFSIZ]; 	for (unsigned i = 0; i < length; ++i) 		sprintf(buffer + (i << 1), "%02X", (unsigned char)MACDZ[i]); 	buffer[length << 1] = 0; 	printf("%s", buffer); 	return 0; }


Question: 为什么无法进行下一步调试了

你的这个scanf，要在输入数据的时候输入逗号，而不能是其他字符才行，当然你可以把%d间的字符删除，输入时用空格隔开就好

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

又见VC++6.0，这是我最喜欢的调试器！ 正如楼上几位朋友所说，scanf输入格式和输入的内容不匹配，有5个%d，而后面只有4个参数。把代码修改为 scanf("%d,%d,%d,%d", &a, &b, &c, &d); 还需要注意的是在控制台中输入数字的格式，应该如下图所示  数字与数字中间要有一个英文格式的逗号，此时的输出结果为  如果不想在输入时加入逗号，应该把scanf()函数的代码改为 scanf("%d %d %d %d", &a, &b, &c, &d);//此时d%之间没有逗号 此时在控制台中输入输出的效果如图所示

scanf("%d,%d,%d,%d,%d",&a,&b,&c,&d);

无法继续调试，应该是没有输入完全。scanf输入格式和输入的内容不匹配。%d（5个），参数个数是4个。

你前面是五个%d，后面是四个输入

我输入了，但是为什么不行啊，是我输入的地方不对吗

scanf函数是阻塞，等待用户输入数据才能继续

应该是逗号吧，把逗号去掉


Question: 如何要求用户输入的scanf("%d",&num);必须是数字1.2.0啊，这里如果用户输入字符的话会进入死循环

引用 1 楼 独孤由过 的回复: #include <stdio.h>  int main() { 	int num; 	do 	{ 		if (scanf("%d", &num) != 1) 			fseek(stdin, 0, SEEK_END); 	} while (num < 0 || num > 2); 	printf("%d", num); 	return 0; }  之前的代码链接 没体现出问题 换一个代码连接  点开有惊喜

引用 1 楼 独孤由过 的回复: #include <stdio.h>  int main() { 	int num; 	do 	{ 		if (scanf("%d", &num) != 1) 			fseek(stdin, 0, SEEK_END); 	} while (num < 0 || num > 2); 	printf("%d", num); 	return 0; }  真是不幸 踩雷了 stdin不能fseek 就算在你的运行环境可以  换一个运行环境可能就不行 这是地雷区 什么时候踩到地雷 怎么踩的都不知道  https://ideone.com/Qcq0WC

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

仅供参考：#include <stdio.h> #include <string.h> char s[80]; int i; char c; int main() {     while (1) {         printf("Input a integer:");fflush(stdout);         rewind(stdin);         fgets(s,80,stdin); 		if (strlen(s)>10) { 			printf("Input too long(>9)!\n"); 			continue; 		}         if (2==sscanf(s,"%d%c",&i,&c)) {             if ('\n'==c) {                 printf("%d is a integer.\n",i);                 break;             }         }         if ('\n'==s[strlen(s)-1]) s[strlen(s)-1]=0;         printf("\"%s\" is NOT a integer!\n",s);     }     return 0; }

引用 2 楼 自信男孩 的回复:因为%d匹配的是数字，如果输入1.2.0，那么'.'是不匹配%d。但是'.'不会从内存中刷走，而是还在输入缓存里，所以等下次循环时，scanf还是会匹配1.2.0，这样就一直死循环了。 建议判断scanf的 返回值，如果返回值不是1（因为%d只有一个），则清空输入缓冲区并让用户继续输入，

用char类型，char c=getchar()，如果c=='1'……，否则如果c=='2'……，否则如果c=='0'……，否则就不符合要求。


Question: epoll问题

可以通过设置心跳机制来控制 用setsockopt来设置探测间隔、发包间隔、次数

引用 1 楼 northwesternwind的回复:应该会作为事件返回。需要注册相应的事件：  EPOLLIN：            触发该事件，表示对应的文件描述符上有可读数据。(包括对端SOCKET正常关闭)；          EPOLLOUT：         触发该事件，表示对应的文件描述符上可以写数据；         EPOLLPRI：           表示对应的文件描述符有紧急的数据可读（这里应该表示有带外数据到来）；         EPOLLERR：        表示对应的文件描述符发生错误；          EPOLLHUP：        表示对应的文件描述符被挂断；         EPOLLET：           将EPOLL设为边缘触发(Edge Triggered)模式，这是相对于水平触发(Level Triggered)来说的。         EPOLLONESHOT：  只监听一次事件，当监听完这次事件之后，如果还需要继续监听这个socket的话，需要再次把 谢谢，网络中断或者客户端关机，这些事件触发不了

引用 2 楼 focuslight 的回复:有 超时机制吧 下面内容从stackoverflow抄来的，应该 有用： Sounds like you're trying to write an event loop (if so have a look at libev btw).  epoll will not help you there, you have to keep track of socket inactivity yourself (clock_gettime() or gettimeofday() for instance), then wake up several times a second and check everything you need.  Some pseudo code  while (1) {     n = epoll_wait(..., 5);     if (n > 0) {         /* process activity */     } else {         /* process inactivity */     } } This will wake you up 200 times a second if all sockets are inactive.  The inactivity check requires a list of the sockets to be examined along with timestamps of the last inactivity:  struct sockstamp_s {     /* socket descriptor */     int sockfd;     /* last active */     struct timeval tv; };  /* check which socket has been inactive */ for (struct sockstamp_s *i = socklist; ...; i = next(i)) {     if (diff(s->tv, now()) > 500) {         /* socket s->sockfd was inactive for more than 500 ms */         ...     } } where diff() gives you the difference of 2 struct timevals and now() gives you the current timestamp.

有 超时机制吧


Question: 这个算不对啊，求详细介绍一下，谢谢

引用 4 楼 niiiloc的回复:a[0]=1 a[1]=0 a[2]=a[2]+a[1]+a[0]=1+0+1=2 a[3]=a[3]+a[2]+a[1]=0+2+0=2 a[4]=a[4]+a[3]+a[2]=1+2+2=5 a[5]=a[5]+a[4]+a[3]=0+5+2=7 以此类推 最后输出是1 0 2 2 5 7 13 20 100分怎么给你，没经历过过

引用 1 楼 niiiloc的回复:注意a[i]+=a[i-1]+a[i-2]; 就好了，其他没啥难点吧 他的运行结果，我算不对

引用 1 楼 niiiloc的回复:注意a[i]+=a[i-1]+a[i-2]; 就好了，其他没啥难点吧 详细说一下详细介绍一下

注意a[i]+=a[i-1]+a[i-2]; 就好了，其他没啥难点吧


Question: STM32控制WIFI模块ESP8266发送数据到TCP Server

你好！上面的问题已经解决了 现在是我能实现局域网内部的通信 但是互联网通信还不能实现 卡在连接服务器上 ESP8266能够连接到WIFI 但是下一步连接服务器就一直报连接超时的问题 恳请大哥能帮下小弟

定时器中断 就好了


Question: 十进制转化为十六进制输入整数大于等于2^32的问题，如何解决？

用long，再不行用long long，再不行，字符串模拟大数计算。

引用 1 楼 独孤由过 的回复:任意进制之间的相互转换  #include<iostream>  char hex[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };  int hexConversion(char *str, char *istr, int x, int n) { 	int sum = 0, lengh = strlen(str); 	for (int i = lengh - 1; i >= 0; --i) 	for (int j = 0; j < 16; ++j) 	if (str[i] == hex[j]) 		sum += j*pow(x, lengh - i - 1); 	int count = 0; 	do 	{ 		istr[count] = hex[sum%n]; 		sum /= n; 		++count; 	} while (sum != 0); 	return count; }  int main() { 	char str[100], istr[100]; 	int x, n; 	std::cout << "输入数和进制："; 	std::cin >> str >> x; 	std::cout << "输入转换的进制："; 	std::cin >> n; 	int count = hexConversion(str, istr, x, n); 	std::cout << "结果为："; 	for (int i = count - 1; i >= 0; --i) 		std::cout << istr[i]; 	return 0; } 你都没看题主遇到的问题是什么 怎么转换题主知道并且代码都写出来了 题主的问题是 溢出 如果数据 超过int的取值范围 代码结果错 想知道怎么处理 而你的代码 会出现和题主一样的问题 解决的是题主并不关心的任意进制转换到任意进制  另外2个问题 1. pow没写头文件 2. 任意进制转十进制的时候从后往前计算又掉low 从前往后计算方便多了

char * __cdecl _ui64toa(unsigned __int64, char *, int);


Question: 有趣的指针—指针的高级应用

//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]


Question: .C源文件可以调用.c源文件作为头文件吗？可否有简单的例程咧

引用 2 楼 喔喔喔喔喔喔喔喔的回复:这样的话，我可以在linux下通过makefile进行处理，屏蔽掉该源文件的生成，但是在windows下应该如何处理该情况呢？ 可以把.c文件名改为.h，然后主.c里面include这个.c；我们项目就是这么干。这种方法一般是，这个.c有宏开关，宏开关在不同的.c定义，这样不同的.c文件include这个.h就可以有多种实现。用起来很灵活

语法上可以 原则上不这样做 如果使用IDE .c文件是默认会编译的 单独的.c编译一次 include到另一个.c文件之后 重新编译一次   这个文件里面的实体会出现重复定义的情况


Question: 哪位大神能帮我修改一下，加个一段程序，使代码也可以输出char？

int main() {      double f;     long n;     int		nums;     char	c;      printf("pls enter ur double:");      nums = scanf("%lf", &f);     if (nums == 1)     {         if (f < 0)         {             printf("-");             f = -f;         }         n = (long)f;//整数部分         printf("is:", NUM);         integer(n);         printf(".");         decimal(f - n);//小数部分的转换     } 	else 	{ 		scanf("%c", &c); 		printf("%c: ", c); 		integer(c); 	}     printf("\n");     system("pause");     return 0; }

就是输入一个值比如说输入5.88或者C或者6这几个类型的值以二进制的形式输出，我想找个大神帮我修改一下这段代码，这个只能输出小数和整数的二进制的值

想帮你，不过你可以把问题叙述得完整一点吗。。。

没有人来帮忙吗。。

来人啊，来人啊

有没有人啊！！！


Question: 小弟遇到c语言问题了求大神解答

引用 1 楼 自信男孩 的回复:scanf_s("%s", x, strlen(x)); 第三个参数应该用：LEVEL_MAX * 2 - 1 谢谢大神啊，问题解决了，问题我猜是scanf_s需要的参数里的，恶补一下这个再回来问大神吧，康萨阿米达！


Question: 读完 《c primer plus》 后的一些想法与疑惑

第2点，应该不用特意去学api再学gui。直接上手，mfc或者qt二选一。这两个关键词你丢到百度里就有很多相关的书籍了。

仅供参考： C++ Builder是什么？RAD开发工具~。分享几个C++ Builder资源 https://bbs.csdn.net/topics/392493823

引用 3 楼 user-2 的回复:一些较老的操作系统书有讲Windows NT的组成框图，新的我就不清楚了。 Windows服务，很多博客都有。 常用DOS命令，百度都有。 其实这些对你“写一些软件练练手”用处不大，倒是可以了解一下EasyX，写点小游戏玩玩，对实践很有帮助。  谢谢。

windows操作系统基础知识 API+DLL 2017年11月30日 20:07:57 ShellMeShell丶 阅读数：964  版权声明：本文为博主原创文章，转载记得附上原链接哟～已更新博客地址showmeshell.top https://blog.csdn.net/Everywhere_wwx/article/details/78680312 windows操作系统 1.Win API简介 API:Application Programming Interface(应用程序接口)  API函数构筑了整个windows框架的基石，下面是操作系统的操作系统的核心，而它上面则是windows应用程序。  用于16位版本windows的API——>win16 用于32位版本windows的API——>win32（windows 9x/NT/2000/XP/2003 1 2 ）  windows9x是16+32位混合体，windowsNT/2000/XP纯32位  API函数调用从win16到win32的转变中保持兼容，并在功能和数量上不断增强。  **windows 9x/NT/2000/XP/2003的工作方式  windows NT/2000/xp win16函数调用通过一个转换层被转化为win32函数调用，然后被操作系统处理。  windows 9x 相反，win32函数调用转换层转换为win16位函数调用，再由操作系统处理。  2.操作系统运转核心:动态链接 windows提供了应用程序可利用的丰富的函数调用，这些函数采用动态链接库（DLL）  早期的windows的主要部分只需要在三个动态链接库中实现，代表了windows三个主要子系统：Kernel，User，GDI  Kernel(16位KRNL386.EXE+32位KERNEL32.DLL实现):操作系统核心功能服务，包括进程与线程控制，内存管理，文件访问;  User(16位USER.EXE+32位USER32.DLL实现):负责处理用户接口，包括键盘和鼠标输入，窗口和菜单管理;  GDI(16位GDI.EXE+32位GDI32.DLL实现):图形设备接口，允许程序在屏幕和打印机上显示文本和图形;  还有其他很多 比如:  ADVAPI32.DLL:对象安全性，注册表操作  COMCTL32.DLL:通用控件  COMDLG32.DLL:公共对话框  SHELL32.DLL:用户界面外壳  DIBENG.DLL:图形引擎  NETAPI32.DLL:网络  3.常用win32API函数: API函数区分字符集：A表示ANSI，W表示widechars即（unicode）  1.hmemcpy函数  void hmemcpy(     void _huge* hpvDest, // 目的数据地址     void _huge* hpvSource,// 源数据地址     long cbCopy//// 数据大小 (字节) );  1 2 3 4 5 这个函数位于KERNEL32.DLL中，它很常用，俗称万能断点，但一般的编程书籍上很少提到，原因它是底层的东西，没有特殊需要，一般不直接调用。但的确它是很有用的！有意思的是它执行的操作很简单，只是将内存中的一块数据拷贝到另一个地方。  注意：此函数只在Windows 9x系统上有效，在Win NT/2000系统上相关的函数是memcpy，但在Win NT/2K上不同于Windows 9x上，很少再调用memcpy来处理数据了，用此函数设断基本上什么也拦不住。  2.GetWindowText函数  此函数在USER32.DLL用户模块中，它的作用是取得一个窗体的标题文字，或者一个文本控件的内容  函数原型：  int GetWindowText(     HWND hWnd,          //窗口或文本控件句柄     LPTSTR lpString,    //缓冲区地址     int nMaxCount       //复制的最大字符数 ); 1 2 3 4 5 16位：GetWindowText  32位：GetWindowTextA，GetWindowTextW  3.GetDlgItem函数:  此函数在USER32.DLL用户模块中，它的作用是获取指定对话框的句柄。  函数原型:  HWND GetDlgItem(     HWND hDlg,          //对话框句柄     int nIDDlgItem      //控件标识 ); 1 2 3 4 4.GetDlgItemText函数:  此函数在USER32.DLL用户模块中，它的作用是获取对话框文本。  函数原型：  UINT GetDlgItemText(     HWND hDlg,          // 对话框句柄     int nIDDlgItem,     //控制标识(ID)     LPTSTR lpString,    //文本缓冲区指针     int nMaxCount       // 字符缓冲区的长度 ); 1 2 3 4 5 6 16位：GetDlgItemText  32位：GetDlgItemTextA，GetDlgItemTextW  5.GetDlgItemInt函数:  此函数在USER32.DLL用户模块中，它的作用是获取对话框整数值。函数原型：  UNIT GetDlgItemInt(     HWND hDlg,          //对话框句柄     int nIDDlgItem,     //控件标识     BOOL *IpTranslated, //接受成功/失败指示的指针     BOOL bSigned        //指定是有符号数还是无符号数 ); 1 2 3 4 5 6 成功，IpTranslated ->true 返回文本对应的整数值;失败 false 返回值0  6.MessageBox函数  此函数是在USER32.DLL用户模块中，它的作用创建、显示信息框。  函数原型：  int MessageBox(     HWND hWnd,           //父窗口句柄     LPCTSTR lpText,      //消息框文本地址     LPCTSTR lpCaption,   //消息框标题地址     UINT uType           //信息框样式 ); 1 2 3 4 5 6 16位：MessageBox  32位：MessageBoxA，MessageBoxW  4.句柄（Handle）  handle在windows中使用非常频繁，是windows标识，由应用程序建立或使用的对象所使用的一个唯一的整数值（通常32位）  5.windows 9x与unicode  windows 9x 系统上其他成百上千的函数只提供了接受unicode参数的进入点，但是这些函数并不将unicode字符串转化成ANSI字符串，只返回运行失败的消息。这些函数只有ANSi版本才能正常运行，所以，如果要为window9x系统开发软件，只能用ANSI版函数开发应用程序，unicode版本的程序在windows 9x下无法正常运行。  6.windows NT/2000/XP 与unicode  在NT架构下，win32API能接受unicode和ASCII两种字符，而其内核则使用unicode。  windows 2000/xp既支持unicode，也支持ANSI，所有新增和未过时的函数在windows 2000/xp中都同时拥有ANSI和unicode版本  7.windows消息机制  windows是一个消息(Message)驱动式系统，windows消息提供应用程序与应用程序之间，应用程序与windows系统之间进行通信的手段。  应用程序想要实现的功能由消息来触发，并且靠对消息的响应和处理来完成。  message——>系统消息队列——>拷贝——>应用程序队列——>检索发生——>窗口函数  windows常用的消息函数:  1.SendMessge函数  调用一个窗口的窗口函数，将一条消息发给那个窗口，除非消息处理完毕，否则该函数不会返回  LRESULT SendMessge(     HWND hwnd,              //目的窗口的句柄     UINT Msg,               //消息标志符     WPARAM wParam,          //消息的WPARAM域     LPARAM lParam           //消息的LPARAM域 ); 1 2 3 4 5 6 2.WM_COMMAND消息  当用户从菜单或按钮中选择一条命令或者一个控件时发送给它的父窗口，或者当一个快捷键被释放时发送，（0111h）  WM_COMMAND     wNotifyCode=HIWORD(wParam);//通告代码     wID=LOWORD(wParam);        //菜单条目，控制或快捷键的标识符     hwndCtl=(HWND) lParam;     //控件句柄 1 2 3 4 5 3.WM_DESTROY消息  当一个窗口被破坏时发送，WM_DESTROY消息的十六进制是02h  无参数  4.WM_GETTEXT消息  应用程序发送一天WM_GETTEXT消息，将一个对应窗口的文本拷贝到一个呼叫程序提供的缓冲区中，（0Dh）  WM_GETTEXT     wParam=(WPARAM) cchTextMax; //需要拷贝的字符数     lParam=(LPARAM) lpszText;   //接受文本的缓冲区地址 1 2 3 返回值:被拷贝的字符数  5.WM_QUIT消息  当应用程序调用PostQuitMessage函数时，生成消息WM_QUIT。（012h）  WM_QUIT     nExitCode=(int) wParam;     //退出代码 1 2 6.WM_LBUTTONDOWN消息  当光标在一个窗口的客户区并且用户按下鼠标左键时，WM_LBUTTONDOWN消息被发送。如果鼠标动作未被捕获，这条消息被发送给光标下的窗口；否则，被发送给已经捕获鼠标动作的窗口。（0201h）  WM_LBUTTONDOWN     fwKeys=wParam;              //key旗标     xPos=LOWORD(lParam);        //光标的水平位置     yPos=HIWORD(lParam);        //光标的垂直位置 1 2 3 4 8.保护模式简介:  在保护模式下，所有的应用程序都有权限级别（PL） 0~3  0特权级别最高。3最低  Ring0：操作系统核心层  Ring3:用户态，用户应用程序。  如想控制系统，就必须获得Ring0，比如调试工具SoftICE就是工作在0之上的。

引用 1 楼 user-2 的回复:疑惑1：有哪些书籍或学习资料介绍了(本小白目前使用的是win10)windows的基本操作 —————— 轻轻松松学电脑之类的，这种书书店里一大把。  首先谢谢你的回答，但是你的答案并不是我想要的(我在后面的括号中说明了：如windows的基本组成，windows提供的服务，dos命令等)


Question: 用c的结构体和链表写了一个系统，但输入像进行的操作后，无法运行相应程序

也没有将要添加的信息写到文件中


Question: C语言结构体所占用的字节数如何计算？？？

可以了解一下结构体内存对齐和#pragma pack

可以关闭对齐（对齐到1字节）

32位系统上：4+10+1+1(补齐) + 4 + 4 = 24  共补了一个字节 如果是16位系统：2 + 10 + 1 + 1(补齐) + 2 + 2 = 18 共补了一个字节，应该不会是19，因为结构体对其也是系统的整数倍（32位系统，需要是4的倍数，16位系统，需要是2的倍数）  以上的推测背景是Linux系统

仅供参考：#include <stdio.h> #define field_offset(s,f) (int)(&(((struct s *)(0))->f)) struct AD  { int a; char b[13]; double c;}; #pragma pack(push) #pragma pack(1) struct A1  { int a; char b[13]; double c;}; #pragma pack(2) struct A2  { int a; char b[13]; double c;}; #pragma pack(4) struct A4  { int a; char b[13]; double c;}; #pragma pack(8) struct A8  { int a; char b[13]; double c;}; #pragma pack(16) struct A16 { int a; char b[13]; double c;}; #pragma pack(pop) int main() {     printf("AD.a %d\n",field_offset(AD,a));     printf("AD.b %d\n",field_offset(AD,b));     printf("AD.c %d\n",field_offset(AD,c));     printf("AD sizeof %d\n", sizeof(AD));     printf("\n");     printf("A1.a %d\n",field_offset(A1,a));     printf("A1.b %d\n",field_offset(A1,b));     printf("A1.c %d\n",field_offset(A1,c));     printf("A1 sizeof %d\n", sizeof(A1));     printf("\n");     printf("A2.a %d\n",field_offset(A2,a));     printf("A2.b %d\n",field_offset(A2,b));     printf("A2.c %d\n",field_offset(A2,c));     printf("A2 sizeof %d\n", sizeof(A2));     printf("\n");     printf("A4.a %d\n",field_offset(A4,a));     printf("A4.b %d\n",field_offset(A4,b));     printf("A4.c %d\n",field_offset(A4,c));     printf("A4 sizeof %d\n", sizeof(A4));     printf("\n");     printf("A8.a %d\n",field_offset(A8,a));     printf("A8.b %d\n",field_offset(A8,b));     printf("A8.c %d\n",field_offset(A8,c));     printf("A8 sizeof %d\n", sizeof(A8));     printf("\n");     printf("A16.a %d\n",field_offset(A16,a));     printf("A16.b %d\n",field_offset(A16,b));     printf("A16.c %d\n",field_offset(A16,c));     printf("A16 sizeof %d\n", sizeof(A16));     printf("\n");     return 0; } //AD.a 0 //AD.b 4 //AD.c 24 //AD sizeof 32 // //A1.a 0 //A1.b 4 //A1.c 17 //A1 sizeof 25 // //A2.a 0 //A2.b 4 //A2.c 18 //A2 sizeof 26 // //A4.a 0 //A4.b 4 //A4.c 20 //A4 sizeof 28 // //A8.a 0 //A8.b 4 //A8.c 24 //A8 sizeof 32 // //A16.a 0 //A16.b 4 //A16.c 24 //A16 sizeof 32 // //

需要考虑对齐要求alignment requirement

没有统一有效的算法 都是按照具体编译环境处理的 只保证一定可以存下所有成员


Question: C语言十进制二进制互转问题

#include <stdio.h>  void change10_8(int n) {     if (n == 0)         return;     else     {         change10_8(n/8);         printf("%d",n%8);     } }  int main(int argc, const char * argv[]) {     int n;     scanf("%d",&n);     change10_8(n);     return 0; }

这是我写的转化为8进制的 你看一下：

#include <stdio.h> #include <string.h> #include <math.h>  int main() {     char two[20]; #if 0     int lenght,lenght_2;     int s,ten = 0;     printf("请输入一个二进制数：");     fgets(two, 20, stdin);     lenght_2=lenght=strcen(two);     lenght_2-=1;     for(s=0;s<lenght;s++,lenght--)     {         ten += pow(two,lenght_2);     } #else     int ten = 0, length;     int i, power;     fgets(two, 20, stdin);     length = strlen(two);     if (length < 20)         length -= 2;    //'\n' and '\0'      i = 0;     power = length;     while (i <= length) {         if (two[i]-'0' == 0) {             i++;             power--;             continue;         }         ten += (two[i] - '0') * pow(2, power);         i++;         power--;     }  #endif     printf("十进制为：%d\n", ten);      return 0; } 参考一下吧

#include <stdio.h> #include <string.h> #include <math.h> void main() {       char two[20];       int lenght,lenght_2;       int s = 0,ten=0;       printf("请输入一个二进制数：");       gets(two);     lenght=strlen(two); for(s=lenght-1;s>=0;s--) {       ten+=(two[s] - '0')*(pow(2,lenght - s -1)); } printf("output:%d\r\n", ten); return ; }

仅供参考：#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汉


Question: 有关epoll+socket的问题

引用 楼主 Nelg的回复:首先一些基本的socket问题 1.若一个socket设置成非阻塞socket，那么调用accept()函数的时候，socket是阻塞还是非阻塞状态？ 2.若使用select或者epoll，那么socket还要设置成非阻塞式吗？ 3.若socket是阻塞式的，并且使用一个线程去accept()新的客户端，那么在accept()的期间是不是另一个线程去接收或者发送已连接的客户端的数据也会在阻塞状态？ 4.还是不是很清楚epoll的用法，网上的资料千篇一律，希望能得到一个epoll+socket的原理和流程描述 1. accept是否阻塞由socket决定的，这个你可以写代码试一试 。2. 使用epoll并不要求socket是非阻塞的，但一般都建议是非阻塞的，因为socket阻塞的话可能导致epoll_wait不能及时返回，处理新的请求。3. 不会，因为是不同的socket。


Question: 一个简单的链表编写到一半的时候编译通过但是运行出错，请大神帮忙看看问题出在哪里，谢谢啦！

数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633  链表不简单！

void insert(Linklist L,Datatype x) {     Linklist S=(Linklist)malloc(sizeof(ListNode));     if(S==NULL)     {         printf("申请空间失败！\n");         return;     }     S->data = x;  #if 1     S->next = L->next;     S->front = L;     L->next = S; #else      S->next = L->next;     L->next = S;     S->front=L;     S->next->front=S; #endif     return; }  参考一下吧

引用 1 楼 冷风1023 的回复:S->data=x;     S->next=L->next; //这里L->next初始化的时候是NULL，所以S->next就是NULL     L->next=S;     S->front=L;     S->next->front=S;//根据上面的值S->next是NULL，所以这里段错就肯定的了。 对了！这里好像是有点问题，我再去改改，谢谢啦兄弟。一会有问题的话回来问问


Question: 大佬们，我自己整的“变态选择排序”为什么运行达不到效果？

引用 7 楼 niiiloc 的回复:区别大了，一重循环无法交换已经被交换过的数，所以一重循环排序后的结果并不一定是对的 例如321 一重循环只能变成213  321->231->213 二重循环才能变成123  213->123 引用 6 楼 zyx6680599 的回复:大佬，虽然一个是一重循环，一个是二重循环，但是这两个循环都是将每一个元素和下个元素比较并交换的啊，为什么效果上就不一样呢 谢谢！

引用 4 楼 自信男孩 的回复:[quote=引用 3 楼 zyx6680599 的回复:] [quote=引用 1 楼 自信男孩 的回复:] 选择排序应该是双层循环呢，看你的代码是一层循环，那么只能对数组做一次排序，找到最大值或者最小值并放到对应的位置。 大佬麻烦给我详细解释一下，（可能我太笨听不明白），我看选择排序不就是将数组的每一个元素与下一个元素做对比么？ 就类似这样：for(i=0;i<8;i++)                                for(j=1;j<9;j++)                                        if(a[i]<a[j])                                                     b=a[i];a[i]=a[j];a[j]=b; 与我的这段 for(i=10;i>1;i--)     {         if(a[i]<a[i-1])         {             b=a[i];             a[i]=a[i-1];             a[i-1]=b;         }     } 有什么本质上不一样呢？请大佬给予详细解答，万分感谢[/quote]  区别还是很明显的，一个是一重循环，一个是二重循环。另外， for(i=0;i<8;i++)                                for(j=1;j<9;j++)                                        if(a[i]<a[j])                                                     b=a[i];a[i]=a[j];a[j]=b; 这个代码有问题，缺少一个大括号。  for(i=0;i<8;i++)                                for(j=1;j<9;j++)                                        if(a[i]<a[j]) {                                                     b=a[i];a[i]=a[j];a[j]=b;                                         }[/quote] 大佬，虽然一个是一重循环，一个是二重循环，但是这两个循环都是将每一个元素和下个元素比较并交换的啊，为什么效果上就不一样呢

引用 3 楼 zyx6680599 的回复:[quote=引用 1 楼 自信男孩 的回复:] 选择排序应该是双层循环呢，看你的代码是一层循环，那么只能对数组做一次排序，找到最大值或者最小值并放到对应的位置。 大佬麻烦给我详细解释一下，（可能我太笨听不明白），我看选择排序不就是将数组的每一个元素与下一个元素做对比么？ 就类似这样：for(i=0;i<8;i++)                                for(j=1;j<9;j++)                                        if(a[i]<a[j])                                                     b=a[i];a[i]=a[j];a[j]=b; 与我的这段 for(i=10;i>1;i--)     {         if(a[i]<a[i-1])         {             b=a[i];             a[i]=a[i-1];             a[i-1]=b;         }     } 有什么本质上不一样呢？请大佬给予详细解答，万分感谢[/quote]  区别还是很明显的，一个是一重循环，一个是二重循环。另外， for(i=0;i<8;i++)                                for(j=1;j<9;j++)                                        if(a[i]<a[j])                                                     b=a[i];a[i]=a[j];a[j]=b; 这个代码有问题，缺少一个大括号。  for(i=0;i<8;i++)                                for(j=1;j<9;j++)                                        if(a[i]<a[j]) {                                                     b=a[i];a[i]=a[j];a[j]=b;                                         }

引用 1 楼 自信男孩 的回复:选择排序应该是双层循环呢，看你的代码是一层循环，那么只能对数组做一次排序，找到最大值或者最小值并放到对应的位置。 大佬麻烦给我详细解释一下，（可能我太笨听不明白），我看选择排序不就是将数组的每一个元素与下一个元素做对比么？ 就类似这样：for(i=0;i<8;i++)                                for(j=1;j<9;j++)                                        if(a[i]<a[j])                                                     b=a[i];a[i]=a[j];a[j]=b; 与我的这段 for(i=10;i>1;i--)     {         if(a[i]<a[i-1])         {             b=a[i];             a[i]=a[i-1];             a[i-1]=b;         }     } 有什么本质上不一样呢？请大佬给予详细解答，万分感谢


Question: 系统报错systax error：'；'

分号是中文的。应该换成英文的。按Shift键即可切换到英文模式。

int expenses(stacknode *p, int x1, int x2, int x3, int x4) {     int w;      if(x3!= 0) {         if(weather()==1)             w = (x1*24+x2+1-(p->data.time.day*24+p->data.time.hour))*price_1;      //天气不同，价格不同         else if(weather()==2)             w = (x1*24+x2+1-(p->data.time.day*24+p->data.time.hour))*price_2;         else             w = (x1*24+x2+1-(p->data.time.day*24+p->data.time.hour))*price_3;     } else {         if(weather()==1)             w = (x1*24+x2+1-(p->data.time.day*24+p->data.time.hour))*price_1;      //天气不同，价格不同         else if(weather()==2)             w = (x1*24+x2+1-(p->data.time.day*24+p->data.time.hour))*price_2;         else             w = (x1*24+x2+1-(p->data.time.day*24+p->data.time.hour))*price_3;     }      return w;  } 建议加上括号。另外，看不出有其他的问题。建议将所有代码都贴出来。 尤其是stacknode的定义


Question: 关于insert 语法的问题

哥们，同样的错误已经犯过一次了，为什么还来问。。。 https://bbs.csdn.net/topics/392495425

INSERT INTO table  (req_no,rcv_no)  VALUES(:aa.req_no[100],:null_aa.req_no[100]);  这样传喽

aa和null_aa都是结构体变量，而不是结构体数组吧。你传进去的参数aa[100], null_aa[100]应该是不对的。


Question: 请各位大佬看看这是啥意思啊？特别急，求助

System.ArgumentNullException: 值不能为 null。参数名: path1   在 System.IO.Path.Combine(String path1, String path2)     这个是C#代码， Path.Combine 是合并两个路径信息，其中一个参数是null


Question: linux环境下daemon模式运行子进程与netlink通信失败

引用 14 楼 northwesternwind 的回复:There are multiple known causes for this error:  - You attempted to set a route specific to an interface which was not up at the time you ran the command.  - You attempted to set a route for a network before setting a host route for the gateway which handles traffic for that network.  感谢帮忙出主意哈 在上面那个回复里 The most common cause for the message I've seen is that you're trying to route via a path that is not known to the host. For example, LAN is 192.168.56.100 and WAN is 10.0.3.15. ip route add 8.8.8.8/32 via 192.168.6.1 results in RTNETLINK answers: No such process because 192.168.6.1 is not known to the host.  路由 not known to the host可能是指这个gateway地址无法匹配到本地直连网段。但是我这里是通过dhcpc获取ip，肯定是直连路由的，并且删除的是默认路由0.0.0.0/0   同时因为shell下kill没有问题，从log看也是先删除路由失败再由系统通知地址删除的 应该不是这个原因  然后引用的这两个都是在set route的时候吧  我是del不掉route TAT

看看这段话有没有帮助：  The most common cause for the message I've seen is that you're trying to route via a path that is not known to the host. For example, LAN is 192.168.56.100 and WAN is 10.0.3.15. ip route add 8.8.8.8/32 via 192.168.6.1 results in RTNETLINK answers: No such process because 192.168.6.1 is not known to the host.   来自 https://serverfault.com/questions/437598/what-can-cause-rtnetlink-answers-no-such-process-when-adding-a-route

引用 11 楼 northwesternwind 的回复:调用kill()啊。 试过了 结果也一样……

调用kill()啊。

引用 9 楼 northwesternwind 的回复:引用 8 楼 seraph17 的回复:[quote=引用 4 楼 northwesternwind 的回复:] 严重怀疑你传递给system的参数有问题。  为啥要用system()来这样干呢？l嵌入式linux没有kill()系统调用？而且传递给system的是个字符串吧……这个我确实没打印出来过。你说的确实有可能，不过它就是个kill -s SIGTERM pid  错误可能性实在是不大…… 程序中使用system调用kill, 和你在shell中执行，差别挺多的。比如环境变量，工作目录，启动的哪个 shell等等，外部因素很多。基本上不到实在没办法，别用system(). 我个人看到system()就会本能的怀疑一切。。。。。。[/quote] 那么有没有其他比较可靠的方法？

引用 4 楼 northwesternwind 的回复:严重怀疑你传递给system的参数有问题。  为啥要用system()来这样干呢？l嵌入式linux没有kill()系统调用？ 因为dhcpc这个功能比较小没有做平台化的常驻开发，类似这种应用我们统一了一个调用方法去处理pid和debug等。system是统一的方法。单独用kill我去试试看

引用 5 楼 user-2 的回复:1. 在服务控制进程中执行命令前打印出Pid值。 2. 确认下那个命令是否就是在fork之后的子进程空间执行的。 3. 自己在dhcpcd中增加信号处理函数，进行debug。  pid打出来了 存在文件里 没有错 第二个没看太明白哈 第三个 信号处理是有的，debug也都打了。netlink发送失败就是dhcpcd的退出处理过程中打出来的

引用 8 楼 seraph17 的回复:引用 4 楼 northwesternwind 的回复:严重怀疑你传递给system的参数有问题。  为啥要用system()来这样干呢？l嵌入式linux没有kill()系统调用？而且传递给system的是个字符串吧……这个我确实没打印出来过。你说的确实有可能，不过它就是个kill -s SIGTERM pid  错误可能性实在是不大…… 程序中使用system调用kill, 和你在shell中执行，差别挺多的。比如环境变量，工作目录，启动的哪个 shell等等，外部因素很多。基本上不到实在没办法，别用system(). 我个人看到system()就会本能的怀疑一切。。。。。。

主贴描述有一些逻辑不清，是我叙述问题   情况是这样的，嵌入环境下有一个服务控制进程，启动dhcpcd，daemon运行。dhcpcd在获取ip等业务完成后会自动fork。控制进程会保存dhcpcd的pid  这个时候控制进程kill -s SIGTERM  (pid)，dhcpcd可以正常退出，但无法发送netlink  routedel消息，返回错误no such process  同时，无论是控制进程启动dhcpcd，还是在shell里启动dhcpcd，通过shell杀掉dhcpcd，routedel消息都能正常发出去  反向验证，控制进程启动dhcpcd后，用一个c小程序调用system(kill -s SIGTERM  (pid))，同样能够正常发送routedel消息………………  然后我就没招了

引用 1 楼 northwesternwind 的回复:看的云里雾里，你kill的是哪个？如果是Kill的子进程，可能是因为你没有做好信号处理。另外，子进程需要和终端脱离关系。  kill dhcpcd，kill的很简单所以没有贴 我的错  kill -s SIGTERM  (pid)   kill执行本身是没问题的，能够正常关闭。 dhcpcd在退出后会执行地址release流程，该流程包括了删除本地地址和路由，并通知netlink事件的处理。  然而问题在于，使用shell来kill，netlink的事件通知是可以正常送达的  使用该环境的一个服务管理进程去kill，最终是执行的system（kill -s SIGTERM  (pid)），则无法发送netlink事件。错误原因是no such process


Question: C语言里一个无符号char型数，左移9位会怎么样？

你是把2左移9位，给一个整数了，和以前的uc无关

将ui的类型也定义为无符号的字符型就能得到你预想的结果

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

在移位之前，编译器会先对ui进行类型提升，提升为int。

和CPU的操作寄存器最小容量有关。

引用 8 楼 user-7 的回复:[quote=引用 3 楼 独孤由过 的回复:] 左移之后把值再保存至uc中，此时溢出，结果为0  [/code]为什么要保存到uc中?[/quote] 前面以寄存器说明左移原理，解释所谓的提升类型 用ui和uc做对比，两个变量空间大小不一样，一个未溢出，一个溢出 这是针对你提出的问题

引用 3 楼 独孤由过 的回复:左移之后把值再保存至uc中，此时溢出，结果为0  [/code]为什么要保存到uc中?

确实会进行类型提升，当使用unsigned long long时，使用两个寄存器，unsigned int只需用一个寄存器

首先从uc中取出值，存放于寄存器，之后再进行左移，x86寄存器一般32位，此时不会溢出 左移之后把值保存至ui中，此时也不会溢出，结果为1024 左移之后把值再保存至uc中，此时溢出，结果为0  #include <stdio.h>  int main() { 	unsigned char uc = 2; 	unsigned int ui = uc << 9; 	printf("%u\n", ui); 	printf("%u", uc <<= 9); 	return 0; }

类型提升 和 一个int 左移9一样


Question: linux多线程为什么只执行一次

#include <stdio.h> #include <unistd.h> #include <pthread.h> int flag = 1; pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; void *fun1(void *param) {         while(flag)         {                 pthread_mutex_lock(&mutex);                 printf("fun1\n");                 pthread_mutex_unlock(&mutex);                 usleep(2);         } }  void *fun2(void *param) {         while(flag)         {                 pthread_mutex_lock(&mutex);                 printf("fun2\n");                 pthread_mutex_unlock(&mutex);                 usleep(2);         } }  int main() {         pthread_t t1,t2;         pthread_create(&t1,NULL,fun1,NULL);         pthread_create(&t2,NULL,fun2,NULL);         usleep(20);         flag = 0;         pthread_join(t1,NULL);         pthread_join(t2,NULL);         return 0; } 在Linux下你的程序编译不通过，以上是修改之后的可以编译通过的代码；  之所以只执行一次，是因为usleep(20);时间太短。因为一个printf打印就基本上消耗远大于20us了。所以，只打印一次是正常的。


Question: C语言ELF加载和监控难题！

参考源代码就可以了呀多看看

引用 3 楼 赵4老师 的回复:参考linux源代码中ldd命令对应源代码相关片段。能不能具体说下……

参考linux源代码中ldd命令对应源代码相关片段。

哪位大神帮我实现void loader(char *filename) 方法！必有重谢！！！

能不能具体点说说该怎么写，附上代码


Question: 关于c语言指针的初始化问题

引用 1 楼 自信男孩 的回复:不一定是NULL，很大概率是非NULL。因为msg定义的指针没有初始化，那么这个指针变量里存放的内容是随机值，即指向是随机的。因此不一定为NULL，很大可能不是NULL。建议可以用%p打印一下，因为是随机值，每次运行的结果可能不一样。    引用 2 楼 北纬22.5度的攻城狮 的回复:msg的值是随机的，与当时系统的内存使用有关，如果刚好p的地址位于一个已使用过的空间，那它就不是NULL  谢谢二位！


Question: 无符号乘法和补码乘法

楼上错了吧，x=-2 ux=2^N - 2 也就是说如果x为负数，ux=2^N+x，如果x为正数，ux=x 分为三种情况： 两个正数、一正一负、两个负数  结论应该是对的

这个不一定相等吧，unsigned 默认是unsigned int即无符号整型，而int是有符号整型，比如x=-2  y=3  ux=2  uy=3，等式就不成立


Question: socket问题

fd 是linux下的文件描述符，可以理解为windows下的句柄 FD_READ 可以理解为系统通过这个文件描述符找到你要读的是什么(socket、io、文件等等)，FD_WRITE同理

struct  socket{    IP;   PORT;   TYPE;   ..... }  *fd, socket;  fd = &socket;  用于指向描述这个socket的指针，可以这样理解。

且当File Descriptor 吧

关于FD_WRITE、FD_READ专栏： https://blog.csdn.net/geeeeeeee/article/details/6559636

文件描述符吧：File Descriptor

引用 5 楼 北纬22.5度的攻城狮的回复:一般而言，fd指的是 file descriptor，即文件描述符；fp指的是file pointer，即文件指针。两者常被用于操作文件 一般fd是int类型，fp是FILE *类型

这里的FD指的应该是file descriptor。

文件描述符的意思 File Descriptor 在 linux 里, 一切都是文件,  应用程序和系统内核之间交流的时候用文件描述符来指定要操作的文件.

前面的这种缩写一般没有规范，只是取几个代表性字母，估计你得找官方代码或许才能知道什么意思。