在应用memset之后,struct变量没有被设置为0



我想知道,以下项目的值是如何打印的。因为我用memset把结构变量1设为0。但是这个变量是在mainst中赋值的。Subst使用init()方法。

printf (" n % d",mainst.subst.t1);printf (" n % d",mainst.subst.t2);

请告诉我为什么这样印。

源代码:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct one *oneptr;
struct one
{
        char t1;
        char t2;
        char *path;
};
typedef struct one one_st;
struct char_ar
{
        int a;
        char b;
        one_st subst;
}mainst;
void init(oneptr cp)
{
        mainst.a=10;
        mainst.b='u';
        mainst.subst=*cp;
}
void main()
{
        oneptr ptr;
        struct one o;
        o.t1='t';
        o.t2='u';
        o.path = malloc(10);
        strcpy(o.path,"HI");
        init( &o);
        ptr = &o;
        free(ptr->path);
        ptr->path=(char *)NULL;
        memset ((char *)ptr, 0, sizeof(one_st));
        printf("n %d",mainst.subst.t1);
        printf("n %d",mainst.subst.t2);
        printf("n %s",mainst.subst.path);
}

您在o上调用memset,这是一个堆栈分配结构。但是您正在打印mainst的内容,这是您的数据段中的不同值。因此,对memset的调用对您的程序没有影响。

当你执行mainst.subst=*cp;时,它将mainst.subst.path设置为指向与ptr->path相同的位置,即malloc'd所在的块。所以你有一个内存块,两个指针指向它。

但是你有:

free(ptr->path);
// ...
printf("n %s",mainst.subst.path);

ptr->pathmainst.subst.path都指向通过malloc分配的同一个块。释放该块,然后将该块的地址传递给printf。使用已释放块的地址会导致未定义的行为。


注意,您的memset甚至没有尝试写入被释放的块。你擦遍了o,但这对o的成员所指向的内存没有影响,因为你没有跟踪指针。

也许你想做的是:

ptr = &o;
memset(ptr->path, 0, 10);
free(ptr->path);

然而,它仍然会导致使用mainst.subst.path的未定义行为,因为它仍然指向一个被释放的块。

最新更新