C 数组的所有返回值均为0

C 数组的所有返回值均为0,c,arrays,pointers,C,Arrays,Pointers,昨天我在问题上寻求帮助,现在情况有所好转,但不太好。我重新发布了正确的代码,但它返回了另一个问题,尽管进行了更正。第二个函数将数组的所有值读取为0。 我认为问题在于指针,但我不明白如何解决它 这是我的密码: #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> int leggiSequenza(char *nomeFile, int *seq)

昨天我在问题上寻求帮助,现在情况有所好转,但不太好。我重新发布了正确的代码,但它返回了另一个问题,尽管进行了更正。第二个函数将数组的所有值读取为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;
}
#包括
#包括
#包括
#包括
int-legisequenza(字符*nomeFile,int*seq){
文件*in;
int i;
int-dim;
if((in=fopen(nomeFile,“r”))==NULL){
printf(“错误:不可能在apertura中出现错误。\n”);
返回-1;
}
fscanf(在、%d、&(dim)中);
printf(“Trovati%d valori.\n”,dim);
如果(尺寸<0){
printf(“错误:内部数字为负数。\n”);
返回-1;
}
seq=(int*)malloc(dim*sizeof(int));
i=0;

当(!feof(in)&&i时,您不是在向传递给
leggiSequenza
的数组写入数据,而是在分配一个新数组,然后将其写入并释放

从leggiSequenza中删除以下行以修复该问题:

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

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

int dim=leggiSequenza(nomeFile,p);

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

让我们进一步看看:
seq=(int*)malloc(dim*sizeof(int));
在这里,您分配了新内存,然后使用它做一些事情

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


现在您调用
passi=numeriopassi(p,dim)
。这里使用的是
p
指向的内存,就好像第一个函数没有更改一样

如果你希望有人阅读这个问题,请编辑你的代码并将其正确缩进。如果你在代码中使用英语,会容易得多。对不起,你是对的。我忘记更改语言了。谢谢!现在我明白你的意思了“这是个错误。太好了。”弗兰兹戈勒-记住你所理解的。这只是现在的正确答案。
free(seq);
int * p = malloc(200*sizeof(int));