在c中使用或打印指针值

时间:2012-03-12 08:01:53

标签: c pointers segmentation-fault

我想使用或打印指针dp的值,该指针dp应该包含文件中的某个字节,但它表示:“segment fault(core dumped)”如果我想要打印“ m“或”n“我收到相同的错误消息。如何使用指针m,n,dp的值?我只是将%s更改为%f,它表示相同的消息。

由于

#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);使用相同的分段错误消息。

3 个答案:

答案 0 :(得分:1)

%s是字符串的说明符(例如char *),你给它一个double,当然它不是一个有效的char指针。要打印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

答案 1 :(得分:0)

由于您要取消引用未初始化的指针,因此出现错误。 dp已声明read_file,但在 printf("printing ... %s\n",*dp); 中从未更改。

就像现在一样,它只是一个悬垂的指针,我看不出它的价值会打印什么。

*dp

此外,double会返回printf,但您告诉const char*期望%s通过{{1}}。

答案 2 :(得分:-1)

指针容易出错,大多数指针运行时错误都是由于没有正确初始化它们。并在分配地址之前使用它们。