用作errno的局部变量地址

时间:2012-07-12 11:31:43

标签: c memory malloc local-variables

#include<stdio.h>

struct a
{
    void *ptr;
    unsigned long val;
};

void main()
{
    unsigned char errno;

    struct a *id;
    id = malloc(sizeof(*id));
    func2(id);
    printf("After changing %d\n", id->val);
}


void func2(struct a *id)
{
    unsigned char errno;
    func(id,&errno);
}

void func(struct a *id,void *ptr)
{   
    memset(id, 0, sizeof(*id));

    id->ptr = ptr;
    if (sizeof(id->val) >= sizeof(id->ptr))
    {   
        id->val = (unsigned long)id->ptr;
        return;
    }

}

当我在main函数中打印id-&gt; val时,它正在打印-1075050593 。但我试图访问无效的地址。请解释。我是c编程的新手。

2 个答案:

答案 0 :(得分:1)

通常,什么是“访问无效地址”?它由两部分组成。 1,访问:它包括读/写/执行。 2,无效地址:内核空间和非malloced堆是用户应用程序的无效地址。

在这种情况下,地址(&amp; errno)属于堆栈,因此它不是无效的地址。并且您不会读取/写入/执行此地址中的内容。所以你没有访问无效地址。

顺便说一句,在printf()调用中使用“%d”占位符时,“id-&gt; val”将被解释为signed int类型,这就是为什么你得到一个负值。请将“%p”用于指针,将“%u”用于unsigned int。

答案 1 :(得分:0)

以下声明未尝试访问无效地址,只是打印地址

printf("After changing %d\n", id->val);
由于id被错误地传递给func2()

它将保留的值是未知的。

代码存在一些问题(评论中已经提到过一些问题):

  • id传递func2()id的地址错误,struct a*memset()
  • malloc()func()的隐式声明,其中包含指令
  • func2()main()
  • 的隐式声明
  • int的返回类型应为{{1}}