#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 %dn", 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编程很陌生。
通常,什么是"访问无效地址"?它由两部分组成。1、访问:包括读/写/执行。2、无效地址:内核空间和未错位堆是用户应用的无效地址。
在这种情况下,地址(&errno(属于堆栈,因此它不是无效地址。并且您不会读取/写入/执行此地址中的内容。因此,您没有访问无效地址。
顺便说一句,在 printf(( 调用中使用"%d"占位符,"id->val" 将被解释为有符号的 int 类型,这就是你得到负值的原因。请使用"%p"表示指针,使用"%u"表示无符号整数。
以下语句不是尝试访问无效地址,它只是打印地址:
printf("After changing %dn", id->val);
它将持有什么值是未知的,因为id
被错误地传递给func2()
。
代码的一些问题(一些已经在注释中提到(:
- 当传递给
func2()
时,错误地获取id
地址,因为id
已经是一个struct a*
memset()
和malloc()
缺失的隐式声明包含指令func()
和func2()
的隐含声明- 应
int
返回main()
的类型