gpt4 book ai didi

c - 在 C 中的结构内部使用指针时出现段错误(可能与 LAPACKE 有关)

转载 作者:行者123 更新时间:2023-11-30 17:30:42 24 4
gpt4 key购买 nike

由于这是我的第一篇文章,我希望我不会犯太多错误......

我面临以下问题。当我运行这段代码时(很抱歉,相当长),我在 LAPACKE 调用期间的“解决”函数中遇到了段错误。

问题是当我不尝试在主函数中打开文件“dataf”时,此代码运行时没有任何(可见)问题。

我想我弄乱了我的鲍勃类型和指针,但我想听听你的观点。

致以诚挚的问候

蒂博

#include <stdio.h>
#include <stdlib.h>
#include <lapacke/lapacke.h>

typedef struct{
double *data;
double *tmp;
double **A;
int size;
} Bob;

void allocate(Bob *b);
void init_data(Bob *b);
void init_A(Bob* b);

void allocate(Bob *b){
b->data = malloc(b->size*sizeof(double));
b->tmp = malloc(b->size*sizeof(double));
b->A = malloc(4*sizeof(double*));
b->A[0] = malloc(b->size*sizeof(double));
b->A[1] = malloc(b->size*sizeof(double));
b->A[2] = malloc(b->size*sizeof(double));
b->A[3] = malloc(b->size*sizeof(double));
}

void init_data(Bob *b){
int i;
for (i=0;i<b->size;i++){
b->data[i] = 0.0;
}
}

void init_A(Bob* b){
int i;
double *diag = b->A[0];
double *down = b->A[1];
double *up = b->A[2];
double *up2 = b->A[3];

for (i=0;i<b->size;i++){
diag[i] = 2.0;
down[i] = -1.0;
up[i] = -1.0;
up2[i] = 0.0;
}
}

void solve(Bob *b){
lapack_int info;
lapack_int *ipiv = malloc(b->size*(sizeof(lapack_int)));
lapack_int lsize = b->size;
lapack_int lone = 1;

int i;
for (i=0;i<b->size;i++){
b->tmp[i] = b->data[i];
}

info = LAPACKE_dgttrs(LAPACK_COL_MAJOR,'N',
lsize,lone,\
b->A[1],b->A[0],b->A[2],b->A[3],\
ipiv, b->tmp, lsize);

printf("%d\n",info);
free(ipiv);
}

int main(void){
Bob b;
b.size = 10000;
allocate(&b);
init_A(&b);
init_data(&b);
// No Segfault if dataf is not opened
FILE *dataf;
dataf = fopen("data","w");
fclose(dataf);
solve(&b);

free(b.data);
free(b.tmp);
free(b.A[0]);
free(b.A[1]);
free(b.A[2]);
free(b.A[3]);
free(b.A);
return 0;
}

使用 Makefile:

P=mini
CC=gcc

CFLAGS=-g -Wall
LFLAGS=-lm -llapacke -llapack -lblas

FILES=min.c

all: $(FILES)
$(CC) $(CFLAGS) $(LFLAGS) $(FILES) -o $(P)

编辑:我在原来的帖子中犯了一个错误。 A[0] -> A[3] 的分配是 double ,而不是指向 double 的指针。

解决后更改 fclose 的位置似乎可以解决问题。但在我的真实代码中它不会改变任何东西......

编辑2:该问题似乎与 LAPACK 函数有关。我更改了此函数(更改为更适合我的问题的函数),现在内存问题消失了。

这不是我原来问题的解决方案,但我以某种方式解决了它。感谢所有非常有用的回复和评论:)

编辑3:我找到了问题的根源。与LAPACK有关。在函数solve中,我为ipiv分配空间。但是 LAPACKE_dgttrs 将 init_A 中的函数 LAPACKE_dgttrf 给出的 ipiv 作为输入。

因此,我在结构中为 ipiv 分配了一个指针,并在程序的其余部分中使用它。

最佳答案

错误是由于fclose函数造成的,在fclose之前检查dataf是否为NULL或noy

FILE *dataf;
dataf = fopen("data","w"); //If file is not opened for writing, the dataf is NULL
fclose(dataf);
solve(&b);

更改为

FILE *dataf;
dataf = fopen("data","w");

if(dataf != NULL)
fclose(dataf);
solve(&b);

关于c - 在 C 中的结构内部使用指针时出现段错误(可能与 LAPACKE 有关),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25035532/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com