#include “iostream”
#include “stdio.h”
using namespace std;
class student
{
public:
char *name[2][1];
void Rename(char * (*myname)[1]);
};
char *p[2];
void student::Rename(char * (*myname)[1])
{
char string[] = “ba,ba,d”;
const char *spilt = “,”;
char *ptr = string;
int n = 0;
char * outer_ptr;
while((p[n] = strtok_s(ptr,spilt,&outer_ptr)) != NULL)
{
cout<<p[n]<<endl;
n++;
ptr = NULL;
}
myname[0][0] = p[0];
myname[1][0] = p[1];
outer_ptr = NULL;
}
void main()
{
student mstudent;
mstudent.Rename(mstudent.name);
cout<<mstudent.name[0][0]<<endl<<mstudent.name[1][0]; //为什么mstudent.name[0][0]不等于p[0]的值,假如是原因是指针作形参是拷贝传递,为什么mstudent.name[1][0]的值又改变了?
getchar();
}
运行的结果为
#include “stdio.h”
using namespace std;
class student
{
public:
char *name[2][1];
void Rename(char * (*myname)[1]);
};
char *p[2];
void student::Rename(char * (*myname)[1])
{
char string[] = “ba,ba,d”;
const char *spilt = “,”;
char *ptr = string;
int n = 0;
char * outer_ptr;
while((p[n] = strtok_s(ptr,spilt,&outer_ptr)) != NULL)
{
cout<<p[n]<<endl;
n++;
ptr = NULL;
}
myname[0][0] = p[0];
myname[1][0] = p[1];
outer_ptr = NULL;
}
void main()
{
student mstudent;
mstudent.Rename(mstudent.name);
cout<<mstudent.name[0][0]<<endl<<mstudent.name[1][0]; //为什么mstudent.name[0][0]不等于p[0]的值,假如是原因是指针作形参是拷贝传递,为什么mstudent.name[1][0]的值又改变了?
getchar();
}
运行的结果为
解决方案
15
你的参数传递没有问题,但是你的函数里面的这一行有问题:
char string[] = "ba,ba,d";
这是一个函数本地变量,函数返回以后,它的空间被回收了,变得无效了。那么name[0][0]和name[1][0]指向的内容就无效了。所以你得不到正确的结果。
假如你改写成这样,就可以了:
static char string[] = "ba,ba,d";
这样系统在函数返回就不会回收空间。
5
取决于用的什么编译器。有的可以看到无效的指针,有的不能,还取决于调试器。但是把本地变量的指针赋给类成员变量是行不通的,学习了就好了。