堆栈-一段奇怪的代码,求解释

问题描述

一段奇怪的代码,求解释
代码的意思是说,在声明的时候,因为栈的分配原因(先入后出),k[10]就是i的地址。然后i就会被修改成0,循环再次开始,就这样出现了一个死循环。
为什么k[10]就是i的地址呢?

 int m=1;    int i =0;    int k[10] = {0};    printf(""&m=%dn""&m);    printf(""&i=%dn""&i);    printf(""&k[0]=%dn""&k[0]);    printf(""&k[9]=%dn""&k[9]);    printf(""&k[10]=%dn""&k[10]);    for(;i <= 10; ++i)    {        k[i] = 0;    }    printf(""HelloWorld!n"");

解决方案

之前关于数据对齐你可以忽略。编译器果然是多为数组预留了2个int的空余,估计还是为了防止数组越界(通常越界1~2个元素的可能性最大)。

解决方案二:
k[10]就是i的地址?这样每次循环到i=10时,i的值就会被修改,肯定就死循环了

解决方案三:
int k[10] = {0};
这个k应该在常量区,不在堆栈上。

而且不同编译器是不同的。
你说的死循环不知道是什么编译器。

解决方案四:
这是在我的VC++2013上
&m=4913620
&i=4913608
&k[0]=4913560
&k[1]=4913564
&k[2]=4913568
HelloWorld!
Press any key to continue . . .
你可以看到根本两个地址相差很远。

而且这么做会触发内存访问违例。

解决方案五:
这个k应该在常量区,不在堆栈上。
这个说的不对
是这样的,k在堆栈上没有错。
但是为了防止越界,我的编译器(你的不一定)为这个数组多分配了一些空间。

解决方案六:
经过测试,要想在我的机器上构成死循环,必须这么写

 #include <stdio.h>int main(){    int m = 1;    int i = 0;    int k[10] = { 0 };    printf(""&m=%dn"" &m);    printf(""&i=%dn"" &i);    printf(""&k[12]=%dn"" &k[12]);    for (; i <= 10; ++i)    {        k[12] = 0;    }    printf(""HelloWorld!n"");}

解决方案七:
为什么是12呢?我猜想是因为代码对齐的需要。
在32bit处理器上,通过总线一次性能读取4个字节的数据,所以内存分配都是按照4个字节对齐的。

解决方案八:
因为在内存中k[10]后面就是i,而数组访问越界(只能访问k[9]k[10]已经越界),k[10]就是i,修改了i的值

时间: 2024-08-04 03:35:44

堆栈-一段奇怪的代码,求解释的相关文章

java代码-初学者,这段奇怪的代码啥意思啊,谢谢啦!

问题描述 初学者,这段奇怪的代码啥意思啊,谢谢啦! <script> var temp_num = null; var now_num = null; var the_top = 159; //表单的最高,最低 var the_bottom = 178 var no_can_do = false; function Show_menu(u_num,d_num) { event.srcElement.className = "out2"; if(no_can_do) { re

unix-巨难的C,一行代码求解释,详细点,注意这是C,不是C++

问题描述 巨难的C,一行代码求解释,详细点,注意这是C,不是C++ extern "C++" wchar_t *wcschr (wchar_t *__wcs, wchar_t wc) __THROW __asm ("wcschr") __attribute_pure; 解决方案 优化 c c++ 代码 参考点 解决方案二: 第一行,导入一个函数指针,第二行,优化这个函数的执行. 解决方案三: wchar_t *wcschr (wchar_t *__wcs, wcha

acm-浙大ACM1002,已有代码求解释关键部分

问题描述 浙大ACM1002,已有代码求解释关键部分 该题目链接 即DFS函数里,53,54行的作用,为什么重置为0,并使碉堡数目减一? 解决方案 53.54行,是初始化visit

spring3.1aop,用到AnnotationAwareAspectJAutoProxyCreator奇怪问题,求解释

问题描述 我这里做了一个简单的基于注解驱动的demo,想学习aop,遇到一个奇怪问题,为什么我加了AnnotationAwareAspectJAutoProxyCreator以后,advice就执行了2次,不加就正常的执行了一次,请看代码:这个是最基本的一个Servicepackage com.demo;import org.springframework.stereotype.Service;@Servicepublic class UserService {public void add()

whitespace-这段代码什么意思求解释

问题描述 这段代码什么意思求解释 #include #include #include #include //Constants #define LINELENGTH 100 // Function prototypes void reverse_words(char* words[], char* rwords[], int count); void print_words(char* words[]); int mark_words(char* line, char* words[]); /

孙鑫-Visual C++的一段代码搞不懂求解释

问题描述 Visual C++的一段代码搞不懂求解释 说一下自己的理解.题目是孙鑫老是的文本输出的例子. 1:GetBkColor得到背景白色,然后SetTextColor(白色)把背景白色设置为文字颜色.跟着clr应该是赋值得到白色了吧,但是F5看的时候是黑色,就要原文字颜色.我这么理解应该错了 1 COLORREF clr=dc.SetTextColor(dc.GetBkColor()); //GetBkColor属于dc对象,改变dc中的背景值(白色).然后SetTextColor用白色值

ancy orm-用FancyForm添加用户角色,求解释这段代码,

问题描述 用FancyForm添加用户角色,求解释这段代码, var form = $('#form').FancyForm({ title: '添加角色' width: 345 height: 325 inputWidth: 190 labelWidth: 60 url: '<%=path %>/sysRoleController/addRole.do' params: { param1: 1 param2:'string' } defaults: { type: 'string' } it

ip地址-求解释下这段代码...感激不尽

问题描述 求解释下这段代码...感激不尽 u_long ulDestIP; u_long ulDestIP1=inet_addr(a); u_long ulDestIP2=inet_addr(b); unsigned long count = ntohl(ulDestIP2 - ulDestIP1)-1; struct in_addr in; unsigned long hostip; for(unsigned int i = 0; i <=count+1; i++) { hostip = nt

java web-这段代码看不懂啊,求解释

问题描述 这段代码看不懂啊,求解释 /s:iterator /s:iterator/sx:treenode/s:iterator </sx:treenode> </s:iterator> </sx:treenode> </s:iterator> 解决方案 <sx:tree label="%{#request.project.projectName}" id="parentId" > //项目名 <s: