关于char str[255]与char* str = new char[255]的问题..

CabinLS 2012-01-13 10:58:53
小弟在内存管理方面不怎么明白,假设我在某个函数里面,如:

void func(char* _str)
{
// 字符串指向内容、地址是否为空的判断(是这样判断吗?我希望这个里面有合法的值)
if ( NULL == *_str || NULL == _str )
return ;
// 下面是关于strcpy、ZeroMemory和vector合起来运用的一些疑问
char tempStr[255];
vector<char *> vctStr;
strcpy(tempStr, _str);
vctStr.push_back(tempStr);
// 昨晚上面这些,我需要将tempStr清空吗?
ZeroMemory(tempStr, strlen(tempStr));// 这里清空时strlen(tempStr)需要+1吗? +1的话是不是会把结束符'\0'给清除掉,下次就没结束符了?
// 这里清空以后,vecStr里面压入的的内容也会被清空,如果不清空的话,像这种局部字符数组变量应该是不会照成内存泄露的对吗?
// 假设上面不用tempStr[255],而用new出来的*tempStr
char *tempStr = new char[strlen(_str) + 1];
vector<char *> vecStr;
strcpy(tempStr, _str);
vctStr.push_back(tempStr);
// 这样的话就必须要删除了new出来的temStr了,不然肯定会有内存泄露,但是删除了的话,vecStr里面也空了
// 也就是说只能用tempStr[255]这种,不过又浪费了很多空间,没必要一定用255大小,请问如何能精确到该用多少用多少呢??
}
...全文
388 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
CabinLS 2012-01-13
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 shagpg2008 的回复:]
哎!不想说了!
[/Quote]我无地自容啦 哈哈 回家要好好补习下基础知识才行,谢谢你们
shagpg2008 2012-01-13
  • 打赏
  • 举报
回复
哎!不想说了!
无名剑 2012-01-13
  • 打赏
  • 举报
回复
一般char tempStr[255];
这样的定义我都会写成
char tempStr[255] = "";
这样一开始这个字符串就是空的了
至于这种结构要把255个全部清空
可以写成
ZeroMemory(tempStr, sizeof(tempStr));
赵4老师 2012-01-13
  • 打赏
  • 举报
回复
static char tempStr[255];
在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可。

无名剑 2012-01-13
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 cabinls 的回复:]
TO wurh80
(无名剑)

很感谢你的指点,可能我对于指针的概率还比较模糊,不过我现在很想知道一个问题
void func()
{
char tempStr[255];
ZeroMemory(tempStr, strlen(tempStr));
}// 函数结束时为什么会报错?
报错:Run-Time Check Failure #2 - Stack aroun……
[/Quote]

因为你的字符串没有设置初始值,里面全是乱码,所以strlen就有可能搜索到超过255,内存越界访问
啥事情都可以发生
CabinLS 2012-01-13
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 ivers0n 的回复:]
引用 9 楼 cabinls 的回复:

引用 5 楼 ivers0n 的回复:
// 昨晚上面这些,我需要将tempStr清空吗?

memset就行把?

// 这样的话就必须要删除了new出来的temStr了,不然肯定会有内存泄露,但是删除了的话,vecStr里面也空了

每一次new不一样的空间 数据使用完才需要delete把
现在new出来的temStr我用完了,它里……
[/Quote]嗯,知道了! 谢谢你
CabinLS 2012-01-13
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 mingliang1212 的回复:]
楼主你错了很多。。。。手机上网,不能指出。。。楼主属于学了一点C然后跳过来学C 的,鉴定完毕,帮顶。。。
[/Quote]我帖子留着,你上网了帮我看下吧
CabinLS 2012-01-13
  • 打赏
  • 举报
回复
TO wurh80
(无名剑)

很感谢你的指点,可能我对于指针的概率还比较模糊,不过我现在很想知道一个问题
void func()
{
char tempStr[255];
ZeroMemory(tempStr, strlen(tempStr));
}// 函数结束时为什么会报错?
报错:Run-Time Check Failure #2 - Stack around the variable 'tempStr' was corrupted.
IVERS0N 2012-01-13
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 cabinls 的回复:]

引用 5 楼 ivers0n 的回复:
// 昨晚上面这些,我需要将tempStr清空吗?

memset就行把?

// 这样的话就必须要删除了new出来的temStr了,不然肯定会有内存泄露,但是删除了的话,vecStr里面也空了

每一次new不一样的空间 数据使用完才需要delete把
现在new出来的temStr我用完了,它里面的数据我也压入了vector里边,那为什么……
[/Quote]
改正下:如果不是循环的话 那就不用对数组处理

