Program received signal SIGSEGV, Segmentation fault.

文章讨论了在解决Hanota问题时,静态数组和动态数组的使用区别。静态数组受限于内存保护,无法直接修改,而动态数组可以成功执行操作。代码示例展示了在递归函数中如何处理数组和指针,以及参数传递的问题。作者意识到原始接口可能不适用于所有情况,需要考虑对象状态的变化,指出仅使用当前参数无法实现所需功能,提出了对问题更全面的思考。
摘要由CSDN通过智能技术生成
//上面的代码有局限性
 int c[14]
 int**C=&c;
 int*Csize=&csize;
//局限性
 *(*C+*CSize)=14;//这句话报错

在这里是不能往数组存东西的有保护,而下面改成动态数组就好了

//上面的代码无局限性
 int *c=(int*)malloc(sizeof(int)*14);
 int**C=&c;
 int*Csize=&csize;
//局限性
 *(*C+*CSize)=14;//这句话成功修改

这个问题是在打hanota遇到的

//给的接口很奇怪,因为黑盒子里面有可能BC它没有搞数组,所以我们要自备数组
//*C[*CSize++]=A[--ASize];这句话报错,数组保护
#include<stdio.h>
#include<stdlib.h>
static int n=2;
void hanota(int* A, int ASize, int* B, int BSize, int** C, int* CSize){
    //首先递归出口
    if(ASize==1){
        //*C[*CSize++]=A[--ASize];
        --n;
        *(*C+*CSize)=*(A+n);
        *CSize=*CSize+1;
        return;
    }
    else{
        hanota(A,ASize-1,*C,*CSize,&B,&BSize);
        hanota(A,1,B,BSize,C,CSize);
        hanota(B,ASize-1,A,BSize,C,CSize);
    }
}
int main(){
    int *A=(int*)malloc(sizeof(int)*14);
    int *B=(int*)malloc(sizeof(int)*14);
    int *c=(int*)malloc(sizeof(int)*14);
    int Asize;
    int Bsize;
    int csize;
    scanf("%d",&Asize);
    n=Asize;
    Bsize=0;
    csize=0;
    for(int i=0;i<Asize;i++){
        scanf("%d",&A[i]);
    }
    int**C=&c;
    int*Csize=&csize;
    hanota(A,Asize,B,Bsize,C,Csize);
    for(int i=0;i<Asize;i++){
        printf("%d ",c[i]);
    }
}

思考:上面的代码有问题,
一开始想直接用leetcode提供的接口,然后想黑盒里面可能有也可能没有数组或者动态数组,可能被保护也可能没有被保护;
然后思考如果用n来表示移动的数目,那么这里的参数都是栈的地址和栈顶,这样少一个参数接口;
然后思考,如果用Asize作为n那么Bsize和Csize显然没有什么作用,栈顶不知道怎么传入并且随着对象变化;
上面的代码就是,在B到C最后一步的时候,B的n没有–而A的减少了,要让栈顶随着栈变,之前没有考虑,这样的话这样的参数是没办法实现这个功能的,只能去用对象的思想。具体运行成功代码放到算法专栏。
:我想这才是一个完整的思考过程,而不是仅仅抽离于接口之外的实现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值