Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows已触发断点-C语言_C_Malloc_Heap_Breakpoints - Fatal编程技术网

Windows已触发断点-C语言

Windows已触发断点-C语言,c,malloc,heap,breakpoints,C,Malloc,Heap,Breakpoints,我被指派创建一个程序,该程序获取2d数组、行数和列数,然后返回转置矩阵并打印它,只使用指针算法,不允许使用[] 我的代码工作得很好。它确实会打印转置矩阵,但在此之后,我得到以下消息: Windows已在First Assignment.exe中触发断点 这可能是由于堆损坏,这表明First Assignment.exe或其加载的任何DLL中存在错误 这也可能是由于用户在First Assignment.exe具有焦点时按下F12 输出窗口可能有更多诊断信息 有人能帮我吗?我不知道怎么了。这是我的

我被指派创建一个程序,该程序获取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;
}
真正释放所有分配的内存。

您真的没有