#include
#include
#define P 20
char *ph(char a[20],int k,int m)
{
int i;
char b[20];
for(i=0;i<k;i++)
{
b[i]=a[i];
}
b[k]='\0';
printf("%s\n",b);
return b;
}
int main()
{
char *q;
char ch[P];
int k,m;
printf("请输入");
gets(ch);
printf("%s",ch);
printf("请输入删除的位置,删除的个数");
scanf("%d%d",&k,&m);
printf("%d%d",k,m);
q=ph(ch,k,m);
printf("%s\n",q);
return 0;
}
C语言是可以返回堆栈上的变量的,但是在此之后必须把它从堆栈上复制出来,当你调用printf的时候,就把参数推上堆栈了,就把堆栈上的变量冲掉了。
为什么int就可以了呢?因为int是复制的值。而你的字符串是指针,指针指向的堆栈变量被覆盖。但是int值复制到了主程序,就不存在这个问题。
子程序里面的返回值有错误,不可以返回指向栈内存的指针,b[]是你在子函数里面定义的栈上的变量,函数结束就被销毁了,所以返回b是不对的,q接受到的是乱码。
改正的方法:返回指向堆的指针。所以只需要将char b[20]改成char *b=(char *)malloc(20);同时加上头文件即可。
具体原因:因为malloc()动态内存的建立是在堆上建立的,不是在栈里面建立的,所以就不会随着函数的结束被销毁。
加上的头文件是
b[20]只是个临时数组,而且是在栈上创建的,函数调用完成空间就被释放了,所以返回的指针就不可能是你想要的值了
#include
#include
#define P 20
char *ph(char a[20], int k, int m)
{
int i;
char b[20] = {0};
for (i = 0; i<k; i++)
b[i] = a[i];
b[k] = '\0';
printf("%s", b);
return &a[i+m];
}
int main()
{
char *q;
char ch[P];
int k, m;
printf("请输入");
gets_s(ch,sizeof(ch));
printf("%s\n", ch);
printf("请输入删除的位置,删除的个数");
scanf_s("%d %d", &k, &m);
printf_s("%d %d\n", k, m);
q = ph(ch, k, m);
printf_s("%s\n", q);
return 0;
}
既然把a的地址传过去了,干嘛不直接把a算法后的地址传过来呢?a是main函数的变量,b是子函数变量,你怎么可能把子函数的变量地址传到主函数里面,子函数return所以局部变量就销毁了