用作errno的本地变量地址 #包括 结构a { 无效*ptr; 无符号长val; }; void main() { 无符号字符错误号; 结构a*id; id=malloc(sizeof(*id)); 职能2(id); printf(“更改%d\n”后,id->val); } void func2(结构a*id) { 无符号字符错误号; func(id和errno); } void func(结构a*id,void*ptr) { memset(id,0,sizeof(*id)); id->ptr=ptr; 如果(sizeof(id->val)>=sizeof(id->ptr)) { id->val=(无符号长)id->ptr; 返回; } }

用作errno的本地变量地址 #包括 结构a { 无效*ptr; 无符号长val; }; void main() { 无符号字符错误号; 结构a*id; id=malloc(sizeof(*id)); 职能2(id); printf(“更改%d\n”后,id->val); } void func2(结构a*id) { 无符号字符错误号; func(id和errno); } void func(结构a*id,void*ptr) { memset(id,0,sizeof(*id)); id->ptr=ptr; 如果(sizeof(id->val)>=sizeof(id->ptr)) { id->val=(无符号长)id->ptr; 返回; } },c,memory,malloc,local-variables,C,Memory,Malloc,Local Variables,当我在主功能中打印id->val时,它正在打印-1075050593 . 但我试图访问一个无效地址。请解释一下。我对c编程非常陌生。下面的语句不是试图访问无效地址,它只是打印地址: #include<stdio.h> struct a { void *ptr; unsigned long val; }; void main() { unsigned char errno; struct a *id; id = malloc(sizeof(

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

下面的语句不是试图访问无效地址,它只是打印地址:

#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
被错误地传递到
func2()
,它将保留的值未知

代码存在一些问题(注释中已经提到了一些问题):

  • 当传递到
    func2()
    作为
    id
    时,错误地将
    id
    的地址作为
    结构a*
  • memset()
    malloc()
    作为缺少的include指令的隐式声明
  • func()和
    func2()的隐式声明
  • main()
    的返回类型应为
    int
通常,什么是“访问无效地址”?它由两部分组成。 1、访问:包括读/写/执行。 2、无效地址:内核空间和非malloced堆是用户应用程序的无效地址

在本例中,地址(&errno)属于堆栈,因此它不是无效地址。并且您不读取/写入/执行此地址中的内容。因此,您没有访问无效地址


顺便说一句,在printf()调用中使用“%d”占位符,“id->val”将被解释为带符号的int类型,这就是为什么会得到负值。请使用“%p”表示指针,使用“%u”表示未签名整数。

此外,还应打开编译器警告消息。你会发现这段代码编译起来并不干净。您应该首先修复所有编译问题,然后询问是否仍不能按预期工作。可能重复
func2(&id)有一个和太多的符号。main()应该返回int.sigh。注意
errno
在C的上下文中有固定的含义。您是否尝试过在
func2()中打印
errno
的值。它可能被初始化为0,然后0被分配到
func()
中的
id->val
。我进行了编辑而不是结构的地址,只应传递指针。printf(“更改%d\n”后,id->val);它试图打印一个无效的地址。@dutchy,它只是打印地址值,而不是试图访问它,这是正常的。如果我尝试访问*id->val,会出现什么行为?
printf("After changing %d\n", id->val);