#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);
| ~~~~^~~~~~~~~