当前位置:   article > 正文

C语言函数返回数组_c语言返回数组

c语言返回数组

能够直接在自定义函数中,写成指针类型返回值,直接返回呢?

  1. #include <stdio.h>
  2. int* func()
  3. {
  4. int str[5]={1,2,3,4,5};
  5. return str;
  6. }
  7. int main()
  8. {
  9. int *b;
  10. b = func();
  11. for(int i=0; i<5; i++)
  12. printf("%d", b[i]);
  13. return 0;
  14. }

直接返回str数组名(注意不需要加&)。但事实上,运行结果并不正确,因为str本身是一个自定义函数中的局部变量,是一个数组有5个字节,它的生命周期当然也随着它所在的函数在一起,随着fun函数调用的结束,其中的各种局部变量也将被系统收回,所以str数组这5个字节也将被回收,自然在main函数里再输出肯定已经不是原来的内容了。

方法一:

  1. #include <stdio.h>
  2. int* func()
  3. {
  4. //char *str = "hello world!";
  5. int *str ;
  6. str = (int *)malloc(5*sizeof(int));
  7. for(int i=0; i<5; i++){
  8. *(str+i) = i;
  9. }
  10. return a;
  11. }
  12. int main()
  13. {
  14. int *b;
  15. //char *b;
  16. b = func();
  17. for(int i=0; i<5; i++)
  18. printf("%d\n", b[i]);
  19. free(b);
  20. //printf("%s\n", b);
  21. return 0;
  22. }

采用指针传递的方式。str虽然也是一个局部变量,但它是一个指针,只有四个字节,当它指向字符串时,字符串存在常量区,  而不属于fun函数里的部分,全程序可读,所以return后依旧存在;当指向非字符串时,采用malloc为str指向的空间分配内存,数据保存在堆区,注意在程序结束是要释放(free)掉内存。跟据自己需要在函数中加入形参。

方法二:

  1. #include <stdio.h>
  2. int* func()
  3. {
  4. static int str[5] = {1,2,3,4,5} ;
  5. return str;
  6. }
  7. int main()
  8. {
  9. int *b;
  10. b = func();
  11. for(int i=0; i<5; i++)
  12. printf("%d\n", b[i]);
  13. return 0;
  14. }

采用static关键字。

方法三:

  1. #include <stdio.h>
  2. %%%求100以内的素数%%%
  3. int func(int n, int a[])
  4. {
  5. int flag;
  6. int num=0;
  7. for(int i=2;i<=n;i++){
  8. flag = 1;
  9. for(int j=2; j<(int)i/2; j++){
  10. if(i%j==0){
  11. flag = 0;
  12. break;
  13. }
  14. }
  15. if(flag){
  16. a[num] = i;
  17. ++num;
  18. }
  19. }
  20. return num;
  21. }
  22. int main()
  23. {
  24. int b[100];
  25. int n;
  26. n = func(100,b);
  27. for(int i=0; i<n; i++)
  28. printf("%-3d", b[i]);
  29. return 0;
  30. }

使用参数,将结果直接保存在传入参数中。

返回二位数组时的方法也是一样。

采用static的方式:

  1. #include <stdio.h>
  2. int **func()
  3. {
  4. static int str[3][3] = {{1,2,3},{4,5,6},{7,8,9}} ;
  5. return str;
  6. }
  7. int main()
  8. {
  9. int **b;
  10. b = func();
  11. for(int i=0; i<3; i++){
  12. for(int j=0; j<3; j++){
  13. printf("%d\n", *((int *)b+3*i+j));
  14. }
  15. }
  16. return 0;
  17. }

采用malloc的方式: 

  1. #include<stdio.h>
  2. #define M 3
  3. #define N 2
  4. int main(){
  5. int **addOne(int a[M][N]);
  6. int a[M][N]={{1,1},{2,2},{3,3}};
  7. int i,j;
  8. printf("\n调用函数之后:\n");
  9. int **b = addOne((int **)a);
  10. for(i=0;i<M;i++)
  11. for(j=0;j<N;j++)
  12. printf("%d\t",*((int *)b+N*i+j));
  13. }
  14. int **addOne(int a[M][N]){
  15. int **b =(int **)malloc(M*sizeof(int *));//先申请M个指针型字节的空间
  16. for (int i=0;i<M;i++)
  17. b[i]=(int *)malloc(N*sizeof(int));//然后依次按一维申请
  18. int i,j;
  19. for(i=0;i<M;i++)
  20. for(j=0;j<N;j++)
  21. *((int *)b+N*i+j) = *((int *)a+N*i+j) + 1;//找地址,如同数据结构中矩阵找地址相同,首地址+(次数行数-1)*总列数+次数列数-1
  22. //i,j都是从0开始,可以不用减1
  23. return b;
  24. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/404364
推荐阅读
相关标签
  

闽ICP备14008679号