关于char str[255]与char* str = new char[255]的问题..
- C/C++ code
小弟在内存管理方面不怎么明白,假设我在某个函数里面,如: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大小,请问如何能精确到该用多少用多少呢??}
[解决办法]
// 字符串指向内容、地址是否为空的判断(是这样判断吗?我希望这个里面有合法的值)
if ( NULL == _str || *_str == '\0')
直接用std::string
[解决办法]
NULL == _str//用这个来判断地址是否为空
*_str == '\0'//用这个来判断字符串是否为空
[解决办法]
// 昨晚上面这些,我需要将tempStr清空吗?
memset就行把?
// 这样的话就必须要删除了new出来的temStr了,不然肯定会有内存泄露,但是删除了的话,vecStr里面也空了
每一次new不一样的空间 数据使用完才需要delete把
[解决办法]
第一个 判断 指针是否为空就行了 *_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模板实现的代码
[解决办法]
楼主你错了很多。。。。手机上网,不能指出。。。楼主属于学了一点C然后跳过来学C 的,鉴定完毕,帮顶。。。
[解决办法]
// 也就是说只能用tempStr[255]这种,不过又浪费了很多空间,没必要一定用255大小,请问如何能精确到该用多少用多少呢??
那就动态分配内存呀
[解决办法]
[解决办法]
[解决办法]
static char tempStr[255];
在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可。
[解决办法]
一般char tempStr[255];
这样的定义我都会写成
char tempStr[255] = "";
这样一开始这个字符串就是空的了
至于这种结构要把255个全部清空
可以写成
ZeroMemory(tempStr, sizeof(tempStr));
[解决办法]
哎!不想说了!