写个几个有关指针和数组的函数,从内存角度有些疑问,请大侠们看看有没有问题1.从一个字串中查找某个字串第N
写个几个有关指针和数组的函数,从内存角度有些疑问,请大侠们看看有没有问题
1.从一个字串中查找某个字串第N次出现的问题
本意是临时字符串用个指针,动态申请,使用完释放,请问字符串的指针往后偏移后(temp_str+=index这句)
最后删除指针行不行?比如动态申请的是20长度,而字串偏移后指针指向的有可能只有最后4个字符。那么指针删除后
前面的哪些数据会这样处理?申请的原始长度的内存能够得到正确释放么?会不会残留在内存里?个人对内存理解比较混乱,还请高手指点下。
C/C++ codeint dc_get_char_postion_by_times(char* str,char ch,int time ){ char* temp_str; int index; int postion=0; int i; temp_str=malloc(strlen(str)); strcpy(temp_str,str); do { index=strchr(temp_str,'#'); postion+=index; temp_str+=index; }while(i++!=time); free(temp_str); return postion;}
2.函数中如果用固定长度的字符数组做局部变量,比如下面的"test_str",那么函数调用结束后,这些数组占用的内存,系统会自动回收呢,还是得不到释放?谢谢!
C/C++ codevoid test(){ char test_str[100]="dsadddddddddddddddddddddddddddddddddddddddadasdasd"; return;}
[解决办法]第一个:不知道你这是要干啥:index=strchr(temp_str,'#'); strchr返回char*,你这样肯定出错,.你是不是想要同要'#'的地址?如果是的话, postion+=index;temp_str+=index; 这是干啥,把所有'#'的位置相加?要是这样,最后temp_str所指向的可能越界,如#########,就相当于1+2+3+4....,
free(temp_str); 现在temp_str指向哪都不知道还怎么free
可能你是别的意思,不过我现在所理解的所有意思中没一种是属于正常的
第二个:放在堆栈中,函数返回后可重复利用。当然"dsadddddddddddddddddddddddddddddddddddddddadasdasd"常量放在静态区,不用管
[解决办法]问题1:temp_str+=index;这种做法是错误的;
问题2:数组占用的内存会自动回收,因为该数组是在栈上定义;
[解决办法]malloc申请的空间实在堆上的,除非你手动释放,不然是等程序执行结束后才会释放。
而在函数内定义的数组,变量时在函数调用结束后有系统自动释放的,因为它们都是在栈上申请的空间。
[解决办法]如果你free的指针不指向malloc返回的位置,程序会崩溃,因为 malloc返回的位置前有一个“内存块”记录了分配内存的信息
char* temp_ptr = temp_str= (char*)malloc(strlen(str));
一个移动,另一个free 用
[解决办法]LS 正解