#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编程的新手。
答案 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}}