2011-12-14 3 views
0

몇 개의 파일에서 여러 개의 글로벌 포인터를 공유해야합니다. 포인터는 본질적으로 길이가 런타임에서 결정되는 double 배열입니다.C 포인터 - 하나의 파일에 다른 포인터를 사용하여 전역 포인터를 할당합니까?

여기에는 문제를 일으킨 코드 조각이 포함되어 있습니다. 이것은 정확한 코드가 아니지만, 그것은 정확하게 모든 점을 보여

foo.h

#ifndef FOOH 
#define FOOH 

/* ------------------ 
COMMON VARIABLES 
---------------------*/ 

// create_bundles.c 
extern double *all_bundle; 

/* ------------------ 
COMMON FUNCTIONS 
---------------------*/ 

// create_bundles.c 
void create_bundles(int num_firm); 

// memory_allocation.c 
void allocate_memory(int num_firm, int num_bundle); 
void clean_memory(void); 
#endif 

create_bundles.c

#include "foo.h" 

// create_bundles.c 
double *all_bundle = NULL; 

void allocate_memory(int num_firm, int num_bundle) { 
    all_bundle = calloc(num_bundle * num_firm, sizeof(double)); 
} 
void clean_memory(void) { 
    free(all_bundle); 
} 

주요

#include "foo.h" 
extern double *all_bundle; 

void create_bundles(int num_firm) { 
int i; 
    for (i = 0; i < num_firm; i++) { 
     all_bundle[i] = 1 
    } 

memory_allocation.c .c

#include "foo.h" 
void main(int num_firm, int num_bundle) { 
    allocate_memory(num_firm, num_bundle); 
    create_bundles(num_firm); 
    clean_memory(); 
} 

나는 all_bundle [i]를 출력하면 모두 0이 될 것이고, 그러면 세그먼트 오류가 발생합니다.

왜 오류 및 수정 방법?

+3

모든 코드를 보지 않고 명확하지 않습니다. 그러나 전역 파일을 파일간에 공유하는 것이 어떤 문제도 일으키지 않습니다. 포인터를 초기화하는 함수가 실제로 포인터를 수정하고 포인터의 로컬 복사본을 수정하는 것이 아니라 두 번 확인합니다. – TJD

+0

foo.h (또는' all_bundle')을 사용하여 모든 모듈 (* .c)에? – alk

+0

'num_firm' 값이 무엇인지 확인합니다. 디버거로 문제를 쉽게 찾을 수 있어야합니다. – Sulthan

답변

0

문제는 글로벌 포인터가 아니라 다른 것입니다. 공통 코드에서 문제를 계속 찾으십시오. clean_memory를 호출하기 전에 all_bundle 배열의 내용을 인쇄하려고 노력하시기 바랍니다. 귀하의 코드를 조금 편집했는데 세분화 오류없이 잘 작동하고 1.0000을 인쇄 할 수 있습니다.
foo.h :

#ifndef FOOH 
#define FOOH 

// create_bundles.c 
extern double *all_bundle; 

// create_bundles.c 
void create_bundles(int num_firm); 

// memory_allocation.c 
void allocate_memory(int num_firm, int num_bundle); 
void clean_memory(void); 

#endif 

memory_allocation.c :

#include <stdlib.h> 

#include "foo.h" 

double *all_bundle = 0; 

void allocate_memory(int num_firm, int num_bundle) { 
    all_bundle = calloc(num_bundle * num_firm, sizeof(double)); 
} 
void clean_memory(void) { 
    free(all_bundle); 
} 

create_bundles.c :

#include "foo.h" 

void create_bundles(int num_firm) { 
    int i; 
    for (i = 0; i < num_firm; i++) { 
     all_bundle[i] = 1; 
    } 
} 

여기가 살펴있다 main.c :

#include <stdio.h> 
#include "foo.h" 

int main(int argc, char *argv[]) { 
    allocate_memory(100, 1); 
    create_bundles(100); 

    { 
     int i; 
     for(i = 0; i < 100; ++i) 
      printf("%f\n", all_bundle[i]); 
    } 

    clean_memory(); 
    return 0; 
} 
+0

당신 말이 맞아요. 문제는 다른 것이 었습니다. 그것은 빨간 청어이었다. 감사. – user18115

0

메모리에 액세스 할 수있는 헤더 파일이 있습니다. 즉, 메모리에 액세스 할 수 있습니다 (예 : 메모리에 물건을 추가하거나 메모리에서 물건을 제거 할 수 있습니다.). 마법을 수행하려면 해당 .c (또는 .cpp)가 있어야합니다. 그런 다음 static을 사용하여 메모리를 정의하십시오.

이 방법은 문제를 간단하고 쉽게 해결할 수 있으며 필요한 경우 구현을 변경할 수도 있습니다.

+0

나는이 대답을 이해하지 못한다. 질문의 코드를보고 의미를 나타내는 데 도움을 줄 수 있습니까? 감사. – user18115

관련 문제