C在函数中传递二维数组会给我分段错误

Posted

技术标签:

【中文标题】C在函数中传递二维数组会给我分段错误【英文标题】:C Passing 2d array in function gives me segmentation fault 【发布时间】:2014-12-18 16:01:41 【问题描述】:

我是一名初级程序员,目前正在学习 C。我想做的是从用户那里读取数组的维度,使用 malloc 创建数组,然后将创建的数组传递给函数,即函数应该找到数组中每一行的最小数量,并将其放在另一个数组中,它也将返回给主程序。但是,一旦将数组传递给函数并尝试使用它,就会出现分段错误(核心转储)错误。我知道错误在哪一行,但我找不到我犯的错误。如果你们能帮我一点忙,我将不胜感激。代码如下:

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

int *pinfun(int **pin,int sizex,int sizey);

void main(void)
    int x,y,i,j;
    int **dipin;
    int *newpin;
    printf("Parakalw eisagetai tis diastaseis x,y tou pinaka:");
    scanf("%d %d",&x,&y);
    dipin =(int**) malloc(x*sizeof(int*));
        for(i=0;i<x;i++)
                *(dipin+i)=(int*) malloc(y*sizeof(int));
        
        for(i=0;i<x;i++)
                for(j=0;j<y;j++)
                        printf("Parakalw eisagetai tin (%d,%d) timi tou pinaka:",i,j);
                        scanf("%d",((dipin+i)+j));
                
        
    newpin= pinfun(dipin,x,y);
    for(i=0;i<x;i++)
        printf("H elaxisti timi tis %dis grammis einai: %d",i,*pinfun);
    


int *pinfun(int **pin,int sizex,int sizey)
    int i,j,min;
        int* retpin=malloc(sizeof(int)*sizex);
        for(i=0;i<sizex;i++)
                min=**pin;
                for(j=0;j<sizey;i++)
                        if(*(*(pin+i)+j) < min)
                            min =*(*(pin+i)+j);
                        
                
        *(retpin + i) = min;
        
    return retpin;

代码已修复。错误出现在 scanf("%d",((dipin+i)+j));线 。通过将其切换为 scanf("%d", (*(dipin+i)+j)) 它就像一个魅力。感谢您的宝贵时间。

【问题讨论】:

先学会使用[]操作符,再发个小例子。 @2501 如果我不知道尺寸,如何使用 [] 运算符?如果这个问题听起来很愚蠢,我很抱歉,我还是个初学者。 *(*(pin+i)+j)pin[i][j] 相同 scanf 看起来很可疑 ((dipin+i)+j) 是一个双指针。但无论如何,我建议使用调试器。 (gdb?) 谢谢大家。似乎导致问题的错误出现在“ scanf("%d",((dipin+i)+j)); ”行中。代码现在已修复。我使用指针的原因是为了更好地理解它们的整个概念。我知道 [] 更容易阅读和理解。再次感谢您的宝贵时间。 【参考方案1】:

代码已修复。错误出现在:

scanf("%d",((dipin+i)+j));

通过切换到:

scanf("%d", (*(dipin+i)+j)) 

它就像一个魅力。感谢您的宝贵时间。

当然还有一些其他的错别字被提及,但这就是导致分段错误的原因。

【讨论】:

【参考方案2】:
for(j=0;j<sizey;i++)

我还没有检查你的整个代码,但这看起来很可疑

应该是

for(j=0;j<sizey;j++)

让你的代码可读性更好。

使用

pin[i] = *(p+i);

pin[i][j] = *(*(pin+i)+j);

也按照 Cool Guy 的建议修复您的 printf()。

printf("H elaxisti timi tis %dis grammis einai: %d",i,newpin[i]);

【讨论】:

是的,你是对的,这是一个错误,我已修复它,但它仍然给我分段错误错误.. :/【参考方案3】:

改变

for(j=0;j<sizey;i++)

for(j=0;j<sizey;j++)

printf("H elaxisti timi tis %dis grammis einai: %d",i,*pinfun);

printf("H elaxisti timi tis %dis grammis einai: %d",i,*(newpin+i));

或者

printf("H elaxisti timi tis %dis grammis einai: %d",i,newpin[i]);

为了更容易理解

【讨论】:

是的,这些都是错误的,我已经修复了,但错误仍然存​​在......:/

以上是关于C在函数中传递二维数组会给我分段错误的主要内容,如果未能解决你的问题,请参考以下文章

C语言函数传递二维数组

处理二维数组时出现分段错误[关闭]

opencl核函数怎么传二维数组实参

在 C/C++ 中传递二维数组时出错

C ++将值传递给函数中的二维字符数组

使用动态二维数组时的 C++ 分段错误(核心转储)