2015-09-09 3 views
-1

Программа считывает данные из файла в массив, load_data загружает данные в массив ar. Однако почему я получаю Segmentation fault (core dumped), когда я обращаюсь к этому массиву в main.Почему я не могу получить доступ к расположенной памяти?

#include <stdio.h> 
#include <stdlib.h> 
long int load_data(double * ar); 

int main(void) 
{ 
    long int n,i; 
    double * ar; 
    FILE * fp; 
    double number; 

    n=load_data(ar); 

    fp = fopen("data-copy.txt","w"); 
    //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
    for(i=0; i<n; i++) 
     fprintf(fp,"%lf\n", ar[i]); //problem here! I can't access! 
    //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
    fclose(fp); 

    printf("The number of elements in the file is:%ld\n",n); 
} 

long int load_data(double * ar) 
{ 
    FILE * fp; 
    double temp; 
    long int n=0,i; 

    fp = fopen("data.txt","r"); 
    while(fscanf(fp,"%lf",&temp)==1) 
     n++; 
    fclose(fp); 
    //load memory 
    ar = (double*)malloc(sizeof(double)*n); 

    fp = fopen("data.txt","r"); 
    for(i=0; i<n; i++) 
    { 
     fscanf(fp,"%lf",ar+i); 
    // printf("%lf\n",ar[i]);//This print well! 
    } 
    fclose(fp); 

    return n; 
} 
+2

Вы отправляете 'ar' по значению. Таким образом, 'ar' в' main' отличается от 'ar' в' load_data'. Прочитайте [this] (http://stackoverflow.com/questions/24052243/why-cant-we-pass-the-pointer-by-reference-in-c). –

+0

@JohnnyMopp Я думал, что это очень похоже на массив. Для массива я передаю его по адресу ... Спасибо, я исправлю это. – buzhidao

ответ

0

см. Список программ, приведенный ниже - я изменил код, чтобы вы отправили указатель на указатель ar ... теперь это работает отлично. Комментарий @Johnny Mopp замечательный.

#include <stdio.h> 
#include <stdlib.h> 
long int load_data(double ** ar); 

int main(void) 
{ 
    long int n,i; 
    double * ar; 
    FILE * fp; 
    double number; 

    n=load_data(&ar); 

    fp = fopen("data-copy.txt","w"); 
    //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
    for(i=0; i<n; i++) 
     fprintf(fp,"%lf\n", ar[i]); //problem here! I can't access! 
    //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
    fclose(fp); 

    printf("The number of elements in the file is:%ld\n",n); 
} 

long int load_data(double ** ar) 
{ 
    FILE * fp; 
    double temp; 
    long int n=0,i; 

    fp = fopen("zdata.txt","r"); 
    while(fscanf(fp,"%lf",&temp)==1) 
     n++; 
    fclose(fp); 
    //load memory 
    *ar = (double*)malloc(sizeof(double)*n); 

    fp = fopen("zdata.txt","r"); 
    for(i=0; i<n; i++) 
    { 
     fscanf(fp,"%lf",*ar+i); 
    // printf("%lf\n",ar[i]);//This print well! 
    } 
    fclose(fp); 

    return n; 
} 
+0

Спасибо за ваш ответ! прекрасно работает! – buzhidao

1

Все аргументы функции в C проходят по значению.

Вашей main функции копирует Значение ar (значение мусора), чтобы везде, где компилятор помещает аргументы функции (как правило, в указанных регистрах или в стеке).

В функции load_data копия ar изменяется на указатель на блок памяти но main оригинальный ar неизменен и до сих пор мусор.

Когда вы выходите из функции, вы выбрасываете копию ar (утечка блока malloc). Затем вы пытаетесь разыменовать оригинал ar, который все еще мусор.

Смежные вопросы