C语言问题一则

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

C语言问题一则

摘自: huangyaoshifog的专栏 http://blog.csdn.net/huangyaoshifog

首先,来看如下一段程序
char* xyzstring = "hello,world!";
int main(void)
{
 xyzstring[0] = 'a';
 printf("%s/n",xyzstring);
 return 0;
}

这段程序有问题吗?有,xyzstring的数据应该是静态数据,不能被修改。对,C语言的标准上也是这样说的。

果然是这样吗,我们做一个测试,使用四种编译器来看看实际运行的情况。

Codewarrior 8.0、Visual C++ 6.0、Borland C++ 5.6编译后运行都没有问题,都打出了"aello,world!",GCC 3.2编译后运行程序死掉。

为什么会出现这种情况,答案很简单,GCC将"hello,world!"放到了.text段中,而其它三种编译器则是将"hello,world!"到了.data段中。程序中,.text段是用来存放代码的,因此不能被修改,所以,当我们用xyzstring[0]来修改其中内容的时候,程序当然会当掉了。而.data段因为是数据段,是可以被修改的,因此程序不会当掉。

下面为了验证以上说法,我们使用GCC将源代码汇编成test.s

运行如下命令gcc -S test.c
 .file "test.c"
.globl _xyzstring

 .text
LC0:
 .ascii "hello,world!/0"
 .data
 .align 4
_xyzstring:
 .long LC0
 .def ___main; .scl 2; .type 32; .endef
 .text
LC1:
 .ascii "%s/12/0"
 .align 2
.globl _main
 .def _main; .scl 2; .type 32; .endef
_main:
 pushl %ebp
 movl %esp, %ebp
 subl $8, %esp
 andl $-16, %esp
 movl $0, %eax
 movl %eax, -4(%ebp)
 movl -4(%ebp), %eax
 call __alloca
 call ___main
 movl _xyzstring, %eax
 movb $97, (%eax)
 subl $8, %esp
 pushl _xyzstring
 pushl $LC1
 call _printf
 addl $16, %esp
 movl $0, %eax
 leave
 ret
 .def _printf; .scl 2; .type 32; .endef

以上是输出结果,我们看到test.s的头两行是
.globl _xyzstring
.text

说明_xyzstring是定义在了.text段中,现在,我们将其改称如下
.globl _xyzstring
.data

然后编译gcc -o test.exe test.s,接着执行test.exe,出现了什么,哈哈"aello,world!",执行没有问题了。

以上就是不同编译器对这种类型代码的解决方法,但是为了兼容,我们绝对不应该写出上面的代码。

C语言求解迷宫问题 迷宫问题求解 https://www.nowcoder.com/questionTerminal/cf24906056f4488c9ddb132f317e03bc 以上迷宫OJ题曾经是百度某一年的其中一个笔试题, 迷宫问题本质就是一个图的遍历问题,从起点开始不断四个方向探索,直到走到出口, 走的过程中我们借助栈记录走过路径的坐标,栈记录坐标有两方面的作用, 一方面是记录走过的路径,一方面方便走到死路时进行回溯找其他的通路。 输入两个整数,分别表示二维数组的行数,列数。 再输入相应的数组,其中的1表示墙壁, 阅读详情

相关推荐

C语言——迷宫问题

迷宫问题本质上本质上是对数组的一个遍历,向上下左右四个方向进行遍历。当上下左右四个方向都无法行动时,将路径进行回溯,找到另一个可以行动的方向,直到找到出口。

2301_80185370的博客 5083

C语言中比较常见的问题的汇总

C语言常见问题汇总 1、在不开辟新的内存空间的情况下,如何交换a,b两个变量中的值? void swap1(int &a,int &b) { a = a + b; b = a - b; a = a - b; } void swap2(int &a,int &b) { a = a * b; b = a / b; a = a / b; } 前两种方法是采用一种简单的加减法、乘除法算法来达到交换两个值的目的。 这种方法的缺点是做加法、减法、乘法的时候可能会导致数据溢出。 void

