2012-03-12 46 views
0

我想使用或打印應該包含文件中某個字節的指針dp的值,但它說:「段錯誤(核心轉儲)」另外,如果我想打印「m」或「n」我得到相同的錯誤信息。我怎樣才能使用指針m,n,dp的值?我只是將%s更改爲%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( 「印刷......%F \ n」,* DP);與相同的分段錯誤消息。

+0

除了使用(可能)未初始化的指針,當它是雙精度型(格式爲%f')時,它將以字符串形式打印(格式爲'%s')。 – 2012-03-12 08:06:34

+0

向我們展示了'read_file'的實現。特別是你如何使用'dpp'。 – Naveen 2012-03-12 08:07:07

+0

爲什麼你從'read_file()'中刪除所有內容?它正在做什麼可能會告訴答案如何處理傳遞給它的參數。另外,有一個很好的機會,那裏有東西需要修復。 – 2012-03-12 08:08:44

回答

0

由於您取消引用未初始化的指針,您會收到此錯誤。 dp已聲明,但從未更改過read_file

就像現在這只是一個懸掛指針,我不知道打印它的值會達到什麼目的。

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

此外,*dp返回double,但你告訴printf一個const char*通過%s期待。

1

%s是字符串的說明符(例如char *),並且您給它一個double值,當然這不是有效的char指針。打印雙精度,使用%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 2012-03-12 08:12:26

+0

@Percy - 你添加了一個新的代碼,你從哪裏得到崩潰?(添加打印看看你在哪裏得到) – MByD 2012-03-12 08:14:25

+0

我得到main中最後一個printf指令的崩潰。 – Percy 2012-03-12 08:17:14

-1

指針是容易出錯,大多數指針的運行時錯誤是由於沒有正確intialize他們。並在分配地址之前使用它們。

+0

不,他通過了一個dobule **。 – 2012-03-12 08:06:21