为什么使用指针不改变'main'中的值?

时间:2016-06-06 10:24:19

标签: c

使用指针时遇到一些问题。在这个程序中,我想输入一个带有ElaboraTesto的文本,然后输入Sdoppia来将标记放入两个不同的数组中:

  • StructTesto Pari[]如果他们的长度是均匀的。
  • StructTesto Dispari[]如果他们的长度是奇数。

看起来很有效。

我使用ordinaPari后必须根据长度排序令牌,但是当我尝试打印包含奇数令牌的数组时,stampaStruttura没有输出,我输入奇数话。

我尝试调试程序(参见下面的代码),我发现varavarb始终为0。

我错过了什么?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define DIMMAX 100

typedef char Stringa[DIMMAX];
typedef Stringa TESTO[DIMMAX];
typedef struct{

    Stringa parola;
    int lunghezza;

} StructTesto;

int ElaboraTesto(TESTO, int);
void Sdoppia(TESTO, int, StructTesto[], int* , StructTesto[], int*);
void stampaStruttura(StructTesto[], int);
void ordinaPari(StructTesto[], int);

void Sdoppia(TESTO t, int l, StructTesto Pari[], int* lp, StructTesto       Dispari[DIMMAX], int* ld){

int i;
StructTesto p;
int rest;
int j=0;
int k=0;
ld = &j;
lp = &k;

for(i=0; i<l; i++){

        strcpy(p.parola, t[i]);
        p.lunghezza = strlen(p.parola);
        rest = p.lunghezza % 2;

        if (rest != 0){

                strcpy(Dispari[j].parola ,p.parola);
                Dispari[j].lunghezza = p.lunghezza;
                j++;

        } else {

                strcpy(Pari[k].parola , p.parola);
                Pari[k].lunghezza = p.lunghezza;
                k++;

        }

}

    *ld = j;    
    *lp =k;

} 

void stampaStruttura(StructTesto array[], int n){

int i;

for(i=0; i<n; i++){

   printf("Parola: %s\n", array[i].parola);
   printf("Lunghezza: %d\n", array[i].lunghezza);
}
}

int ElaboraTesto(TESTO t, int n){

    char *tokenPtr; 
    Stringa testo;
    int i;

    printf("Inserire il testo da elaborare: (MAX %d parole)\n", DIMMAX);
    gets(testo);
    printf("Il testo che verra' tokenizzato e' il seguente:\n%s\n", testo);
    printf("I token sono:\n");

    tokenPtr = strtok(testo, " ");

    while(tokenPtr != NULL){

        printf("%s\n", tokenPtr);
        strcpy(t[i], tokenPtr);
        tokenPtr = strtok(NULL, " ");
        i++;

    }
    printf("Il testo e' composto da %d parole.\n", i);
    return i;

}

void ordinaPari(StructTesto P[], int n){

int i;
StructTesto temp;

   for(i=0; i<n; i++){

        if(P[i].lunghezza < P[i+1].lunghezza){
                temp = P[i];
                P[i] = P[i+1];
                P[i+1] = temp;
       }
  }
  }

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

    TESTO testo;
    int n;
    int dim;
    int vara = 0;
    int varb = 0;
    StructTesto p[DIMMAX];
    StructTesto d[DIMMAX];

    n = ElaboraTesto(testo, DIMMAX);
    Sdoppia(testo, n, p,&vara,d,&varb);
    stampaStruttura(p, n);
    ordinaPari(p,vara);
    stampaStruttura(p, vara);

    }



    return 0;
}

1 个答案:

答案 0 :(得分:2)

Sdoppia函数中,您有以下四行:

int j=0;
int k=0;
ld = &j;
lp = &k;

这个问题是你传入的main函数中的变量指针将被指向局部变量jk的指针覆盖。

所以当你以后做

*ld = j;    
*lp =k;

您实际上是将j分配给自己,k分配给自己(即您只是在做j = jk = k)。

解决方案是不对ldlp进行初始重新分配。