数组的所有返回值都是0

时间:2017-01-25 10:00:32

标签: c arrays pointers

昨天我在this问题中寻求帮助,现在情况好转,但不行。我重新发布了正确的代码,但它返回了另一个问题,尽管有更正。第二个函数将所有数组的值读为0。 我认为问题在于指针,但我无法理解如何修复它。

这是我的代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>

int leggiSequenza(char *nomeFile, int *seq) {

    FILE *in;
    int i;
    int dim;

    if((in = fopen(nomeFile, "r"))==NULL) {
        printf("Errore: impossibile leggere il fie in apertura.\n");
        return -1;
    }

    fscanf(in, "%d", &(dim));
    printf("Trovati %d valori.\n", dim);

    if(dim < 0) {
        printf("Errore: il numero di interi risulta negativo.\n");
        return -1;
    }

    seq = (int*) malloc(dim*sizeof(int));

    i=0;
    while(!feof(in) && i<(dim)) {
        fscanf(in, "%d", &seq[i]);
        i++;
    }

    for(i=0; i<(dim); i++) {
        printf("Il valore letto in posizione %d è: %d.\n", i+1, seq[i]);
    }


    fclose(in);
    free(seq);

    return dim;
    }




int numeroPassi(int *valori, int size) {

    int i;
    int somma;
    int passi[size];

    for(i=0; i<size; i++) {
        printf("valore in posizione %d = %d.\n", i+1, valori[i]);
    }

    somma=0;
    for(i=0; i<(size-1); i++) {
        somma = somma + abs(valori[i]);
    }

    printf("La somma del valore assoluto di tutti gli elementi è: %d.\n", somma);

    return 0;
}




int main(int argc, char* argv[]) {

    char nomeFile[200];
    int passi;

    printf("\n");

    printf("Inserire il nome del file:\n");
    scanf("%s", nomeFile);
    printf("\n");

    int * p = malloc(200*sizeof(int));
    int dim = leggiSequenza(nomeFile, p);
    printf("dimensione = %d\n", dim);
    printf("\n");

    passi = numeroPassi(p, dim);

    printf("\n");

    free(p);

    return 0;
}

2 个答案:

答案 0 :(得分:2)

您没有写入传递给leggiSequenza的数组。相反,你正在分配一个你写的新数组然后自由。

leggiSequenza删除以下行以解决该问题:

seq = (int*) malloc(dim*sizeof(int));

free(seq);

答案 1 :(得分:1)

int * p = malloc(200*sizeof(int));

好的,这里你分配了一些内存。现在将指针p传递给第一个函数:

int dim = leggiSequenza(nomeFile, p);

在这个函数中你有一个变量seq,它是一个实际指向p所在内存的指针。

让我们进一步展望:seq = (int*) malloc(dim*sizeof(int)); 在这里你分配了新的记忆,然后用它做了一些事情。

然后你调用free(seq),因此第二次调用malloc分配的内存被清除(p指向的内存仍然有效,但保持不变)

现在你致电passi = numeroPassi(p, dim);。这里使用p指向的内存,好像第一个函数没有更改