C冒泡排序读访问错误问题


#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNING
#endif
#include <stdio.h>
#include <stdlib.h>
void bubbleSort(int matrix[9], int n);
int main(void) {

int matrix[9];
int n = 9;
printf("enter 10 values to the matirx n");
for (int i = 0; i < 10; i++) {
printf("now %dth componetn ", i+1);
scanf("%d", &matrix[i]);
}
bubbleSort(matrix[9], n);
return 0;
}

void bubbleSort(int matrix [9], int n) {
//bubble sort the given matrix
int temp = 0;
for (int i=n-1; i > 0; i--) {
// compare two values at j and j+1 and move left when j+1 is smaller than j 
for (int j = 0; j < i; j++) {
if (matrix[j] > matrix[j + 1]) {
temp = matrix[j];
matrix[j] = matrix[j + 1];
matrix[j + 1] = temp;
}
}

printf("Check the matrix n");
for (int i = 0; i < 9; i++) {
printf("%d ", matrix[i]);
}

printf("n");
}
}

嗨,我在

读取访问冲突错误
if (matrix[j] > matrix[j + 1]) {
**temp = matrix[j];**
matrix[j] = matrix[j + 1];
matrix[j + 1] = temp;
}

这部分代码。代码构建正确,但当我运行程序时,我得到一个错误。有人能帮我解决这个问题吗?我搜索了一点,基于此,我认为它与指针有关,但我不知道为什么会有一个指针的问题,因为我从来没有在我的代码中使用过它。

对于初学者,您声明了一个仅包含9元素的数组。

int matrix[9];

另一方面,您正在尝试输入10元素。

printf("enter 10 values to the matirx n");
for (int i = 0; i < 10; i++) {
printf("now %dth componetn ", i+1);
scanf("%d", &matrix[i]);
}

程序已经有未定义的行为。

在这个函数声明中

void bubbleSort(int matrix[9], int n);

在第一个参数的声明中使用的幻数9没有很大的意义。只写

void bubbleSort(int matrix[], int n);

void bubbleSort(int *matrix, int n);

bubbleSort(matrix[9], n);

而不是像

那样传递数组matrix
bubbleSort(matrix, n);

传递的是数组matrix[9]中不存在的元素。编译器应该发出一条消息,告诉你正在尝试将整数转换为指针。

在函数中使用幻数9而不是循环中的参数n

for (int i = 0; i < 9; i++) {

注意,当一个一维数组被命名为矩阵时,它看起来很奇怪。

使用您的方法,程序可以如下所示:

#include <stdio.h>
void bubbleSort( int matrix[], size_t n ) 
{
if ( n )
{
for ( size_t i = n - 1; i != 0;  i-- ) 
{
// compare two values at j and j+1 and move left when j+1 is smaller than j 
for ( size_t j = 0; j < i; j++ ) 
{
if ( matrix[j + 1] < matrix[j] ) 
{
int temp = matrix[j];
matrix[j] = matrix[j + 1];
matrix[j + 1] = temp;
}
}
}
}
}
int main(void) 
{
enum { N = 9 };
int matrix[N];
printf( "enter %d values to the matirx n", N );
for ( int i = 0;  i < N; i++ ) 
{
printf( "now %dth componetn", i+1 );
scanf( "%d", matrix + i );
}
bubbleSort( matrix, N );

for ( int i = 0;  i < N; i++ ) 
{
printf( "%d", matrix[i] );
}
putchar( 'n' );

return 0;
}

程序输出可能为

enter 9 values to the matirx 
now 1th componet
9
now 2th componet
8
now 3th componet
7
now 4th componet
6
now 5th componet
5
now 6th componet
4
now 7th componet
3
now 8th componet
2
now 9th componet
1
1 2 3 4 5 6 7 8 9
bubbleSort(matrix[9], n);

这只传递列表的最后一个元素(强制转换为地址),而不是列表的实际地址,这可能是您想要的。

不会有好结果的:-)

你应该直接输入matrix


一个像样的编译器应该警告你这个,比如gcc:

prog.c: In function ‘main’:
prog.c:21:22: warning: passing argument 1 of ‘bubbleSort’
makes pointer from integer without a cast
[-Wint-conversion]
21 |     bubbleSort(matrix[9], n);
|                ~~~~~~^~~
|                      |
|                      int
prog.c:7:21: note: expected ‘int *’ but argument is of
type ‘int’
7 | void bubbleSort(int matrix[9], int n);
|                 ~~~~^~~~~~~~~

相关内容

  • 没有找到相关文章

最新更新