我想使用或打印指针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);使用相同的分段错误消息。
答案 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)
指针容易出错,大多数指针运行时错误都是由于没有正确初始化它们。并在分配地址之前使用它们。