局部字符串指针 局部数组区别

来源:互联网 发布:sql注入分析 编辑:程序博客网 时间:2024/04/30 15:10
稍微有些编程经验的朋友都会知道一个函数是无法返回一个局部数组的,至于原因,我想从两个方面进行说明,虽然并不是这两个方面都对其有影响,但我认为在这个问题上我们都该了解的东西:

① 函数的返回类型不能为一个数组类型。

这个就是说,作为函数返回类型的不能为一个数组,我们要想返回一系列的值,只能用一个指针来代替了,返回指向这一系列值的第一个元素的指针。

② 局部数组,具有局部作用域,当函数调用结束之后,数组也就被操作系统销毁了,即回收了他的内存空间,它里面的东西随时都有可能被覆盖。虽然此时我们获得了指向这一块内存的指针,但此刻里面的东西很大可能都不是我们想要的了。

我们又该怎么解决这个问题呢?

1: 返回一个静态的数组

即我们在定义数组的时候吧数组定义成为静态的。

如:

char *fun()

{

      static char a[] = "hello,world";

      return a;

}

2: 动态分配内存

如:

char *fun()

{

     char *a = (char*)malloc(sizeof(char)*100);

     a = "hello,world";

     return a;

}

3: 使用全局数组

全局数组具有全局的作用域。

 

 

字符串:

我们在函数或者全局内定义的char *p = “Hello World!”;编译器都会为我们作为全局变量定义。伪代码如下

const char temp[] = “Hello World!”;

char *p1 = temp;

任何调用“Hello World!”只是返回temp的一个const指针。

 

函数内:

Char * fun2()

{

char *p = “Hello world!”

return p;

}

 

全局变量

    char *p = “Hello world!”

 

威盛的一道笔试题

silver6 | 02 十一月, 2005 09:20

#include <stdio.h>

char *returnStr()

{

char p[]="hello world!";

return p;

}

int main()

{

char *str;

str=returnStr();

printf("%sn",str);

}

问上述的输出是什么?

还有就是我把上述函数稍改一下

#include <stdio.h>

char *returnStr()

{

char *p="hello world!";

return p;

}

int main()

{

char *str;

str=returnStr();

printf("%sn",str);

}

这个输出又是什么?各是什么原因呢

char p[]="hello world!";

p指向一个局部的数组地址,分配在栈中。

char *p="hello world!";

p指向一个字面常量。字面常量分配在静态存储区。所以:

第一个指向的是个已被释放的内存,不会输出hello world!,要出错的吧

第二个输出的是: hello world!

 

0 0
原创粉丝点击