关于C语言中字符指针作用域的问题。。。。。。。。。。
代码
#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");}#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都是局部变量。函数结束就生命周期就结束了
[解决办法]
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掉.
[解决办法]
应该是释放了,只是还是可以调用,只是它是野指针了。
------解决方案--------------------
搞清楚它们指向的内存在什么地方存放就好理解了
char c2[]="are";char *c3="you";
[解决办法]