应用memset后,结构变量未设置为0

时间:2015-08-18 07:04:30

标签: c

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

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);

}

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

执行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。使用释放块的地址会导致undefined behaviour

请注意,您的memset甚至没有尝试写入已释放的块。你擦除了o,但这对o成员指向的内存没有影响,因为你没有按照指针。

也许你的意思是:

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

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