visual studio 指针操作含参数返回,指针返回时最好开辟空间。

 在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指针必须指向有效的内存地址,这时,你可以为它另外在堆上分配内存,或者指向另外一个字符串

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值