C 局部变量的地址分配给结构中的成员指针

C 局部变量的地址分配给结构中的成员指针,c,pointers,structure,local-variables,variable-address,C,Pointers,Structure,Local Variables,Variable Address,将局部变量赋值给成员结构指针。最后使其为空。当尝试访问它时,它不是给空指针,而是给0。因为a1->val指向无效地址(19很少是有效地址),所以您调用的是未定义的行为,任何结果都是可以接受的(包括内核转储或其他崩溃) 即使您的功能: struct a { int *val; }; void main(){ int n; struct a *a1; a1= malloc(sizeof(a1)); n=10; a1->val = &

将局部变量赋值给成员结构指针。最后使其为空。当尝试访问它时,它不是给空指针,而是给0。

因为
a1->val
指向无效地址(19很少是有效地址),所以您调用的是未定义的行为,任何结果都是可以接受的(包括内核转储或其他崩溃)

即使您的功能:

struct a {
    int *val;
};

void main(){
    int n;
    struct a *a1;
    a1= malloc(sizeof(a1));

    n=10;

    a1->val = &n;

    func(a1);


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

}

void func(struct a *a2){
    int a = 5;
    a2->val = &a;
    a2->val = 0 ;
}

当函数返回时,指针将指向不再有效的整数。一旦函数终止,取消引用指针就不再安全;您可以安全地为它指定一个新的指针值;您可以将指针与另一个指针或NULL(受某些约束)进行比较;但这就是全部。

不要使用
void main()
,除非你喜欢因为这样做而被叫喊。
NULL
从技术上讲是
0
。另外,在您的示例中,您没有将指针设置为
NULL
,而是设置为
19
应导致编译时错误。你应该发布你真正想知道的代码。看起来你的问题实际上只是关于在变量的生存期结束后试图通过指针访问变量的未定义行为;你的问题是什么?在整个活动期间都可以;函数返回后,它就不正常。总的来说,最好避免整个问题。但是,如果必须,则设置
a2->val=0比让它指向被调用函数中的局部变量更干净。最好还是将值重置为输入时的值,但是在这种情况下,为什么还要费心传递结构呢。考虑到这几乎是最小的代码,我们看不到您所做的工作的合理性。这是一个常规,尽管并非完全错误。不过,这很容易导致错误。所以安全的行为是在退出之前使a2->val为空。
*a2->val = 19;