为什么堆栈结构地址在另一个函数中不受限制

时间:2014-05-29 12:57:06

标签: c function stack scope

问题已从更复杂的代码减少到这几行。 示例代码在没有amd64平台投诉的情况下运行,但dbx显示 一个无限的错误。 SPARC上发生无提示数据损坏,即 out.intnum和ip-> intnum的内容是不同的。 一旦结构" out"它就会消失。没有被采取 来自堆栈但来自静态内存。这对我来说是令人惊讶的,因为我会有 预计" out"的存储位置在执行期间仍然有效 功能"内部"。有人知道原因吗?

源文件stacker.h

#include <stdio.h>

struct stacker {
    char somebytes[8];
    int        intnum;
    unsigned char uc1;
    unsigned char uc2;
};

int inner(struct stacker *ip);
int outer(struct stacker *op);

源文件stacker.c

#include "./stacker.h"

int inner(struct stacker *ip)
{
    char bubble[4096];
    int i;

    i = ip->intnum;
    return(0);
}

int outer(struct stacker *op)
{
    char bubble[4096];
    struct stacker out;

    inner(&out);
    return(0);
}

源文件stacktest.c

#include "./stacker.h"

int main(int argc, char *argv[]) {
    struct stacker main_struct;

    outer(&main_struct);
    printf("done\n");
    return(0);
}

当在命令行上运行时,程序只需打印&#34; done&#34;。 在dbx中,以下消息显示问题:

(dbx) run
Running: stacktest 
(process id 4092)
RTC: Enabling Error Checking...
RTC: Running program...
Reading disasm.so
Read from out-of-bounded (rob):
Attempting to read 4 bytes at address 0xfffffd7fffdfeb94
    which is 4164 bytes above the current stack pointer
Variable is 'ip'
stopped in inner at line 8 in file "stacker.c"
(dbx) print ip
ip = 0xfffffd7fffdfeb8c

访问结构&#34; out&#34;通过指针ip in function&#34; inner&#34;应该是合法的。 初始化&#34;&#34;结构&#34;无论是通过memset还是成员方式 不会改变图片(经过测试)。

0 个答案:

没有答案