为什么我在尝试 运行 查找功能时遇到分段错误,即使正确访问内存也是如此?
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
中,您使用了未初始化的变量 i
和 j
。
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++ )
//...
查找功能在程序中不起作用。 我认为这是因为我的编译器显示的分段错误,但我不明白为什么?因为我正确地使用了内存。 如果不是因为分段错误,那么为什么我没有得到我想要的输出,即使我没有收到任何错误。
#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
中,您使用了未初始化的变量 i
和 j
。
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++ )
//...