Perrysky的博客 3565

迷宫问题 C语言实现

若当前位置“可通“,则纳入”当前路径”,并继续朝“下一个位置探索”,即切换“下一位置”为“当前位置”,如此重复直至到达出口;若当前位置“不可通”则应顺着“来向”退回到“前一通道块”,然后朝着除“来向”之外的其他方向继续探索;若该通道块的四周4个方块均“不可通”,则应从“当前路径”上删除该通道块。假设以栈S记录“当前路径”,则栈顶中存放的是“当前路径上最后一个通道块”。在迷宫的某一位置的下一个位置可能在其的几个方向上(最多四个)如果迷宫中存在入口到出口的通道,求的一条放入栈S中。将不能通过的位置设置为-1。

m0_75008697的博客 7343

关于句柄的概念

1 句柄是一种特殊的智能指针 。当一个应用程序要引用其他系统(如数据库、操作系统)所管理的内存块或对象时,就要使用句柄。 2 句柄与普通指针的区别在于,指针包含的是引用对象的内存地址,而句柄则是由系统所管理的引用标识,该标识可以被系统重新定位到一个内存地址上。这种间接访问对象的模式增强了系统对引用对象的控制。

amumu_123的博客 1200

C语言常见问题

C语言常见问题

lijunlin0329的博客 4411

C语言---常见问题汇总(适合新手学习、高手自查)

本节为C语言学习中碰到的一些常见、简单但又很令人困惑的问题,适合为新手学习,适合高手自查。

m0_56399733的博客 4506

22个C语言小白常见问题总结

C/C++常见问题总结,初学者必看!

C语言实战大全 2500

你必须知道的495个C语言问题

你必须知道的495个C语言问题 【下载地址】你必须知道的495个C语言问题分享 “你必须知道的495个C语言问题.pdf”是Summit以及C FAQ在线列表的许多参与者多年心血的结晶,是C语言界最为珍贵的财富之一。本书不仅清晰阐明了Kernighan与Ritchie《The C programming Language...

gitblog_09706的博客 1002

【C语言】迷宫问题

建立两个栈,使得打印的顺序是正确的怎么找路径,标记已经走过的坐标栈的应用递归回溯算法!

weixin_74999790的博客 1365

C语言迷宫问题大全,c语言实现迷宫问题

《c语言实现迷宫问题》由会员分享,可在线阅读,更多相关《c语言实现迷宫问题(21页珍藏版)》请在人人文库网上搜索。1、数据结构试验迷宫问题(一)基本问题1.问题描述这是心理学中的一个经典问题。心理学家把一只老鼠从一个无顶盖的大盒子的入口处放入,让老鼠自行找到出口出来。迷宫中设置很多障碍阻止老鼠前行,迷宫唯一的出口处放有一块奶酪,吸引老鼠找到出口。简而言之,迷宫问题是解决从布置了许多障碍的通道中寻找...

weixin_39609407的博客 1924

C语言的开灯问题

C语言的开灯问题题目思路实现代码多括号版(简单明了)少括号版(好看装逼) 题目 N 盏灯排成一排,从 1 到 N 依次编号。有 N 个人也从 1 到 N 依次编号。第一个人(1 号)将灯全部打开,第二个人(2 号)将凡是 2 和 2 的倍数的灯关闭。第三个人(3号)将凡是 3 和 3 的倍数的灯做相反处理(即将打开的灯关闭,关闭的灯打开),以后的人都和 3 号一样,将凡是与自己编号相同的灯和是自己编号倍数的灯做相反处理,请问当第 N个人操作之后,哪几盏灯是点亮的?试编程求解这个问题, N 由键盘输入。 思路

GHost_7的博客 6256

回溯算法——装载问题C语言

