2012-03-12 3 views
0

파일에서 특정 바이트를 포함 할 것으로 예상되는 포인터 dp의 값을 사용하거나 인쇄하려고하지만 다음과 같이 말합니다. "세그먼트 오류 (코어 덤프 됨)" 또한 원하는 경우 "m"또는 "n"을 인쇄하면 같은 오류 메시지가 나타납니다. 포인터 m, n, dp의 값을 어떻게 사용할 수 있습니까? % f을 % f (으)로 바꿨습니다.C에서 포인터 값 사용 또는 인쇄

감사

#include <stdio.h> 
#include <stdlib.h> 
void read_file(char * s, int * mp, int * np, double ** dpp) 
{ 
    int m, n ; 
    double * dp ; 
    FILE * fp ; 

    fp = fopen (s, "r") ; 
    if (fp == NULL) { 
     fprintf(stderr,"read_file(): Unable to open file '%s'\n", s) ; 
     exit(12) ; 
    } 

    fread(&m, sizeof(int), 1, fp) ; 
    fread(&n, sizeof(int), 1, fp) ; 

    /* printf("m = %d, n = %d\n", m, n) ; */ 
    dp = (double *) malloc(m * n * sizeof(double)) ; 
    if (dp == NULL) { 
      fprintf(stderr,"read_file(): malloc failed for %d bytes on file '%s'\n", m*n*sizeof(double), s) ; 
      exit(13) ; 
    } 

    fread(dp, sizeof(double), m*n, fp) ; 
    fclose (fp) ; 

    *mp = m ; *np = n ; 
    *dpp = dp ; 
} 

int main() 
{ 

    char *s="g.dat"; 
    int *m;int *n; 
    double *dp; 

    read_file(s,m,n,&dp); 

    printf("it crashes here... %f\n",*dp); 
} 

의 printf가 ON ("인쇄 ... %의 F \ 없음"* DP)에 충돌; 동일한 분할 오류 메시지가 표시됩니다.

+0

(초기화되지 않은) 포인터를 사용하는 것 외에도 double (형식'% f') 인 경우이를 문자열 ('% s '형식)로 인쇄합니다. –

+0

은'read_file'의 구현을 보여줍니다. 특히'dpp '를 어떻게 사용하고 있는지. – Naveen

+0

왜'read_file()'에서 모든 것을 제거 했습니까? 그것이하는 일은 전달 된 매개 변수를 처리하는 방법에 대한 대답을 알리는 것입니다. 또한, 거기에 거기에 고정 필요가 좋은 기회가있어. –

답변

0

초기화되지 않은 포인터를 역 참조하기 때문에 오류가 발생합니다. dp이 선언되었지만 read_file에서 변경된 적이 없습니다.

지금은 그냥 매달려있는 포인터 일 뿐이므로 가치가있는 인쇄물이 무엇인지 알 수 없습니다.

printf("printing ... %s\n",*dp);  

또한, *dpdouble을 반환하지만 당신은 const char*%s를 통해 기대하는 printf을 말하는 것입니다.

1

%s은 문자열 (예 : char *)의 지정자이며 올바른 char 포인터가 아닌 double을 지정합니다. double을 인쇄하려면 %f

변수의 이름 인쇄에 관해서 - 이것은 컴파일시 변수 이름을 제거하므로 C 언어에서는 불가능합니다. 당신이 비록 매크로를 사용하여 수행 할 수 있습니다

#define NAME_AND_VAL(X) #X, X 
int main(int argc, char * argv[]) { 
    int a = 1; 
    int * b = &a; 
    printf("%s = %d\n", NAME_AND_VAL(a)); 
    printf("%s = %d\n", NAME_AND_VAL(*b)); 
    return 0; 
} 

출력 :

a = 1 
*b = 1 
+0

감사하지만 방금 % s에서 % f (코어 덤프)로 계속 변경했습니다. – Percy

+0

@ 퍼시 - 새 코드를 추가했는데 어디에서 충돌이 발생합니까? (인쇄물을 추가하여 어디서 구합니까) – MByD

+0

I 메인의 마지막 printf 명령에서 충돌이 발생합니다. – Percy

-1

포인터 오류 경향을, 포인터 런타임 오류의 대부분은 올바르게 초기화하기 없습니다 때문입니다. 주소를 지정하기 전에 사용하십시오.

+0

아니요, 그는 dobule **을 전달합니다. –