大佬教程收集整理的这篇文章主要介绍了完全相同的代码,一个段错误,一个没有,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在用 C 编写一个 numpy。我基本上是在解除分配父结构之前将父结构中的一些属性分配给变量 p_ref
,然后稍后在条件语句中使用该变量。这会导致核心转储。但是,如果我不将它分配给变量而只是在最后使用该属性,则它不会出现段错误。我很困惑他们似乎是一样的。另外,我不确定第二种方法是如何工作的,因为它试图从已经释放的结构中引用一个属性。
这是我的矩阵结构头:
typedef struct matrix {
int rows; // number of rows
int cols; // number of columns
double* data; // pointer to rows * columns doubles
int ref_cnt; // How many slices/matrices are referring to this matrix's data
struct matrix *parent; // NulL if matrix is not a slice,else the parent matrix of the slice
int is_1d;
int is_slice;
int offset;
} matrix;
double rand_double(double low,double high);
voID rand_matrix(matrix *result,unsigned int seed,double low,double high);
int allocate_matrix(matrix **mat,int rows,int cols);
int allocate_matrix_ref(matrix **mat,matrix *from,int offset,int cols);
voID deallocate_matrix(matrix *mat);
double get(matrix *mat,int row,int col);
voID set(matrix *mat,int col,double val);
voID fill_matrix(matrix *mat,double val);
int add_matrix(matrix *result,matrix *mat1,matrix *mat2);
int sub_matrix(matrix *result,matrix *mat2);
int mul_matrix(matrix *result,matrix *mat2);
int pow_matrix(matrix *result,matrix *mat,int pow);
int neg_matrix(matrix *result,matrix *mat);
int abs_matrix(matrix *result,matrix *mat);
这是我用于解除分配矩阵的代码的两个版本:
版本 1
voID deallocate_matrix(matrix *mat) {
if (mat == NulL) { return; }
mat->ref_cnt = mat->ref_cnt - 1;
if (mat->ref_cnt > 0) { return; }
int p_ref = mat->parent->ref_cnt;
if (mat->parent) {
deallocate_matrix(mat->parent);
}
if (!(mat->is_slicE) && mat->ref_cnt == 0) {
free(mat->data);
} else if (p_ref == 1) {
free(mat->data);
}
free(mat);
return;
}
版本 2
voID deallocate_matrix(matrix *mat) {
if (mat == NulL) { return; }
mat->ref_cnt = mat->ref_cnt - 1;
if (mat->ref_cnt > 0) { return; }
if (mat->parent) {
deallocate_matrix(mat->parent);
}
if (!(mat->is_slicE) && mat->ref_cnt == 0) {
free(mat->data);
} else if (mat->parent->ref_cnt == 1) {
free(mat->data);
}
free(mat);
return;
}
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)
以上是大佬教程为你收集整理的完全相同的代码,一个段错误,一个没有全部内容,希望文章能够帮你解决完全相同的代码,一个段错误,一个没有所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。