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