如何安全传递字符串指针?

yangyunzhao 2009-05-04 12:30:38
我目前的程序
#include "stdafx.h"

void getString(char*& ptr)
{
printf(ptr);
ptr = "hellokkk";
}

int _tmain(int argc, _TCHAR* argv[])
{
char* x=0;
getString(x);
printf(x);
return 0;
}

这样做很有问题。我想做的就是在main函数里面定义一个c风格的字符串,然后在别的函数里面修改它,并且在main里面可以得到修改后的值。这个过程中,不能有内存泄漏等问题。
...全文
394 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
fengcman 2009-05-05
  • 打赏
  • 举报
回复
楼主代码的编写很有问题
你说要修改字符串,可你用指针指向的是静态存储区的值,这是修改不了的。
你的指针初始化指向0地址,又调用printf函数,系统压入指针指向的值,可那没值
void getString(char*& ptr)
这个函数就更不可思议了

解决方案就是,你要动态申请空间。
系统编程里有一种编程风格是,首先调用一次函数,获取要申请的空间大小,再调用一次来进行赋值操作
fairchild811 2009-05-05
  • 打赏
  • 举报
回复
不用先分配控件,给个char *ptr就可以了
Albertxi 2009-05-05
  • 打赏
  • 举报
回复

#include "stdafx.h"
#include <iostream>
using namespace std;
void getString(char*& ptr)
{
printf(ptr);
ptr = "hellokkk";
}

int _tmain(int argc, _TCHAR* argv[])
{
char* x=new char[20];
*x=0;
getString(x);
printf(x);
delete x;
return 0;
}
可以把char* x=0; 变成动态分配内存char* x=new char[20];这样就避免开始没有在堆中分配内存的问题。
新手,请多指教!

WOBUGUAN 2009-05-05
  • 打赏
  • 举报
回复
把这行:
char* x=0;
改成:
char* x="";
就好了。没有内存泄露的。

[Quote=引用楼主 yangyunzhao 的帖子:]
我目前的程序
#include "stdafx.h"

void getString(char*& ptr)
{
printf(ptr);
ptr = "hellokkk";
}

int _tmain(int argc, _TCHAR* argv[])
{
char* x=0;
getString(x);
printf(x);
return 0;
}

这样做很有问题。我想做的就是在main函数里面定义一个c风格的字符串,然后在别的函数里面修改它,并且在main里面可以得到修改后的值。这个过程中,不能有内存泄漏等问题。
[/Quote]
adventurelw 2009-05-05
  • 打赏
  • 举报
回复
其实,最简单的,定义一个句柄类,用类对象得了,如果一定想要用指针这个东西的话。
顺便,我那个代码需要修改的
char *x = "HelloWorld";这种定义要改成char x[] = "HelloWorld";
否则一定会出现运行错误。
小猪头是猪 2009-05-05
  • 打赏
  • 举报
回复
我郁闷啊
你传递的是地址
你又在引用
其实引用可以看着一个指针
你接受的 后面都要用指针才行啊?
yangfan1981 2009-05-05
  • 打赏
  • 举报
回复
怎么搞得这么累。用指针的引用,就没问题了。
yangyunzhao 2009-05-05
  • 打赏
  • 举报
回复
楼上的朋友们,你们的代码我都在VS2008里面测试过了,貌似都有问题
baihacker 2009-05-04
  • 打赏
  • 举报
回复
哇.看到陶大妈了...
yangyunzhao 2009-05-04
  • 打赏
  • 举报
回复
对的,但是老板说char*做比较通用,不能用string
taodm 2009-05-04
  • 打赏
  • 举报
回复
兄弟啊,你就学学C++的string类吧。
baihacker 2009-05-04
  • 打赏
  • 举报
回复
楼主用string就得了...当你用指针的时候,就默认要自己为这些不安全的因素负责了.

哎...1楼的错得很多哈...
yangyunzhao 2009-05-04
  • 打赏
  • 举报
回复
2楼的朋友,好像还是有问题哦

正在编译...
test.cpp
c:\documents and settings\杨云召\my documents\visual studio projects\test\test.cpp(14) : error C2440: “=” : 无法从“char *”转换为“char ** ”
与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换
c:\documents and settings\杨云召\my documents\visual studio projects\test\test.cpp(14) : error C2144: 语法错误 : “char”的前面应有“;”
c:\documents and settings\杨云召\my documents\visual studio projects\test\test.cpp(15) : error C2065: “prt” : 未声明的标识符
c:\documents and settings\杨云召\my documents\visual studio projects\test\test.cpp(19) : error C2143: 语法错误 : 缺少“;”(在“}”的前面)
c:\documents and settings\杨云召\my documents\visual studio projects\test\test.cpp(27) : error C3861: “Free”: 即使使用参数相关的查找,也未找到标识符
mengde007 2009-05-04
  • 打赏
  • 举报
回复
#include "stdafx.h"

void getString(char*& ptr)
{
printf(ptr);
ptr = "hellokkk";
}

int _tmain(int argc, _TCHAR* argv[])
{
char* x="sdfgd"; //真不知道为空是什么意思;
getString(x);
printf(x);
return 0;
}
duguwuming0 2009-05-04
  • 打赏
  • 举报
回复
#include "stdafx.h"
#include <iostream>

void getString(char** ptr)
{
char szConst[] = "abcdefg";

if (*ptr == NULL)
{
*ptr = new char[sizeof(szConst)];
}
::strcpy(*ptr, "abcdefg");
}


int main(int argc, char* argv[])
{
char* x=0;
getString(&x);
printf("%s\n", x);
delete []x;
return 0;
}
iam68620963 2009-05-04
  • 打赏
  • 举报
回复
void getString(char** ptr) //2级指针
{
// printf(ptr); //???? 你传进来的是一个NULL, 在这里对NULL地址操作就已经非法了.
// ptr = "hellokkk"; //?? 你的ptr 只能指向一个字符 在这里你要它指向一个字符串也已经是错误的操作;

//改
int nCount = sizeof(char)/sizeof(*("hellokkk"));
ptr = (char *)malloc(nCount)
char * pTemp = "hellokkl";
char * pTemp1 = prt;
while ('\0' != *pTemp)
{
*pTemp1++ = *pTemp++
}
}

int _tmain(int argc, _TCHAR* argv[])
{
char* x=0;
getString(&x);
printf(x);
Free(x); //添加
return 0;
}

这样就OK了
  • 打赏
  • 举报
回复
void getString(char*& ptr)
{
printf(ptr);
ptr = "hellokkk"; //不然这里会使char* x=0; 这里的内存丢失
}

int _tmain(int argc, _TCHAR* argv[])
{
char* x=0; //既然你要传它的引用给别人修改,就不要申请空间了,直接char* x;声明一个空指针就可以了。
getString(x);
printf(x);
return 0;
}
Sou2012 2009-05-04
  • 打赏
  • 举报
回复
MARK!!
lpf000 2009-05-04
  • 打赏
  • 举报
回复
ptr = "hellokkk"; // 改为动态分配就可以了,你是指针的引用传递,可以不用返回值
operatingtuzi 2009-05-04
  • 打赏
  • 举报
回复
我有一些不解。。

楼主下面的ptr为0,调用printf肯定会有异常
void getString(char*& ptr) 
{
printf(ptr); //把这行去掉吧
ptr = "hellokkk";
}



但是这不存在什么内存泄露的问题啊,并没有在堆中分配内存哦。。

至于ptr指向的是常量区 会结束的时候由系统释放 ,而这之前 任何调用也没有失效,主函数仍然可以正常输出hello
加载更多回复(6)

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