大家帮忙看下为什么
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void changeString(char **p)
{
char s[10] = {'a','b','c','d'};
*p = s;
*(*p + strlen(*p)) = '\0';
}
int main()
{
char *q = NULL;
changeString(&q);
//puts(q); //此时结果不正确
printf("%s\n",q);
return 0;
}
在codeblocks中编译的,输出的结果有问题,不知道为何?
[解决办法]
理解堆、栈是解释你遇到的问题的前提。
在changeString函数中,你定义了一个数组s。需要提醒的是这是一个临时数组,数组占用的内存空间从函数栈上获得。之后,你将数组首地址作为输出参数返回给了main方法。需要注意,运行到printf语句时,changeString函数已经终止,函数栈上的空间已经无效。因此,数组s所使用的内存也无效了,输出的值也就是一个随机值。
[解决办法]
如果你将changeString的函数改为:
void changeString(char **p)
{
static char s[10] = {'a','b','c','d'};
*p = s;
*(*p + strlen(*p)) = '\0';
}
那么运行的结果应该是对的。
因为static变量存放在静态变量段,所以当changeString函数终止时,变量占用的内存仍然有效。
[解决办法]
S数组是子函数的定义数组,子函数调用结束之后,空间就会释放了。q最后指向的空间的内容就变化了。所以就输出不对了,试试下面的应该就可以了。
#include "stdio.h"
#include "string.h"
void changeString(char *p)
{
char s[10] = {'a','b','c','d'};
strcpy(p,s);
//*(*p + strlen(*p)) = '\0';
}
int main()
{
char a[10]="\0",*q = a;
changeString(q);
//puts(q); //此时结果不正确
printf("%s\n",q);
return 0;
}
[解决办法]
作为局部变量,字符串被放置在栈中,退出changeString后那些空间被释放,然后被后续的printf函数占用,更改。
[解决办法]
函数退出那空间就释放了…