变量中的数据不一致
Inconsistent Data in variable
#include<iostream>
#include<conio.h>
using namespace std;
struct node
{
node *next;
node *prev;
node *fnext;
node *fprev;
int device_number;
int inode_number;
int ref_count;
bool locked;
};
node* Create(int inum,int dnum)
{
node A;
A.next=A.prev=A.fnext=A.fprev=NULL;
A.inode_number=inum;
A.device_number=dnum;
A.ref_count=0;
A.locked=false;
return &A;
}
class Sample
{
public:
Sample()
{
node*A= Create(0,0);
cout<<A->device_number<<A->inode_number;
Pass(A);
}
void Pass(node* A)
{
cout<<A->device_number<<A->inode_number;
}
};
int main()
{
Sample S;
getch();
return 0;
}
这是一个大程序的一小部分。这里的重点是我在函数 Pass for node * A 属性值中得到像 -868456546 这样的垃圾值,而在 Constructor 中使用全局函数 Create(int,int) 初始化节点 * A 后我得到正确的值,即 00。所以这应该不会发生,因为我将相同的指针传递给函数 Pass。这里有什么问题?
您正在返回局部变量的地址,这是未定义的行为:
node* Create(int inum,int dnum)
{
node A;
//...
return &A; // no good
}
当函数 returns 时,该地址不再指向 node
的有效实例,因为 A
是局部变量。
您应该动态分配一个新节点,但是您必须管理您的程序以确保您没有内存泄漏:
node* Create(int inum,int dnum)
{
node* A = new node;
//...
return A;
}
此外,您所有的 .
都将变为 ->
,因为 A
现在是一个指针。
#include<iostream>
#include<conio.h>
using namespace std;
struct node
{
node *next;
node *prev;
node *fnext;
node *fprev;
int device_number;
int inode_number;
int ref_count;
bool locked;
};
node* Create(int inum,int dnum)
{
node A;
A.next=A.prev=A.fnext=A.fprev=NULL;
A.inode_number=inum;
A.device_number=dnum;
A.ref_count=0;
A.locked=false;
return &A;
}
class Sample
{
public:
Sample()
{
node*A= Create(0,0);
cout<<A->device_number<<A->inode_number;
Pass(A);
}
void Pass(node* A)
{
cout<<A->device_number<<A->inode_number;
}
};
int main()
{
Sample S;
getch();
return 0;
}
这是一个大程序的一小部分。这里的重点是我在函数 Pass for node * A 属性值中得到像 -868456546 这样的垃圾值,而在 Constructor 中使用全局函数 Create(int,int) 初始化节点 * A 后我得到正确的值,即 00。所以这应该不会发生,因为我将相同的指针传递给函数 Pass。这里有什么问题?
您正在返回局部变量的地址,这是未定义的行为:
node* Create(int inum,int dnum)
{
node A;
//...
return &A; // no good
}
当函数 returns 时,该地址不再指向 node
的有效实例,因为 A
是局部变量。
您应该动态分配一个新节点,但是您必须管理您的程序以确保您没有内存泄漏:
node* Create(int inum,int dnum)
{
node* A = new node;
//...
return A;
}
此外,您所有的 .
都将变为 ->
,因为 A
现在是一个指针。