八皇后问题 c语言问题

温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
学习ing,no end!
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
2、注释符号里的双引号不起表示字符串的作用;(//&“we have a in this line.\n”)3、若果情况混乱则从头找起。(/* " */ " */ 不能被完全注释掉,错误之处在于,有人可能认为中间的*/在“”中,不起作用,事实上,该双引号不起标记字符串的作用,因此编译器在第一个*/处就认为注释结束,则这一行最后上下“*/)关于容易出错的注释的问题:1、int /*...*/i;该定义变量i的语句是正确的,有人易误解为当编译器把/*...*/去掉后为inti,会导致不正确,编译器确实会将注释剔除,但不是简单的剔除,而是用空格进行了替换。2、char* s = "abcdef //hijklmn";根据规则23、//is that a \volid comment?\符号位续行符,显然该两行都会被注释掉。4、in/*...*/注释被替换为空格了,则显然不能通过编译。5、/* /* */ */ &此情况是不正确的,因为注释不能嵌套。
阅读(860)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_',
blogTitle:'关于C语言的注释问题',
blogAbstract:'三原则:1、字符串里的注释符号不起注释作用;(printf(“we have a // in this line.\\n”);字符串中的注释号显然不起作用,字符串被放入只读数据区)2、注释符号里的双引号不起表示字符串的作用;(//&“we have a in this line.\\n”)3、若果情况混乱则从头找起。(/* \" */ \" */ 不能被完全注释掉,错误之处在于,有人可能认为中间的*/在“”中,不起作用,事实上,该双引号不起标记字符串的作用,因此编译器在第一个*/处就认为注释结束,则这一行最后上下“*/)关于容易出错的注释的问题:1、int /*...*/i;该定义变量i的语句是正确的,有人易误解为当编译器把/*...*/去掉后为inti,会导致不正确,编译器确实会将注释剔除,但不是简单的剔除,而是用空格进行了替换。',
blogTag:'注释,编译器,字符串,不起,符号',
blogUrl:'blog/static/8',
isPublished:1,
istop:false,
modifyTime:9,
publishTime:0,
permalink:'blog/static/8',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'学习ing,no end!',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}C语言内存分配问题1、C中内存分为四个区栈:用来存放函数的形参和函数内的局部变量。由编译器分配空间,在函数执行完后由编译器自动释放。&堆:用来存放由动态分配函数(如malloc)分配的空间。是由程序员自己手动分配的,并且必须由程序员使用free释放。如果忘记用free释放,会导致所分配的空间一直占着不放,导致内存泄露。&全局局:用来存放全局变量和静态变量。存在于程序的整个运行期间,是由编译器分配和释放的。&文字常量区:例如char *c = “123456”;则”123456”为文字常量,存放于文字常量区。也由编译器控制分配和释放。&程序代码区:用来存放程序的二进制代码。例子(一)&int a = 0; //全局区&void main()&{& //栈&char s[] = //s在栈,abc在文字常量区&char *p1,*p2; //栈&char *p3 = 123456; //123456在常量区,p3在栈上&static int c =0; //全局区&p1 = (char *)malloc(10); //p1在栈,分配的10字节在堆&p2 = (char *)malloc(20); //p2在栈,分配的20字节在堆&strcpy(p1, 123456); //123456放在常量区&}&例子(二)&//返回char型指针&char *f()&{&//s数组存放于栈上&char s[4] = {'1','2','3','0'};& //返回s数组的地址,但程序运行完s数组就被释放了&}&void main()&{&char *s;&s = f();&printf (%s, s); //打印出来乱码。因为s所指向地址已经没有数据&}&2、动态分配释放内存用malloc动态分配内存后一定要判断一下分配是否成功,判断指针的值是否为NULL。&内存分配成功后要对内存单元进行初始化。&内存分配成功且初始化后使用时别越界了。&内存使用完后要用free(p)释放,注意,释放后,p的值是不会变的,仍然是一个地址值,仍然指向那块内存区,只是这块内存区的值变成垃圾了。为了防止后面继续使用这块内存,应在free(p)后,立即p=NULL,这样后面如果要使用,判断p是否为NULL时就会判断出来。NO.1void GetMemory(char *p){p = (char *)malloc(100);}void Test(void){char *str = NULL;GetMemory(str);strcpy(str,hello world);printf(str);}请问运行Test函数后会是什么样的结果?NO.2char *GetMemory(void){char p[] =}void Test(void){char *str = NULL;str = GetMemory();printf(str);}问题同NO.1NO.3void GetMemory2(char **p, int num){*p = (char *)malloc(num);}void Test(void){char *str = NULL;GetMemory(&str,100);strcpy(str,hello);printf(str);}问题同NO.1NO.4void Test(void){char *str = (char *)malloc(100);strcpy(str,hello);free(str);if(str != NULL){&strcpy(str,world);printf(str);}}问题同NO.1我对以上问题的分析:NO.1:程序首先申请一个char类型的指针str,并把str指向NULL(即str里存的是NULL的地址,*str为NULL中的值为0),调用函数的过程中做了如下动作:1申请一个char 类型的指针p,2把str的内容copy到了p里(这是参数传递过程中系统所做的),3为p指针申请了100个空间,4返回Test函数.最后程序把字符串hello world拷贝到str指向的内存空间里.到这里错误出现了!str的空间始终为NULL而并没有实际的空间.深刻理解函数调用的第2步,将不难发现问题所在!(建议:画图理解)NO.2:程序首先申请一个char类型的指针str,并把str指向NULL.调用函数的过程中做了如下动作:1申请一数组p[]并将其赋值为hello world(数组的空间大小为12),2返回数组名p付给str指针(即返回了数组的首地址).那么这样就可以打印出字符串"hello world"了么?当然是不能的!因为在函数调用的时候漏掉了最后一步.也就是在第2步return数组名后,函数调用还要进行一步操作,也就是释放内存空间.当一个函数被调用结束后它会释放掉它里面所有的变量所占用的空间.所以数组空间被释放掉了,也就是说str所指向的内容将不确定是什么东西.NO.3:正确答案为可以打印出hello.但内存泄漏了!&NO.4:申请空间,拷贝字符串,释放空间.前三步操作都没有任何问题.到if语句里的判断条件开始出错了,因为一个指针被释放之后其内容并不是NULL,而是一个不确定的值.所以if语句永远都不能被执行.这也是著名的"野"指针问题.所以我们在编写程序释放一个指针之后一定要人为的将指针付成NULL.这样就会避免出现"野"指针的出现.有人说"野"指针很可怕,会带来意想不到的错误.C语言内存对齐C99规定int、unsigned int和bool可以作为位域类型,但编译器几乎都对此作了扩展,允许其它类型类型的存在。使用位域的主要目的是压缩存储,其大致规则为:1) 如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止;2) 如果相邻位域字段的类型相同,但其位宽之和大于类型的sizeof大小,则后面的字段将从新的存储单元开始,其偏移量为其类型大小的整数倍;3) 如果相邻的位域字段的类型不同,则各编译器的具体实现有差异,VC6采取不压缩方式,Dev-C++采取压缩方式;4) 如果位域字段之间穿插着非位域字段,则不进行压缩;5) 整个结构体的总大小为最宽基本类型成员大小的整数倍。还是让我们来看看例子。示例1:struct BF1{char f1 : 3;char f2 : 4;char f3 : 5;};其内存布局为:|_f1__|__f2__|_|____f3___|____||_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|0 3 7 8 1316位域类型为char,第1个字节仅能容纳下f1和f2,所以f2被压缩到第1个字节中,而f3只能从下一个字节开始。因此sizeof(BF1)的结果为2。示例2:struct BF2{char f1 : 3;short f2 : 4;char f3 : 5;};由于相邻位域类型不同,在VC6中其sizeof为6,在Dev-C++中为2。示例3:struct BF3{char f1 : 3;char f2;char f3 : 5;};&什么是内存对齐&&& 考虑下面的结构:&&&&&&&& struct foo&&&&&&&& {&&&&&&&&&& char c1;&&&&&&&&&&&&&&&&&&&& char c2;&&&&&&&&&&&&&&&&&&& };&&&&&&& 假设这个结构的成员在内存中是紧凑排列的,假设c1的地址是0,那么s的地址就应该是1,c2的地址就是3,i的地址就是4。也就是&&& c1 , s , c2 , i 。&&& 可是,我们在Visual c/c++ 6中写一个简单的程序:&&&&&&&&&&& printf(&c1 %p, s %p, c2 %p, i %p/n&,&&&&&&& (unsigned int)(void*)&a.c1 - (unsigned int)(void*)&a,&&&&&&& (unsigned int)(void*)&a.s - (unsigned int)(void*)&a,&&&&&&& (unsigned int)(void*)&a.c2 - (unsigned int)(void*)&a,&&&&&&& (unsigned int)(void*)&a.i - (unsigned int)(void*)&a);&&& 运行,输出:&&&&&&&& c1 , s , c2 , i 。&&& 为什么会这样?这就是内存对齐而导致的问题。为什么会有内存对齐&&& 以下内容节选自《Intel Architecture 32 Manual》。&&& 字,双字,和四字在自然边界上不需要在内存中对齐。(对字,双字,和四字来说,自然边界分别是偶数地址,可以被4整除的地址,和可以被8整除的地址。)&&& 无论如何,为了提高程序的性能,(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;然而,对齐的内存访问仅需要一次访问。&&& 一个字或双字操作数跨越了4字节边界,或者一个四字操作数跨越了8字节边界,被认为是未对齐的,从而需要两次总线周期来访问内存。一个字起始地址是奇数但却没有跨越字边界被认为是对齐的,能够在一个总线周期中被访问。&&& 某些操作双四字的指令需要内存操作数在自然边界上对齐。如果操作数没有对齐,这些指令将会产生一个通用保护异常(#GP)。双四字的自然边界是能够被16整除的地址。其他的操作双四字的指令允许未对齐的访问(不会产生通用保护异常),然而,需要额外的内存总线周期来访问内存中未对齐的数据。编译器对内存对齐的处理&&& 缺省情况下,c/c++编译器默认将结构、栈中的成员数据进行内存对齐。因此,上面的程序输出就变成了:c1 , s , c2 , i 。编译器将未对齐的成员向后移,将每一个都成员对齐到自然边界上,从而也导致了整个结构的尺寸变大。尽管会牺牲一点空间(成员之间有空洞),但提高了性能。也正是这个原因,我们不可以断言sizeof(foo) == 8。在这个例子中,sizeof(foo) == 12。如何避免内存对齐的影响&&& 那么,能不能既达到提高性能的目的,又能节约一点空间呢?有一点小技巧可以使用。比如我们可以将上面的结构改成:struct bar{&&& char c1;&&&& char c2;&&&&&&};&&& 这样一来,每个成员都对齐在其自然边界上,从而避免了编译器自动对齐。在这个例子中,sizeof(bar) == 8。&&& 这个技巧有一个重要的作用,尤其是这个结构作为API的一部分提供给第三方开发使用的时候。第三方开发者可能将编译器的默认对齐选项改变,从而造成这个结构在你的发行的DLL中使用某种对齐方式,而在第三方开发者哪里却使用另外一种对齐方式。这将会导致重大问题。&&& 比如,foo结构,我们的DLL使用默认对齐选项,对齐为c1 , s , c2 , i ,同时sizeof(foo) == 12。而第三方将对齐选项关闭,导致&&& c1 , s , c2 , i ,同时sizeof(foo) == 8。如何使用c/c++中的对齐选项&&& vc6中的编译选项有 /Zp[1|2|4|8|16] ,/Zp1表示以1字节边界对齐,相应的,/Zpn表示以n字节边界对齐。n字节边界对齐的意思是说,一个成员的地址必须安排在成员的尺寸的整数倍地址上或者是n的整数倍地址上,取它们中的最小值。也就是:&&& min ( sizeof ( member ),& n)&&& 实际上,1字节边界对齐也就表示了结构成员之间没有空洞。&&& /Zpn选项是应用于整个工程的,影响所有的参与编译的结构。&&& 要使用这个选项,可以在vc6中打开工程属性页,c/c++页,选择Code Generation分类,在Struct member alignment可以选择。&&& 要专门针对某些结构定义使用对齐选项,可以使用#pragma pack编译指令。指令语法如下:#pragma pack( [ show ] | [ push | pop ] [, identifier ] , n& )&&& 意义和/Zpn选项相同。比如:#pragma pack(1)struct foo_pack{&&& char c1;&&&&&& char c2;&&&};#pragma pack()栈内存对齐&&& 我们可以观察到,在vc6中栈的对齐方式不受结构成员对齐选项的影响。(本来就是两码事)。它总是保持对齐,而且对齐在4字节边界上。验证代码#include &stdio.h&struct foo{&&& char c1;&&&&&& char c2;&&&};struct bar{&&& char c1;&&&& char c2;&&&&&&};#pragma pack(1)struct foo_pack{&&& char c1;&&&&&& char c2;&&&};#pragma pack()int main(int argc, char* argv[]){&&& char c1;&&&&&& char c2;&&&&&&&&&&&& struct foo_&&& printf(&stack c1 %p, s %p, c2 %p, i %p/n&,&&&&&&& (unsigned int)(void*)&c1 - (unsigned int)(void*)&i,&&&&&&& (unsigned int)(void*)&s - (unsigned int)(void*)&i,&&&&&&& (unsigned int)(void*)&c2 - (unsigned int)(void*)&i,&&&&&&& (unsigned int)(void*)&i - (unsigned int)(void*)&i);&&& printf(&struct foo c1 %p, s %p, c2 %p, i %p/n&,&&&&&&& (unsigned int)(void*)&a.c1 - (unsigned int)(void*)&a,&&&&&&& (unsigned int)(void*)&a.s - (unsigned int)(void*)&a,&&&&&&& (unsigned int)(void*)&a.c2 - (unsigned int)(void*)&a,&&&&&&& (unsigned int)(void*)&a.i - (unsigned int)(void*)&a);&&& printf(&struct bar c1 %p, c2 %p, s %p, i %p/n&,&&&&&&& (unsigned int)(void*)&b.c1 - (unsigned int)(void*)&b,&&&&&&& (unsigned int)(void*)&b.c2 - (unsigned int)(void*)&b,&&&&&&& (unsigned int)(void*)&b.s - (unsigned int)(void*)&b,&&&&&&& (unsigned int)(void*)&b.i - (unsigned int)(void*)&b);&&& printf(&struct foo_pack c1 %p, s %p, c2 %p, i %p/n&,&&&&&&& (unsigned int)(void*)&p.c1 - (unsigned int)(void*)&p,&&&&&&& (unsigned int)(void*)&p.s - (unsigned int)(void*)&p,&&&&&&& (unsigned int)(void*)&p.c2 - (unsigned int)(void*)&p,&&&&&&& (unsigned int)(void*)&p.i - (unsigned int)(void*)&p);&&& printf(&sizeof foo is %d/n&, sizeof(foo));&&& printf(&sizeof bar is %d/n&, sizeof(bar));&&& printf(&sizeof foo_pack is %d/n&, sizeof(foo_pack));&&&&&&& return 0;}c语言程序设计(cscxyjsj) 
 文章为作者独立观点,不代表微头条立场
