我的功能无效' name.exe已停止工作'

时间:2018-04-22 17:54:16

标签: c function

程序停止,我得到一个" merge.exe已停止工作"信息。我简化了一切,但在调用函数时似乎发生了问题...

#include <stdio.h>
#include <stdlib.h>
#define br 1000
int sort(int *list[],int broi);
int merge(int list1[],int list2[],int broi1,int broi2);
int main()
{
int i,n,m,a1[br],a2[br],a;
printf("gimme n: ");
scanf("%d",&n);
printf("gimme m: ");
scanf("%d",&m);
for(i=0;i<n;i++)
{
    printf("gimme element %d ot list1: ",i+1);
    scanf("%d",&a1[i]);
}
for(i=0;i<m;i++)
{
    printf("gimme element %d ot list2: ",i+1);
    scanf("%d",&a2[i]);
}
sort(&a1,n);
sort(&a2,m);
merge(a1,a2,n,m);
return 0;
}
int sort(int *list[],int broi)
{
int i,j,c;
for (i = 0; i < broi-1; i++)
{
    for (j = 0; j < broi-i-1; j++)
    {
        if (*list[j] > *list[j+1])
        {
            c=*list[j];
            *list[j]=*list[j+1];
            *list[j+1]=c;
        }
    }
}
return 1;
}
int merge(int list1[],int list2[],int broi1,int broi2)
{
printf(" AAAAAA");
return 1;
}

sort()功能非常明显,甚至有效! 但无论我在merge()中放置什么,它都不会赢得工作而且会打破整个计划。

2 个答案:

答案 0 :(得分:1)

在sort()函数中,它是非常不言自明的,它甚至可以工作! ?没有它不会工作。通过使用-Wall编译

进行编译来阅读编译器警告
  

reo.c:4:5:注意:预期'int **'但是参数的类型为'int *',因为你传递了a1&amp;的地址捕获指针数组。相反,只需传递数组名称并使用指针捕获。

使函数调用看起来像

sort(a1,n);/*just pass the array name */
sort(a2,m);

sort()

的定义
int sort(int *list,int broi){ /* take list is ptr variable */
        int i,j,c;
        for (i = 0; i < broi-1; i++) {
                for (j = 0; j < broi-i-1; j++) {
                        if (list[j] > list[j+1]) {
                                c=list[j];
                                list[j]=list[j+1];
                                list[j+1]=c;
                        }
                }
        }
}

答案 1 :(得分:0)

pip使int *list[]指向list的指针数组。在int函数main(例如)中,创建一个指向类型为&a1的{​​{1}}数组的指针。 int(从第一个开始)与int (*)[1000]不同。

简单的解决方案?不要将指针传递给阵列!这很少需要。

无论如何,由于operator precedence int**之类的表达式与int (*)[1000]相同,如果你有一个指向数组的指针,你需要*list[i]。因此,许多错误都不能成为一种权利。

你的编译器应该一直在向你发出警告。