读书人

关于C语言中字符指针作用域的有关问题

发布时间: 2012-08-08 14:32:45 作者: rapoo

关于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都是局部变量。函数结束就生命周期就结束了
[解决办法]
探讨
char *c1,*c2,*c3都是局部变量。函数结束就生命周期就结束了

[解决办法]
探讨

char *c1,*c2,*c3都是局部变量。函数结束就生命周期就结束了

[解决办法]
探讨

引用:

char *c1,*c2,*c3都是局部变量。函数结束就生命周期就结束了




char c1[]="How";
char c2[]="are"; 在 stack 上

char *c3="you"; 一般在常量区

[解决办法]
探讨
代码

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";
pA……

[解决办法]
你把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";
[解决办法]
探讨

你把setValue写成下面那样就可以了。
C/C++ code

int setValue(char* pArray[])
{
char c1[]="How";
char c2[]="are";
char *c3="you";
strcpy(pArray[0], c1);
strcpy(pArray[1], c……

[解决办法]
探讨

引用:

你把setValue写成下面那样就可以了。
C/C++ code

int setValue(char* pArray[])
{
char c1[]="How";
char c2[]="are";
char *c3="you";
strcpy(pArray[0], c1);
strcpy(pArray[1], c……

和楼主的有区别?

[解决办法]
探讨

引用:

引用:

你把setValue写成下面那样就可以了。
C/C++ code

int setValue(char* pArray[])
{
char c1[]="How";
char c2[]="are";
char *c3="you";
strcpy(pArray[0], c1);
strcpy(pArray[1], c……

读书人网 >C语言

热点推荐