我想知道,以下项目的值是如何打印的。因为我用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->path
和mainst.subst.path
都指向通过malloc
分配的同一个块。释放该块,然后将该块的地址传递给printf
。使用已释放块的地址会导致未定义的行为。
注意,您的memset
甚至没有尝试写入被释放的块。你擦遍了o
,但这对o
的成员所指向的内存没有影响,因为你没有跟踪指针。
也许你想做的是:
ptr = &o;
memset(ptr->path, 0, 10);
free(ptr->path);
然而,它仍然会导致使用mainst.subst.path
的未定义行为,因为它仍然指向一个被释放的块。