岳飞再世YUE 2019-08-05 23:14 采纳率: 100%
浏览 289
已采纳

关于c二级指针传递的一些问题

最近在学数据结构,感觉二级指针的用法很高级,想把数组初始化操作改成函数形式,但是运行总是闪退,发现不了有什么错误,各位大神能帮忙分析一下吗?
如下代码一为可运行成功的代码,代码二为修改后闪退的函数,
测试是scanf语句引发的闪退,注释掉就不会闪退了,但是实际运行的时候却可以运行完,或者说运行过初始化数组操作就会闪退,之后的代码也可以运行(比如在后面 加一句"printf("1");",实测可以输入最后一个数后打印出1 , 但是 注释掉还是会闪退,所以应该不是之后代码的问题),麻烦各路大神帮忙分析一下吧,感激不尽,谢谢!

1

#include<stdio.h>
#include<stdlib.h>

typedef int *intp;

//void Init(int n, intp *a );
//void print( int n, intp a );
//
int main(){
    int num,i;
    intp a; 
    printf("please input how many numbers you want to sort:");
    scanf("%d",&num);
    a = ( intp )malloc( num * sizeof( int ));
    printf("please input numbers:\n");
    for( i=0; i<num; i++ ){
        printf("a[%d]=",i);
        scanf("%d",&a[i]);
    }
    for( i=0; i<num; i++ ){
    printf("a[%d]=%d",i,a[i]);
        printf("\n");
    }
}

2

#include<stdio.h>
#include<stdlib.h>

typedef int *intp;

void Init(int n, intp *a );
void print( int n, intp a );

int main(){
    int num;
    intp a; 
    printf("please input how many numbers you want to sort:");
    scanf("%d",&num);
    Init( num, &a);
    print(num, a);
}

void Init(int n, intp *a){
    int i;
    *a = ( int * )malloc( n * sizeof( int ));
    printf("please input numbers:\n");
    for( i=0; i<n; i++ ){
        printf("a[%d]=",i);
        scanf("%d",&(*(a+i)));
    }
}

void print( int n, intp a ){
    int i;
    for( i=0; i<n; i++ ){
    printf("a[%d]=%d",i,a[i]);
        printf("\n");
    }
}

  • 写回答

1条回答 默认 最新

  • 舞星散落 2019-08-06 09:09
    关注

    以下是我个人理解 有错欢迎指出
    第二段代码 纠正的地方为注释

    //2=======
    int main(){
        int num;
        intp a; 
        printf("please input how many numbers you want to sort:");
        scanf("%d",&num);
        Init( num, &a);
    //纠正//Init( num, a);
        print(num, a);
            //记得释放内存;
            free(a);
            a=NULL;
    }
    
    void Init(int n, intp *a){
        int i;
        *a = ( int * )malloc( n * sizeof( int ));
        printf("please input numbers:\n");
        for( i=0; i<n; i++ ){
            printf("a[%d]=",i);
            scanf("%d",&(*(*a+i)));
    //纠正//scanf("%d",*a+i);
        }
    }
    
    void print( int n, intp a ){
        int i;
        for( i=0; i<n; i++ ){
            printf("a[%d]=%d",i,a[i]);
    //纠正//printf("a[%d]=%d",i,(*a)[i]);
            printf("\n");
        }
    }
    
    ///额外的解释代码展示
    int *b;
    int **a=&b;  //或者写成 int **a;  *a=b;  //或者写成 int **a;  a=&b;
    *a = ( int * )malloc( n * sizeof( int ));
    scanf("%d",*a+i);    //*a就是b  b本身是个指针 所以你就不要在前面加&了
    //当然这句不规范 i没定义什么的 只是为了简单表示赋值方法.
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥100 c语言,请帮蒟蒻看一个题
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)