C语言函数返回数组
能夠直接在自定義函數中,寫成指針類型返回值,直接返回呢?
#include <stdio.h> int* func() {int str[5]={1,2,3,4,5};return str; }int main() {int *b;b = func();for(int i=0; i<5; i++)printf("%d", b[i]);return 0; }直接返回str數組名(注意不需要加&)。但事實上,運行結果并不正確,因為str本身是一個自定義函數中的局部變量,是一個數組有5個字節,它的生命周期當然也隨著它所在的函數在一起,隨著fun函數調用的結束,其中的各種局部變量也將被系統收回,所以str數組這5個字節也將被回收,自然在main函數里再輸出肯定已經不是原來的內容了。
方法一:
#include <stdio.h> int* func() {//char *str = "hello world!";int *str ;str = (int *)malloc(5*sizeof(int));for(int i=0; i<5; i++){*(str+i) = i;}return a; }int main() {int *b;//char *b;b = func();for(int i=0; i<5; i++)printf("%d\n", b[i]);free(b);//printf("%s\n", b);return 0; }采用指針傳遞的方式。str雖然也是一個局部變量,但它是一個指針,只有四個字節,當它指向字符串時,字符串存在常量區,? 而不屬于fun函數里的部分,全程序可讀,所以return后依舊存在;當指向非字符串時,采用malloc為str指向的空間分配內存,數據保存在堆區,注意在程序結束是要釋放(free)掉內存。跟據自己需要在函數中加入形參。
方法二:
#include <stdio.h> int* func() {static int str[5] = {1,2,3,4,5} ;return str; }int main() {int *b;b = func();for(int i=0; i<5; i++)printf("%d\n", b[i]);return 0; }采用static關鍵字。
方法三:
#include <stdio.h> %%%求100以內的素數%%% int func(int n, int a[]) {int flag;int num=0;for(int i=2;i<=n;i++){flag = 1;for(int j=2; j<(int)i/2; j++){if(i%j==0){flag = 0;break;}}if(flag){a[num] = i;++num;}}return num; }int main() {int b[100];int n;n = func(100,b);for(int i=0; i<n; i++)printf("%-3d", b[i]);return 0; }使用參數,將結果直接保存在傳入參數中。
返回二位數組時的方法也是一樣。
采用static的方式:
#include <stdio.h> int **func() {static int str[3][3] = {{1,2,3},{4,5,6},{7,8,9}} ;return str; }int main() {int **b;b = func();for(int i=0; i<3; i++){for(int j=0; j<3; j++){printf("%d\n", *((int *)b+3*i+j));}}return 0; }采用malloc的方式:?
#include<stdio.h> #define M 3 #define N 2 int main(){int **addOne(int a[M][N]);int a[M][N]={{1,1},{2,2},{3,3}};int i,j;printf("\n調用函數之后:\n");int **b = addOne((int **)a);for(i=0;i<M;i++)for(j=0;j<N;j++)printf("%d\t",*((int *)b+N*i+j));} int **addOne(int a[M][N]){int **b =(int **)malloc(M*sizeof(int *));//先申請M個指針型字節的空間for (int i=0;i<M;i++)b[i]=(int *)malloc(N*sizeof(int));//然后依次按一維申請int i,j;for(i=0;i<M;i++)for(j=0;j<N;j++)*((int *)b+N*i+j) = *((int *)a+N*i+j) + 1;//找地址,如同數據結構中矩陣找地址相同,首地址+(次數行數-1)*總列數+次數列數-1//i,j都是從0開始,可以不用減1return b; }總結
- 上一篇: RSA加密-解密以及解决超长内容加密失败
- 下一篇: TCP客户端与服务端