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在函数中传递二维数组会给我分段错误的主要内容,如果未能解决你的问题,请参考以下文章