-2
#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;
    }

}

当我在主要功能中打印 id->val 时,它正在打印 -1075050593 。但我试图访问一个无效的地址。请解释。我对c编程很陌生。

4

2 回答 2

1

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

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

顺便说一句,在 printf() 调用中使用“%d”占位符,“id->val”将被解释为带符号的 int 类型,这就是你得到负值的原因。请使用“%p”作为指针,使用“%u”作为无符号整数。

于 2012-07-12T14:50:41.057 回答
0

以下语句不尝试访问无效地址,它只是打印地址

printf("After changing %d\n", id->val);

它将持有什么值是未知的,因为id它被错误地传递给func2().

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

  • id传递给时错误地取地址func2()asid已经是struct a*
  • memset()malloc()as的隐式声明包含指令
  • func()和的隐式声明func2()
  • 返回类型main()应该是int
于 2012-07-12T11:40:49.223 回答