为什么我在尝试 运行 查找功能时遇到分段错误,即使正确访问内存也是如此?

Why I am getting segmentation fault when trying to run the find function even though accessing memory properly?

查找功能在程序中不起作用。 我认为这是因为我的编译器显示的分段错误,但我不明白为什么?因为我正确地使用了内存。 如果不是因为分段错误,那么为什么我没有得到我想要的输出,即使我没有收到任何错误。

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

void find(int **p) {
    int small,large,i,j;
    small=large=p[i][j];
    for(i=0; i<3; i++) {
        for(j=0; j<3; j++) {
            if(small>p[i][j])
                small=p[i][j];
            else if(large<p[i][j])
                large=p[i][j];
        }
    }
    printf("\nSmallest : %d\nLargest : %d",small,large);
}

int main() {
    int **p;
    p=(int **)malloc(sizeof(int)*3);
    if(p==NULL) {
        printf("Unable to allocate memory.");
        exit(1);
    }
    int i;
    for(i=0; i<3; i++) {
        *(p+i)=(int *)malloc(sizeof(int)*3);
    }
    int j;
    for(i=0; i<3; i++) {
        for(j=0; j<3; j++)
            scanf("%d",(*(p+i)+j));
    }
    for(i=0; i<3; i++) {
        for(j=0; j<3; j++)
            printf("\nValue of [%d][%d] : %d",i,j,*(*(p+i)+j));
    }
    find(p);
    free(p);
    return 0;
}

有错字

p=(int **)malloc(sizeof(int)*3);
                        ^^^   

你的意思好像是

p=(int **)malloc(sizeof(int *)*3);
                        ^^^^^

除了这个内存释放

free(p);

您还需要释放每个分配的数组,例如

for ( i = 0; i < 3; i++ )
{
    free( *( p + i ) );
}

free( p );

在函数 find 中,您使用了未初始化的变量 ij

void find(int **p) {
    int small,large,i,j;
    small=large=p[i][j];
    //...

你需要初始化它们

void find(int **p) {
    int small,large,i = 0,j = 0;
    small=large=p[i][j];
    //...

虽然至少写成这样会更简单

void find(int **p) {
    int small = p[0][0], large = p[0][0];

    for ( int i = 0; i < 3; i++ )
    //...