先理解一下free函数
上面的dest_src进行了强制类型转换,下面的free也需要强制类型转换一下,不然系统以为程序释放了不该释放的内存所以就报错喽。
.
.
.
.
在堆区开辟空间-程序
.
.
对程序不理解之处:
一、在strcpy()这里
.
二、free()
这里出错了
.
strcpy()函数是C语言中的一个复制字符串的库函数,不会考虑接收复制信息的数组的大小,因此在使用堆区存储的时候,给接收复制信息的数组分配相同大小或者更大的空间。
.
char *strcpy(char *dst, const char *src)
;
#define _CRT_SECURE_NO_WARNINGS //(只会在该文件里起作用)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define FUNC_CHIOCE 1 //定义了第一种方法
#if (FUNC_CHIOCE == 1)
void change_ab(char *a, char *b)
{
int t = 0;
t = *a;
*a = *b;
*b = *a;
}
#elif (FUNC_CHIOCE == 2)
void change_ab(char *a, char *b)//这里另外一个文章有详细解释
{
//使用算法进行互换
*a = *a + *b;
*b = *a - *b;
*a = *a - *b;
}
#elif(FUNC_CHIOCE == 3)
void change_ab(char *a, char *b)
{
*a = *a ^ *b;
*b = *a ^ *b;
*a = *a ^ *b;
}
#endif
/* 字符串反转函数,返回字符串,char类型指针 */
char * str_reverse(char * src_str)
{
int str_len = strlen(src_str); //长度统计
char * dest_str = src_str;
//为字符串在堆区新开辟了一个空间,dest_str这个指针变量去指向这个新的空间
char * pHead = &src_str[0];
// 指向字符串的头,&取地址信息
char * pTail = &src_str[str_len - 1];
// 指向字符串的尾 并且减去字符串结束标志 '\0'【str_len - 1】
while ( (pHead != pTail) && (pHead < pTail))//好习惯,都带上()
{
change_ab(pHead, pTail);
pHead++;// 指向头部的指针往后移
pTail--; // 指向尾部的指针往前移
}
return dest_str;
//为什么要设置dest_str, 指针以及返回ret指针的位置[3],由于目的指针dst已经在进行移动了,所以用辅助指针ret表明首指针;(忘记为什么这样解释了,,,)
//12-2:将数组首地址赋值给dest_str,对dest_str操作即是对数组进行操作,因此返回dest_str
}
/* 主函数 */
int main()
{
char src_str[] = "hello world";
char * dest_str = (char *)malloc(strlen(src_str));
//z在堆区为数组开辟新的空间,让一个新的指针去指向它,若是在栈上main()函数执行完会被释放
//开辟的大小正好是src_str[]数组的大小
printf("Before reverse: %s\n", src_str);
//str_reverse返回的就是char*类型呀 而strcpy的最后一个参数是 const char*类型 可以直接传进去
strcpy(dest_str, str_reverse(src_str));
//将反转函数里实现好的字符排序,拷贝给指针dest_str所指向的空间里(都是char *类型)
printf("After reverse: %s\n", dest_str);
char * free((char*) dest_str);
//这里记得也要带上强制类型转换
//因为我们释放的地址里保存的是char*类型的数据
dest_str = NULL;
//使用完记得释放,否则会对堆区内存造成浪费
return 0;
}
拷贝函数这里也可以这样写
char *p = str_reverse(src_str);
strcpy(dest_str, p);
printf("After reverse: %s\n", dest_str);
在栈上运行程序
.
直接 char *p = str_reverse(src_str); 这一步就可以了 这一步已经拿到结果存在栈内存中
.
#define _CRT_SECURE_NO_WARNINGS //(只会在该文件里起作用)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define FUNC_CHIOCE 1 //定义了第一种方法
#if (FUNC_CHIOCE == 1)
void change_ab(char *a, char *b)
{
int t = 0;
t = *a;
*a = *b;
*b = *a;
}
#elif (FUNC_CHIOCE == 2)
void change_ab(char *a, char *b)
{
*a = *a + *b;
*b = *a - *b;
*a = *a - *b;
}
#elif(FUNC_CHIOCE == 3)
void change_ab(char *a, char *b)
{
*a = *a ^ *b;
*b = *a ^ *b;
*a = *a ^ *b;
}
#endif
/* 字符串反转函数 */
char * str_reverse(char * src_str)
{
int str_len = strlen(src_str);
char * pHead = &src_str[0];// 指向字符串的头
char * pTail = &src_str[str_len - 1];// 指向字符串的尾 并且-字符串结束标志 '\0'
while ( (pHead != pTail) && (pHead < pTail))//好习惯,都带上()
{
change_ab(pHead, pTail);
pHead++;// 指向头部的指针往后移
pTail--; // 指向尾部的指针往前移
}
return src_str;
}
/* 主函数 */
int main()
{
char src_str[] = "hello world";
printf("Before reverse: %s\n", src_str);
char * p = str_reverse(src_str);
printf("After reverse: %s\n", p);
return 0;
}