200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > C语言子函数返回二维数组讨论

C语言子函数返回二维数组讨论

时间:2022-11-19 16:18:04

相关推荐

C语言子函数返回二维数组讨论

C语言中,在子函数中将一个二维数组返回

都知道,在子函数中,一定不能返回一个局部变量的指针,局部变量在子函数中进行创建,子函数调用结束后,该指针将被释放掉。
如果被指针所指向的该内存空间被别的程序占用着,由于指针已将被释放掉了,结果在后续程序中还接着用该指针,就会造成程序崩溃。

这里用字符型二维数组举例来讨论

例如:我们定义一个二维数组 Arr[3][3] = {“123”, “456”, “789”};

将这个三行三列的整形数组从子函数中创建出来,在主函数中进行遍历,将所有的元素打印出来

思考:

直接在子函数中定义二维数组,把二维数组数组名直接返回,行不行?

类似这种的:

#include <stdio.h>char **Function(){char **Arr[3][3] = {"123", "456", "789"};return Arr;}char main (int argc, char ** argv){char **p = NULL;p = Function();printf ("Arr[0][0] = %d\n", *(*p));return 0;}

通过编译,这样是错误的,我们也能分析到,局部变量在子函数调用结束后指针,也就是这个Arr所保存的地址就被释放掉了,是非法的

那如何返回该二维数。

这里可以通过Malloc函数,开辟内存空间,将数组地址就可以通过子函数来进行返回,在主函数中进行遍历了。

#include <stdio.h>#include <stdlib.h>char ** Function1(){char **Arr = NULL;char i = 0, j = 0;char Brr[3][3] = {"123", "456", "789"};Arr = (char **)malloc(sizeof(char *) * 3);for (i = 0; i < 3; i++){Arr[i] = (char *)malloc(sizeof(char) * 3);for (j = 0; j < 3; j++){Arr[i][j] = Brr[i][j];}}return Arr;}int main(int argc, const char *argv[]){char **p = NULL;int i = 0, j = 0;p = Function1();printf ("Arr[0][0] = %c\n", *(*p));// 1printf ("Arr[0][1] = %c\n", *(*(p) + 1));// 2printf ("Arr[0][2] = %c\n", *(*(p) + 2));// 3printf ("Arr[1][0] = %c\n", *(*(p + 1))); // 4printf ("Arr[1][1] = %c\n", *(*(p + 1) + 1)); // 5printf ("Arr[1][2] = %c\n", *(*(p + 1) + 2));// 6printf ("Arr[2][0] = %c\n", *(*(p + 2))); // 7printf ("Arr[2][1] = %c\n", *(*(p + 2) + 1));// 8printf ("Arr[2][2] = %c\n", *(*(p + 2) + 2));// 9// 将保存每一行的指针先释放掉for (i = 0; i < 3; i++){if (*(p + i) != NULL){free (*(p + i));*(p + i) = NULL;printf ("free *(p + %d) success!!!\n", i);}}// 最后将保存整个二维数组的指针释放掉if (p != NULL){free (p);printf ("free p success!!!\n");}return 0;}

对于二维数组通过Malloc进行创建的讨论

先在内存中开辟三个大小为sizeof(char *)的空间,因为每一个sizeof(char *)大小的空间存放的都是指向字符串的指针,类型为char *

再通过for循环,对每一个char *指针所指向的字符串的空间进行开辟,通过Brr数组对其内容进行赋值即可。

这样返回的指针在主函数中进行遍历输出就可以了。

这里还是需要注意,在遍历二维数组时,搞清楚指针的指向情况

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。