关于leetcode上*returnSize 与 *returnColumnSizes的实际意义及使用

个人整理学习用,有错误欢迎指正

出现环境

在leetcode的题目中,当使用C语言求解涉及二级指针的题目,或者需要输出类似于{[1,2,3],[2,3,4],...}这种不止一个数组的结果是,经常看到形如int** threeSum(int* nums, int numsSize, int* returnSize, int** returnColumnSizes) {...}的函数调用格式。先上结论:int* returnSize是你所返回的二级指针的大小;int** returnColunmnSizes是你所返回的二级指针中,其中每一个一级指针的大小。

实际意义

先给一张内存的示意图,这对应了leetCode的15题,给一个数组,返回所有的,三数相加为0的三元组,不允许重复。没看过题的只用了解,threeSum()是一个函数,它返回了一个由三元组组成的二维数组。需要注意的是,该二维数组是由malloc()得到的,因此在内存中并不是连续存放的,而是像图示那样离散存放的。

程序运行时变量数据保存在栈区中,而一般情况下,不同的栈区是不能互相访问的。需要注意,C语言中,函数调用时传递的值并不是源值,而是复制一份一模一样的值传进函数中去。

因此,如果你在main()中创建了变量returnSize,然后传入了threeSum()中去,threeSum()中得到的只是returnSize一个副本,无论怎么改变都不会影响main()中的returnSize。因此,当我们需要在threeSum()中改变一个值并在main()中取得的话,最好的方式是传给threeSum一个地址,这样threeSum通过拷贝得到了一个地址,但仍能通过解引用操作符*访问并更改到源数据。

一图胜千言
上图中,我们真正需要的仅仅是绿色的源数据,其他的一级指针、二级指针只是为了更好的得到源数据。其中,returnSizereturnColumnSizes都是围绕着你的返回值:二级指针ret。通过threeSum得到的返回值,本质上只是一个地址,占用了一个内存单元。在main中只能知道它是一个二级地址,但并不知道这个二级地址包含了多少个一级地址,以及每一个一级地址又包含了多少源数据。因此,需要一些辅助变量告诉main()上述信息。

returnSize

关于二级地址含含有多少个一级地址,仅仅需要一个值:returnSize,比如returnSize = 4,那么ret[0],ret[1],ret[2],ret[3]这四个值存储的就是有效的一级地址。由于要在threeSum()中修改这个值,因此不能直接传递returnSize,而是将某一个内存单元的地址传给threeSum()函数,并将这个地址,而不是其对应的内存单元起名为returnSize(不是我故意绕的,是leetCode就这么规定的),因此returnSize就由单纯的一个值变成了一个一级指针。

returnColumnSizes

有了ret含有的一级指针的个数,现在还差一件事尚未明了:每一个一级指针又含有多少个数据呢?针对本体来说,由于存放的是三元组,因此每一个一级指针都存放有3个数据。但是并非所有题目都会让你返回三元组。其他题目有可能出现让你返回的数据为{[0],[1,2,3],[1,2]}这种情况。因此,你需要一个一维数组来记录每一个一级指针所对应的数据的个数。由于这个数据已经是一个一维数组了,要想在不同的函数间传递并修改这些值,必须再将这个一维数组的地址,也就是一个二级地址传入threeSum(),这个二级地址我们取名为returnColumnSizes

使用

一般在leetCode中,都需要你自己去malloc()这两个变量所占用的空间,并修改其值。

你所返回的二级指针,其中最多可能包含多少个一级指针,就给returnColumnSizes申请多少个对应 int 的大小的空间。比如最多可能返回1000个三元组,那么最好在一开始就给returnColumnSizes申请1000个int大小的空间,之后每次给(*returnSize)++的时候顺便给(*returnColumnSizes)[*returnSize]赋值就可以了。

  • 21
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用\[2\]中提到,语句int *returnSize = malloc(sizeof(int))给指针变量returnSize分配了一个整型存储空间。这意味着returnSize指针变量现在可以用来存储一个整数值。需要注意的是,在使用指针变量之前,必须先为其分配相应的内存空间,否则会导致程序异常。 #### 引用[.reference_title] - *1* [(int*) malloc(SIZE * sizeof(int)) 惨痛的教训](https://blog.csdn.net/Ssure/article/details/8977386)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [C语言(int *)malloc(sizeof(int))的作用与意思](https://blog.csdn.net/u014183815/article/details/107336736)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [‘sizeof’ on array function parameter ‘array’ will return size of ‘int*’](https://blog.csdn.net/weixin_43737395/article/details/123233550)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值