C语言问题。。。编译能通过,运行时出错

来源:百度知道 编辑:UC知道 时间:2024/06/25 05:45:24
#include "stdio.h"
#include "stdlib.h"
#define N 5
void a(char*p,char*q)
{char t;
while(p<q)
{t=*p;*p=*q;*q=t;p++;q--;}
}
void main()
{char s[N-1],*p,*q;
int m;
printf("请输入%d个连续小写字母\n",N); gets(s);
printf("请输入m\n"); scanf("%d",&m);
p=(char*)malloc(sizeof(char));q=(char*)malloc(sizeof(char));
p=s+m; q=s+N-1;
a(p,q);
for(p=s;p<s+N;p++) printf("%c",*p);
free((void*)p);free((void*)q);
}
错误提示是Debug Assertion Failed...怎么改啊

p=(char*)malloc(sizeof(char));
q=(char*)malloc(sizeof(char));
free((void*)p);
free((void*)q);

这四句纯属多余。因为你给p和q分配了内存之后又在p=s+m; q=s+N-1; 把它们指向了其他地方,这样原本分配的内存现在就无法触及到,因为p和q不再指向他们,他们现在指向静态分配的内存区,也就是s上,这里的内存是不能被释放的。

还有一个问题就是你的数组初始化。初始化时方括号中的数字是数组的大小,不是最大下标。实际上你只给了s4个元素的位置,输入五个字符肯定会出问题,而且你要给终止符留位置。所以正确的初始化方法应该是char s[N+1]。

printf("请输入%d个连续小写字母\n",N); gets(s); 输入N个字母,你就给个N位的缓冲区,肯定过界啊

缓冲区尽量设置大一些, 尤其是给人输入用的缓冲区, 设置个N+1000多用1k内存在现在几g内存的机器上没任何影响,为啥非要这么抠呢

然后就是 p和q都malloc分配了内存, 然后立刻 p=s+m , q=s+N-1 ... 那之前为啥要分配内存啊?刚分配内存就被指向别的地方,内存泄漏了

既然已经 p =s+m了, p已经是指向一个栈中的内存了, 后面再 free(p)肯定出错。