использовать или напечатать значение указателя в c - PullRequest
0 голосов
/ 12 марта 2012

Я хочу использовать или напечатать значение указателя dp, которое должно содержать определенный байт из файла, но оно говорит: "ошибка сегментации (сброшено ядро)" Также, если я хочу напечатать "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);  
}

сбой при печати («печать ...% f \ n», * dp); с тем же сообщением об ошибке сегментации.

Ответы [ 3 ]

1 голос
/ 12 марта 2012

%s - это спецификатор для строки (например, 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 голосов
/ 12 марта 2012

указатели подвержены ошибкам, большинство ошибок времени выполнения указателя происходит из-за их неправильной инициализации. и используя их до назначения адреса.

0 голосов
/ 12 марта 2012

Вы получаете ошибку, так как вы разыменовываете неинициализированный указатель. dp объявлен, но никогда не изменяется в read_file.

Как и сейчас, это просто висящий указатель, я не вижу, чего бы печатало его значение.

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

Также, *dp возвращает double, но вы говорите printf ожидать const char* через %s.

...