关于C语言中字符指针作用域的问题。。。。。。。。。。
代码
- C/C++ code
#include <stdio.h>#include <stdlib.h>#include <string.h>int setValue(char* pArray[]){ char c1[]="How"; char c2[]="are"; char *c3="you"; pArray[0]=c1; pArray[1]=c2; pArray[2]=c3; }int main(){ int i; char *pArray[3]; setValue(pArray); for(i=0;i<3;i++) { printf("%s\n", pArray[i]); } printf("\n");}我觉得,最后打印的时候,要么全部都能显示,要么全部都不能显示。
而最终的结果是前两个是乱码,最后一个“you”打印出来了,难道直接声明的指针变量会在堆上分配空间?也就是说指针变量在最后setValue方法结束的时候没有被回收?
[解决办法]
- C/C++ code
#include <stdio.h>#include <stdlib.h>#include <string.h>void setValue(char* pArray[]){ [color=#FF0000]char *c1="How"; char *c2="are";[/color] char *c3="you"; pArray[0]=c1; pArray[1]=c2; pArray[2]=c3; }int main(){ int i; char *pArray[3]; setValue(pArray); for(i=0;i<3;i++) { printf("%s\n", pArray[i]); } printf("\n"); return 0;}
[解决办法]
char *c1,*c2,*c3都是局部变量。函数结束就生命周期就结束了
[解决办法]
[解决办法]
[解决办法]
[解决办法]
[解决办法]
你把setValue写成下面那样就可以了。
- C/C++ code
int setValue(char* pArray[]){ char c1[]="How"; char c2[]="are"; char *c3="you"; strcpy(pArray[0], c1); strcpy(pArray[1], c2); strcpy(pArray[2], c3);}
[解决办法]
char* 和char []的关系多理解下.
char* p = q.
如果想正常使用p, 则需保证q的合法性.
1. q是合法栈空间.比如:
char q[100] = "hello kitty";
char* p = q;
但是setValue中的c1,c2对应的值因为函数跳出栈空间已经释放.
2. q是合法堆空间.比如:
char* q = strdup("hello kitty");//或者char* q = (char*)malloc(100); strncpy(q, "hello kitty", 99);
char* p = q;
3. q是常量字符串.
char* q = "hello kitty";
char* p = q;
setValue中的c3变量虽然已经释放但是对应的值是固定的. 所以pArray[2]是可以合法使用的.
另. LS的回答有问题. pArray[i]未指向合法可写内存的话, 直接strcpy会dump掉.
[解决办法]
应该是释放了,只是还是可以调用,只是它是野指针了。
------解决方案--------------------
搞清楚它们指向的内存在什么地方存放就好理解了
- C/C++ code
char c2[]="are";char *c3="you";
[解决办法]
[解决办法]
[解决办法]