Windows已触发断点-C语言
我被指派创建一个程序,该程序获取2d数组、行数和列数,然后返回转置矩阵并打印它,只使用指针算法,不允许使用[] 我的代码工作得很好。它确实会打印转置矩阵,但在此之后,我得到以下消息: Windows已在First Assignment.exe中触发断点 这可能是由于堆损坏,这表明First Assignment.exe或其加载的任何DLL中存在错误 这也可能是由于用户在First Assignment.exe具有焦点时按下F12 输出窗口可能有更多诊断信息 有人能帮我吗?我不知道怎么了。这是我的代码:Windows已触发断点-C语言,c,malloc,heap,breakpoints,C,Malloc,Heap,Breakpoints,我被指派创建一个程序,该程序获取2d数组、行数和列数,然后返回转置矩阵并打印它,只使用指针算法,不允许使用[] 我的代码工作得很好。它确实会打印转置矩阵,但在此之后,我得到以下消息: Windows已在First Assignment.exe中触发断点 这可能是由于堆损坏,这表明First Assignment.exe或其加载的任何DLL中存在错误 这也可能是由于用户在First Assignment.exe具有焦点时按下F12 输出窗口可能有更多诊断信息 有人能帮我吗?我不知道怎么了。这是我的
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
int** allocate_matrix(int rows,int columns);
void print_matrix(int** mat1,int rows, int columns);
void scan_matrix(int** mat1,int rows, int columns);
int** transpose_matrix(int** mat1, int rows, int columns);
void main()
{
int** mat1;
int** trans_mat1;
int rows,columns;
printf("Enter the number of rows and columns you wish to see\n");
printf("Rows:");
scanf("%d",&rows);
printf("Columns:");
scanf("%d",&columns);
mat1 = allocate_matrix(rows,columns);
scan_matrix(mat1,rows,columns);
printf("the matrix you entered is: \n");
print_matrix(mat1,rows,columns);
printf("The transposed matrix is:\n");
trans_mat1 = transpose_matrix(mat1,rows,columns);
print_matrix(trans_mat1,columns,rows);
getch();
free(mat1);
free(trans_mat1);
}
int** allocate_matrix(int rows,int columns)
{
int i;
int** ptrmatrix;
ptrmatrix = (int**)malloc(rows*sizeof(int*));
for(i=0;i<rows;i++)
*(ptrmatrix+i) = (int*)malloc(columns*sizeof(int));
return ptrmatrix;
}
void print_matrix(int** mat1,int rows, int columns)
{
int i,j;
for(i=0;i<rows;i++)
{
for(j=0;j<columns;j++)
printf("%d ",*(mat1+i*columns+j));
printf("\n");
}
}
void scan_matrix(int** mat1,int rows, int columns)
{
int i,j;
for(i=0;i<rows;i++)
{
printf("Enter %d values for row number %d\n",columns,i+1);
for(j=0;j<columns;j++)
scanf("%d",(mat1+i*columns+j));
}
}
int** transpose_matrix(int** mat1,int rows,int columns)
{
int i,j;
int** trans_mat1;
trans_mat1 = allocate_matrix(columns,rows);
for(i=0;i<rows;i++)
for(j=0;j<columns;j++)
*(trans_mat1+(j*rows)+i)=*(mat1+(i*columns)+j);
return trans_mat1;
}
#包括
#包括
#包括
int**分配矩阵(int行,int列);
无效打印矩阵(int**mat1,int行,int列);
无效扫描矩阵(int**mat1,int行,int列);
int**转置矩阵(int**mat1,int行,int列);
void main()
{
int**mat1;
int**trans_mat1;
int行、列;
printf(“输入您希望看到的行数和列数\n”);
printf(“行:”);
scanf(“%d”,行和行);
printf(“列:”);
scanf(“%d”列和列);
mat1=分配矩阵(行、列);
扫描矩阵(mat1、行、列);
printf(“您输入的矩阵是:\n”);
打印矩阵(mat1、行、列);
printf(“转置矩阵为:\n”);
trans_mat1=转置矩阵(mat1,行,列);
打印矩阵(trans\u mat1、列、行);
getch();
免费(mat1);
自由(trans_mat1);
}
整数**分配矩阵(整数行、整数列)
{
int i;
int**ptrmatrix;
ptrmatrix=(int**)malloc(rows*sizeof(int*);
对于(i=0;i而言,指针算法中似乎存在导致问题的错误
printf("%d ",*(mat1+i*columns+j));
应该是:
printf("%d ",*(*(mat1+i)+j));
您似乎误解了矩阵的分配方式。通常在此类分配中,您会将矩阵分配为单个NxM整数数组,然后使用最初使用的公式
例如:
int rows = 7, cols = 9;
int* matrix = (int*) malloc(rows * cols * sizeof(int));
// Get 3rd row and 5th column value
int value = *(matrix + 3 * rows + 5);
但您要做的是将指针数组分配给整数数组。每个整数数组都是代码中的一行。因此,您需要做的是首先访问指针数组中的正确指针(mat+i)
(表示指向第i行数组的指针),获取指针值*(mat+i)
,然后访问正确的列值。下面是一个按播放的示例:
int rows = 9, cols = 21;
// Allocate the array of pointers to rows
int** matrix = (int**) malloc(rows * sizeof(int*));
// Allocate each row as an array of values
for (int j = 0; j < rows; ++j)
{
*(matrix + j) = (int*) malloc(cols * sizeof(int));
}
// Access the value at row 5, column 7
int* rowPtr = *(matrix + 5);
int value = *(rowPtr + 7);
int行=9,cols=21;
//将指针数组分配给行
int**matrix=(int**)malloc(行*sizeof(int*);
//将每行分配为一个值数组
对于(int j=0;j
编辑:
其他建议
解除分配:
@mikyra的回答还建议在使用后取消分配您的阵列。我也建议您这样做,但不会将其包括在我的回答中,因为他已经完成了自己的工作。请将此归功于他
内存效率:
分配额外的指针数组比使用NxM大小的单个数组使用更多的内存,前提是所有行都已分配。如果您有一些逻辑试图保留未分配的空行,则可以获得更好的内存性能,但这只对大型稀疏矩阵有利,我相信这超出了分配的范围耳鼻喉科
我个人更喜欢单数组方法,因为它更容易分配/取消分配和索引。指针算法中似乎有一个错误导致了这个问题
printf("%d ",*(mat1+i*columns+j));
应该是:
printf("%d ",*(*(mat1+i)+j));
您似乎误解了矩阵的分配方式。通常在此类分配中,您会将矩阵分配为单个NxM整数数组,然后使用最初使用的公式
例如:
int rows = 7, cols = 9;
int* matrix = (int*) malloc(rows * cols * sizeof(int));
// Get 3rd row and 5th column value
int value = *(matrix + 3 * rows + 5);
但您要做的是将指针数组分配给整数数组。每个整数数组都是代码中的一行。因此,您需要做的是首先访问指针数组中的正确指针(mat+i)
(表示指向第i行数组的指针),获取指针值*(mat+i)
,然后访问正确的列值。下面是一个按播放的示例:
int rows = 9, cols = 21;
// Allocate the array of pointers to rows
int** matrix = (int**) malloc(rows * sizeof(int*));
// Allocate each row as an array of values
for (int j = 0; j < rows; ++j)
{
*(matrix + j) = (int*) malloc(cols * sizeof(int));
}
// Access the value at row 5, column 7
int* rowPtr = *(matrix + 5);
int value = *(rowPtr + 7);
int行=9,cols=21;
//将指针数组分配给行
int**matrix=(int**)malloc(行*sizeof(int*);
//将每行分配为一个值数组
对于(int j=0;j
编辑:
其他建议
解除分配:
@mikyra的回答还建议在使用后取消分配您的阵列。我也建议您这样做,但不会将其包括在我的回答中,因为他已经完成了自己的工作。请将此归功于他
内存效率:
分配额外的指针数组比使用NxM大小的单个数组使用更多的内存,前提是所有行都已分配。如果您有一些逻辑试图保留未分配的空行,则可以获得更好的内存性能,但这只对大型稀疏矩阵有利,我相信这超出了分配的范围耳鼻喉科
我个人更喜欢单数组方法,因为它更容易分配/取消分配和索引。您在决定不只是为矩阵运算分配行x列内存块时,确实没有帮自己一个忙。特别是如果这是作为指针算术的初学者练习的话
访问第i行和第j列中单元格值的正确表达式实际上是:
*((*(mat1 + i))+j)
使用以下更正版本,一切都应按预期进行:
void print_matrix(int** mat1,int rows, int columns)
{
int i,j;
for(i=0;i<rows;i++)
{
for(j=0;j<columns;j++)
/* this line has been changed */
printf("%d ", *((*(mat1 + i))+j));
printf("\n");
}
}
void scan_matrix(int** mat1,int rows, int columns)
{
int i,j;
for(i=0;i<rows;i++)
{
printf("Enter %d values for row number %d\n",columns,i+1);
for(j=0;j<columns;j++)
/* this line has been changed */
scanf("%d",(*(mat1+i))+j);
}
}
int** transpose_matrix(int** mat1,int rows,int columns)
{
int i,j;
int** trans_mat1;
trans_mat1 = allocate_matrix(columns,rows);
for(i=0;i<rows;i++)
for(j=0;j<columns;j++)
/* this line has been changed */
*((*(trans_mat1 + j))+i) = *((*(mat1 + i))+j);
return trans_mat1;
}
真正释放所有分配的内存。您真的没有