如何解决为什么这个程序在释放时会崩溃?
当我使用这条线并试图释放指针时,我试图理解为什么这个程序会崩溃:
t_mat *C=malloc(sizeof(t_mat));
但适用于以下行(没有内存泄漏,没有崩溃,值 53 是我通过反复试验发现的最小值):
t_mat *C=malloc(sizeof(t_mat)+53);
程序:(while(1) 循环用于内存泄漏测试,不影响崩溃)
#include <stdio.h>
#include <stdlib.h>
typedef int t_mat[3][3];
t_mat* matice(t_mat A,t_mat B,char op)
{
t_mat *C=malloc(sizeof(t_mat)+53);
switch(op)
{
case '+':
for(int i=0; i<3; i++)
for(int j=0; j<3; j++)
*C[i][j]=A[i][j]+B[i][j];
return *C;
break;
case '-':
for(int i=0; i<3; i++)
for(int j=0; j<3; j++)
*C[i][j]=A[i][j]-B[i][j];
return *C;
break;
default:
free(C);
printf("Chyba\n");
return NULL;
break;
}
}
int main()
{
char op;
scanf("%c",&op);
getchar();
t_mat A = {0,1,2,3,4,5,6,7,8},B= {0,*C;
while(1)
{
C=matice(A,B,op);
for(int i=0; i<3; i++)
for(int j=0; j<3; j++)
printf("%d\n",*C[i][j]);
free(C);
C=NULL;
}
return 0;
}
我在这里遗漏了什么吗?
解决方法
一元 *
的优先级低于 []
。你需要写(*C)[i][j]
。
类似这样的声明
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:template match="A">
<xsl:copy>
<xsl:copy-of select="B[3]"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
和
*C[i][j]=A[i][j]+B[i][j];
调用未定义的行为。由于此声明,变量 printf("%d\n",*C[i][j]);
的类型为 C
int ( * )[3][3]
所以首先你应该应用解引用运算符,然后才应用下标运算符
t_mat *C=malloc(sizeof(t_mat)+53);
或
( *C )[i][j]=A[i][j]+B[i][j];
否则程序有未定义的行为。
所以在内存分配中使用幻数printf("%d\n",( *C )[i][j]);
是没有任何意义的。随便写
53
这是一个演示程序。
t_mat *C=malloc(sizeof(t_mat));
程序输出为
#include <stdio.h>
#include <stdlib.h>
#define N 3
typedef int t_mat[N][N];
int main(void)
{
t_mat A =
{
{ 0,1,2 },{ 3,4,5 },{ 6,7,8 }
};
t_mat B =
{
{ 0,8 }
};
t_mat *C = malloc( sizeof( t_mat ) );
for ( size_t i = 0; i < N; i++ )
{
for ( size_t j = 0; j < N; j++ )
{
( *C )[i][j] = A[i][j] + B[i][j];
}
}
for ( size_t i = 0; i < N; i++ )
{
for ( size_t j = 0; j < N; j++ )
{
printf( "%2d ",( *C )[i][j] );
}
putchar( '\n' );
}
putchar( '\n' );
free( C );
return 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。