回溯算法——装载问题C语言 求解思路 输入: W = <w1+w2+···+wn>为集装箱重量c1和c2为船的最大载重量 算法思想 令第一艘船的装入量为W1。 用回溯算法求使得 c1-W1 达到最小的装载方案,即尽可能的使第一艘船装的更多; 若满足 w1+w2+···+wn -W1≤c2 则有解 ,否则无解; 若有解,其解的形式表示为一维向量x[n],x[i]==1表示第i个集...

weixin_42159412的博客 5958

用C语言程序编码小偷问题,C语言谁是窃贼问题代码及解析

原标题:C语言谁是窃贼问题代码及解析问题描述警察审问4名窃贼嫌疑犯。现在已知,这4人当中仅有一名是窃贼,还知道这4个人中的每个人要么是诚实的,要么总是说谎。这4个人给警察的回答如下。甲说:“乙没有偷,是丁偷的。”乙说:“我没有偷,是丙偷的。”丙说:“甲没有偷,是乙偷的。”丁说:“我没有偷。”请根据这4个人的回答判断谁是窃贼。问题分析显然该题是一个逻辑推断问题。已知4个人中的每个人要么是诚实的,要么...

weixin_42570769的博客 2176

【C语言】百鸡问题

相信在做这个问题的大家肯定是刚刚步入大一的新生,你们或许正在被C语言困扰,希望这些博客可以帮助到你们,作为一个曾经也被C困扰的过来人,上课听不懂是常态,希望大家不要焦虑不要迷茫,不会写不知道怎么下手是一件再正常不过的事情,当你看的越来越多,做的越来越多,你的代码能力一定会有很大的提升的!!!博主将持续更新有关C语言的基础题目,java的基础练习,以及数据结构的内容,有需要的可以关注一下。

weixin_75071792的博客 7384

汉诺塔问题的c语言实现

基于C语言的 汉诺塔问题的实现。 目录基于C语言的 汉诺塔问题的实现。汉诺塔问题简介问题解决方案代码的实现 (C) 汉诺塔问题简介 相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如下图)。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上 问题解决方案 最常

Neneolia的博客 4348

C语言迷宫问题

主要思路: 用一个包含坐标和方向的结点数据类型来存储迷宫中的结点; 用一个路径栈来实现通路的探测以及路径的回溯; 关键: 要注意迷宫边界点方向探测的条件限定,否则会产生不可预测的结果。 /*----------------------------------------------- 功能:迷宫问题,寻找一条简单通路(无重复路径) 输出示例: The path from (0, 0) to (...

田野麦子 2462

【C语言程序】鸡兔同笼问题

嗨~大家好,这里是可莉!今天给大家带来的程序是鸡兔同笼问题。 废话不多说,直接上代码!!

qq_45069481的博客 9万+

【C语言】C语言的495个问题

C语言相对低级,其设计理念认为类型大小应该有具体实现来决定, 虽然这很容易出矛盾是的,但其实标准头文件中已经定义了int16_t和uint_32_t类型可以声明多次,但只能定义一次。一般在.c文件中定义,在.h文件·中声明,这样使用者只要引用了.h文件就拥有了声明。变量声明是函数声明是变量定义是int i = 0;函数定义是}尤其是把外部函数的声明放在.h中,而不是.c中,防止外部函数原型变化了,但.c文件中忘记更改导致错误的函数原型贻害无穷。

呆呆的猫的博客 2741

你必须知道的495个C语言问题PDF:深入掌握C语言的全面指南

你必须知道的495个C语言问题PDF:深入掌握C语言的全面指南 去发现同类优质开源项目:https://gitcode.com/ 项目核心功能/场景 集合495个C语言问题的详细解答,助力初学者和中级开发者深入学习C语言。 项目介绍 在C语言的海洋中航行,你是否经常感到迷茫?是否有无数疑问困扰着你?《你必须知道的495个C语言问题PDF》正是为你量身定制的全面指南。这个开源项目收集了495个常见和...

gitblog_06785的博客 386
上一篇: Windows下Openssl安装以及编程
下一篇: 札记-VC使用小技巧
hylaking
博客等级 码龄22年 82粉丝 105原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值