Abaixo, um exemplo, sobre como passar uma estrutura de dados para uma função.
Ao receber a estrutura a função f() faz modificações nessa estrutura.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
// a estrutura. *d vai guardar somente o endereço do bloco de letras,
// não as letras, as letras vão tá na memória em algum lugar, essa
// variável vai conter algo como 0x123123123 que é o endereço da
// primeira letra, ou seja o A.
struct st{ int a; int b; int c; char *d; };
// recebe somente o endereço da estrutura
void f( struct st *ptr ){
unsigned int i,j=-1;
char *txt;
// modificando informações da estrutura, dentro da função!
ptr->a = 11;
ptr->b = 22;
ptr->c = 33;
int from=65;
int to=90;
int total = to - from;
// vamos gravar as letras, portanto alocar memória
txt = malloc( total * sizeof(char) + 1 ); // +1 é para o NULL no final.
memset( txt, 0, total * sizeof(char) ); // zerando a memória
// gravando as letras no buffer.
for( i = from; i < to; i++ ){
// via gravar o código do carater no endereço de txt[0]...
memset( &txt[++j], i, sizeof(char) );
}
ptr->d = txt; // atribuindo o texto com as letras na estrutura
}
int main(int argc, const char *argv[]){
struct st s; // nossa estrutura vai se chamar s
// modificações que serão perdiads, pois serão alteradas na f()
s.a = 1;
s.b = 2;
s.c = 3;
f( &s ); // passando somente o endereço da estrutura para f()
// veja que os valores serão os que foi gravado na função
fprintf(stderr,"a=%d b=%d c=%d\nd=%s\n\n", s.a, s.b, s.c, s.d );
return 0;
}