存入容器的是个指针 数据只有一份 你delete后 自然都空了
peng_weida 2012-01-13
  • 打赏
  • 举报
回复
// 也就是说只能用tempStr[255]这种,不过又浪费了很多空间,没必要一定用255大小,请问如何能精确到该用多少用多少呢??
那就动态分配内存呀
CabinLS 2012-01-13
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 ivers0n 的回复:]
// 昨晚上面这些,我需要将tempStr清空吗?

memset就行把?

// 这样的话就必须要删除了new出来的temStr了,不然肯定会有内存泄露,但是删除了的话,vecStr里面也空了

每一次new不一样的空间 数据使用完才需要delete把
[/Quote]现在new出来的temStr我用完了,它里面的数据我也压入了vector里边,那为什么删除tempStr对象后,vector里面也空了! 难道压入到vector里面的数据必须是成员变量吗?
iamnobody 2012-01-13
  • 打赏
  • 举报
回复
楼主你错了很多。。。。手机上网,不能指出。。。楼主属于学了一点C然后跳过来学C 的,鉴定完毕,帮顶。。。
无名剑 2012-01-13
  • 打赏
  • 举报
回复
第一个 判断 指针是否为空就行了 *_str指的是 这个字符串的头地址,如果是个空字符串,那么第一个值就是'\0'所以这样判断的话 空字符串就会被直接返回掉了

vector<char *> vctStr这个就没必要了 如果是个字符串 那么直接用string就可以了
真想测试vector的概念 里头的也直接用char就行 你用了char* 那么只是一个指针,其指向的地址是原来字符串里面的每一个字符

在你第一个ZeroMemory就会把vctStr里面的东西全部的值全变成0.

strlen是从你开始字符指针的位置开始算起 一直搜索到\0 把\0之前的个数输出出来 strnlen是把\0也算上,你这里清空+1还是不+1结果都一样.

最后面那用法非常危险 new[]的东西存到vector 在你做delete的时候 只要把第一个 delete[]就全部删掉了,如果单独每个去delete必挂

感觉整体逻辑很乱

首先你得理解ZeroMemory不是delete 而是把 一段内存里面的参数全部设置成0
结果等同memset

字符串 的结构是 以字符开始到\0为止,也就是为什么命名规则对字符串用sz来命名,也就是string zero

还有指针以及值的概念,建议好好看下书,把概念弄懂了

对于变长字符串直接用string就够了 如果想知道里面概念 去看下STL实现的代码吧,每个VS里面都有所有STL模板实现的代码

CabinLS 2012-01-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 czh3642210 的回复:]
NULL == _str//用这个来判断地址是否为空
*_str == '\0'//用这个来判断字符串是否为空
[/Quote]嗯 谢谢!
这里我最大的不懂是:函数里面声明的char tempStr[255];在函数结束的时候需要对他干嘛,为什么会出错?
IVERS0N 2012-01-13
  • 打赏
  • 举报
回复
// 昨晚上面这些,我需要将tempStr清空吗?

memset就行把?

// 这样的话就必须要删除了new出来的temStr了,不然肯定会有内存泄露,但是删除了的话,vecStr里面也空了

每一次new不一样的空间 数据使用完才需要delete把
面包大师 2012-01-13
  • 打赏
  • 举报
回复
NULL == _str//用这个来判断地址是否为空
*_str == '\0'//用这个来判断字符串是否为空
CabinLS 2012-01-13
  • 打赏
  • 举报
回复
而且我刚又发现了一个问题,执行完这个func函数后,会报错:Run-Time Check Failure #2 - Stack around the variable 'tempStr' was corrupted.

'tempStr' 是一个 char tempStr[255]的临时数组变量,为什么会出现这样的情况?
CabinLS 2012-01-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ouyh12345 的回复:]
// 字符串指向内容、地址是否为空的判断(是这样判断吗?我希望这个里面有合法的值)
if ( NULL == _str || *_str == '\0')

直接用std::string
[/Quote]
别这样哥们,我不想用string,那样很慢
既然我提出来用char *str,就帮我看下吧 谢谢你
ouyh12345 2012-01-13
  • 打赏
  • 举报
回复
// 字符串指向内容、地址是否为空的判断(是这样判断吗?我希望这个里面有合法的值)
if ( NULL == _str || *_str == '\0')

直接用std::string
wodelaolongkou6 2012-01-13
  • 打赏
  • 举报
回复
加载更多回复(2)

64,654

社区成员

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

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