的最新文章
问题:为什么使用指针比使用对象本身更好?  我是一名Java程序员,最近开始学习使用C++中的对象。有个问题观点提出:c语言程序真的很不安全我的观点——当时和现在——都是C语言不适合用来写安全性要求高的程序,任何缺乏语言之间是不平等的。  近年来,谷歌一直致力于开发出自己的编程语言以取代当今世上最常用的C、C++和Java关于C语言中指针和数组的争论就像是一场恶战。一方面,有些人觉得,所有人都必须承认指针与数组是不同的。而另一些C语言总结:1、数组做参数时,一维的[]里可以是空的,二维的第一个[]里可以是空的但是第二个[]中必须规定大欢迎点击上方蓝色字体关注我们
总体上必须清楚的:  1)程序结构是三种: 顺序结构 , 循环结构(三个循环C语言中的指针和内存泄漏前言
对于任何使用 C 语言的人,如果问他们 C 语言的最大烦恼是什么,其中C语言各种各样排序方法C语言各种各样排序方法#include //1.冒泡排序法void预测下面程序的输出// PROGRAM 1#include int main(void){#includeint main(){ int a=10;//变量的声明 int b=5;#include #include #include <stdlib.学生成绩统计(结构体)【问题描述】用结构数组实现学生成绩统计各功能。某班有N(N<=30)个学生,共开设5门这篇文章是写给从来没有接触过黑客入侵的朋友看的,如果你不是新手,就不要看我的文章了,因为我本人也是菜鸟.耽误龙舟一盏,乘八方幸福之风,破四海好运之浪;龙粽一串 ,连四季幸福滋味,裹一年健康希望。端午节来临之际,掌中璧C语言内存分配问题1、C中内存分为四个区栈:用来存放函数的形参和函数内的局部变量。由编译器分配空间,在函数执迷宫求解一、迷宫分析
这次的大作业是解决迷宫求解的问题,从入口出发,顺某一方向向前探索,若能走操作步骤:目的:限制输入开机密码的次数,锁定计算机,保护计算机安全。步骤:1、开始---运行(输入gpedi作为世界最牛逼黑客之一,Linus Torvalds的特立独行就跟他的软件Linux一样受人瞩目,那你想知道首先声明这里说的是C语言中的堆与栈,并不是数据结构中的!一、前言介绍:C语言程序经过编译连接后形成编译、连接一、初始化与赋值的含义:
初始化:包括创建(或说定义)对象并且赋给初值。(如果一个对象只被创建而没有被命名命名,包括文件名、类名、结构名、类型名、函数名、变量名、参数名等都是程序设计中重要的一部分。一个好的名称题目描述:对于一个字节(8bit)的无符号整形变量,求二进制表示中“1”的个数,要求算法执行效率尽可能地高。在网上看到这个消息,小盟也是大吃一惊!Google 和搜狗真的打算要联手了?事情大概是这样的:搜狗某内部职工闪电战”编程课程西雅图的“代码伙伴”(Code Fellows)学校,就非常确信他们能够帮助学生找到工作。他C语言中有几个基本输入函数://获取字符系列int fgetc(FILE *stream);int getccscxyjsj主要教你学完c语言和c++后也能高大上的写出有逼格的,装逼的程序来。c语言和c++也能干大事,还提供c/c++的笔试,面试题,让你超越99%的程序员,从而找到好的工作。热门文章最新文章cscxyjsj主要教你学完c语言和c++后也能高大上的写出有逼格的,装逼的程序来。c语言和c++也能干大事,还提供c/c++的笔试,面试题,让你超越99%的程序员,从而找到好的工作。c语言strcmp的问题
[问题点数:70分,结帖人hygf99]
c语言strcmp的问题
[问题点数:70分,结帖人hygf99]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
本帖子已过去太久远了,不再提供回复功能。最近更新 标题热度
推荐阅读 标题热度
植物趣闻 标题热度c语言问题_百度知道}

我要回帖

更多关于 c语言面试题 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信