在c语言中,一般对指针的要求先定义后使用,跟普通的变量是一样的,但在使用时,最好先开辟空间,然后赋值。
我曾经在vs2008中遇到过这样的错误:
把一个CString类型的变量赋值给一个char*,然后由另一个函数调用该char*变量的返回值。大体过程是这样的:
char* fun1()
{
CString cstr = "D:\\1\\1.txt";
char* str1 = NULL;
str1 = (char*)(LPCTSTR) cstr; //cstr 是mfc中可以使用的比较方便的string类型
return str1;
}
void fun2(char* str)
{
str = fun1();
}
这个程序还是有很多错误的:
(1)定义char*时这样初始化为NULL,一般在程序里指针不操作了的时候才赋为NULL;
(2)char*指针没有开辟内存空间,定义的时候只是分配了大小为4个字节的变量的空间。变量返回的时候他的值会发生变化。因为只定义了指向,而没有分配内存,所以在返回指针的时候就会出现引用上的错误。
(3)总结:指针在定义的时候一定要分配内存空间,其实间接的起到了初始化的作用。应该这样写是没问题的:char* str1 = new char[128];这样就既达到了初始化目的,又分配了内存空间,在返回的时候不要忘了释放空间。而在其他函数调用的时候,也不会出错,因为内存空间里存放有指针指向的变量的值,我们可以对其储存的变量值进行引用和返回都是可以的了。
(4)把以上的程序重新修改了一下:
char* fun1()
{
CString cstr = "D:\\1\\1.txt";
char* str1 =new char[128];
strcpy(str1 ,(char*)(LPCTSTR) cstr); //cstr 是mfc中可以使用的比较方便的string类型
return str1;
}
void fun2(char* str)
{
strcpy(str ,fun1());
}
当然,在调用fun2的时候,对实参也要开辟空间,这样在传递参数的时候,会把变量值直接写入内存,方便操作。(3)这个是百度里找到的:若定义为char rp[100],编译器会在栈上为数组变量rp分配100字节的内存; 如果定义为char * rp, 编译器会在栈上为指针变量分配sizeof(char*)大小的内存,通常为4字节;如果要使rp有效,rp指针必须指向有效的内存地址,这时,你可以为它另外在堆上分配内存,或者指向另外一个字符串