c函数返回数组

<a target=_blank href="http://blog.csdn.net/zouxinfox/article/details/2525206">http://blog.csdn.net/zouxinfox/article/details/2525206</a>




    #include <stdio.h>  
    #include <stdlib.h>  
      
    int (*retArray())[10]  
    {  
        int (*a)[10];  
        int i=0;  
        /*动态开辟空间*/  
        a=calloc(10,sizeof(int)); //a=(int (*)[10])calloc(10,sizeof(int)); 
        /*赋值*/  
        for(i=0;i<10;i++)  
        {  
            (*a)[i]=i;  
        }  
        return a;  
      
    }  
      
    int main()  
    {  
        int (*b)[10];  
        /*函数返回指向数组的指针*/  
        b=retArray();  
        /*打印第一个元素*/  
        printf("%d/n",(*b)[0]);  
        /*释放空间*/  
        free(b);  
        return 0;  
    }  

#include <stdio.h>  
  
struct tag  
{  
    int a[10];  
}x,y;  
  
struct tag retArray()  
{  
    int i=0;  
    for(i=0;i<10;i++)  
        x.a[i]=i;  
    return x;  
}  
  
int main()  
{  
    struct tag y=retArray();  
    printf("%d/n",y.a[3]);  
    return 0;  
} 



#include "stdio.h"
char* aa();aa的返回类型用来printf("%s",aa());输出 可见应该是char*类型
int main()
{
    printf("%s",aa());
 return 0;
}

char* aa()
{
       
 char k[]="abcde";//k是个局部数组 初始化为abcde还有个\0
当返回式 该局部数组被收回 k指向还在 但是内同没有了
    return &k[0];
} 

////////上面说的 楼上几位也说了~////////拓展下~~
1.把char k[]="abcde";定义成全局就不说了~
定义成全局会让数据分散,在只能用C不用C++的环境里构造类似对象的情况是会很糟。

2.char k[]="abcde";//既然在返回的时候被收回 那不让他收回的就行了 

程序改成
char* aa()
{
       
 static char k[]="abcde";//把k数组变成static数组 这样返回是k的内容依然保留
    return &k[0];
} 

除了static之外 还用种常用的方法。

char* aa()
{
       
  char *k="abcde";//这里只定义了一个K指针 而k指向了abcde
abcde我是const区的常量,不属于局部变量,被收回的只有k而已。
    return &k[0];
} 

上面的写法其实存在不安全因素 实际上它是隐式的const声明,那就把它补全
char* aa()
{
       
 const char const *k="abcde";
    return (char*)&k[0];
} 

最后提一句 那个return &k[0];还是写成return k;好了
相关文章
相关标签/搜索