당신에 대한 포인터의 주소를 전달하려는 것 같다 당신의 freeDoubleArr
(I 오히려 deleteDoubleArr
를 호출 할 것이다) freeDoubleArr(&G, numnodes)
같은 :
나는 이런 식으로 뭔가를 시도했다. 그럼 당신은 당신이 그러나 단지 일반 배열로, 당신의 정방 행렬이 배열에 대한 포인터의 배열로 표현되지 않는다는 것을 결정할 수있다, 그러나
void freeDoubleArr(double ***arrptr, int size)
{
double** arr = *arrptr;
for (int i = 0; i < size; i++)
free(arr[i]);
free (arr);
*arrptr = NULL;
}
이 필요합니다. 아마도 arr
가 size*size
요소들의 어레이가 (각각 double
인) 정말로 그 협약에 유용 할 수
struct matrix_st {
unsigned size;
double arr[]; /* flexible array of size*size elements */
};
같이 flexible array members (C99의 이상)을 사용.
그러면 빠른 액세스 및 뮤 테이터 인라인 기능을 정의 할 수 있습니다.
inline double get_element(struct matrix_st *m, int i, int j) {
assert (m != NULL);
unsigned s = m->size;
assert (i>=0 && i<s && j>=0 && j<s);
return m->arr[s*i+j];
}
inline void put_element(struct matrix_st* m, int i, int j, double x) {
assert (m != NULL);
unsigned s = m->size;
assert (i>=0 && i<s && j>=0 && j<s);
m->arr[i*s+j] = x;
}
최적화하고 <assert.h>
와 (assert(3)을 ... 참조) -DNDEBUG
컴파일 위의 접근 get_element
와 뮤 테이터 put_element
더 빨리 코드보다 아마 될 것입니다.
매트릭스 생성은 (제로 혼성 매트릭스를 생성하는)이다
struct matrix_st* make_matrix (unsigned size) {
struct matrix_st* m = malloc(sizeof (struct matrix_st)
+ size*size*sizeof(double);
if (!m) { perror("malloc"); exit(EXIT_FAILURE); };
m->size = size;
memset(m->arr, 0, sizeof(double)*size*size);
return m;
}
그런 다음, 사용자는 단지 이러한 행렬을 확보
free
한 단일 호출을 사용할 수있다.
Linux에서 코딩하는 경우 gcc -Wall -g
으로 컴파일하고 valgrind 메모리 누수 감지기와 gdb 디버거를 사용하십시오.
아니요,'free (arr [i] [j])'는'double '값을'free'하려고 잘못했습니다. –
@BasileStarynkevitch 당신이 무엇을 말하려고하는지 잘 모르겠습니다. 제 방법이 잘못되면 어떻게해야하는지 알려주세요. – Ace
임시 변수를 사용하는 대신 ar에 즉시 저장하여 라이브를 두 번 많이 만듭니다. 사실, malloc이 void *를 반환하고 void ** 매개 변수를 취하지 않는 것처럼 double **을 반환하는 함수를 작성하는 것이 훨씬 쉽습니다. 그리고 free()가 void *를 취하는 것처럼, freeDoubleArr은 double ** 매개 변수를 취해야하며 포인터의 주소가 아니라 포인터를 전달해야합니다. – gnasher729