Convertir une variable non-pointeur en pointeur en tableau

Ok, je comprends que mon titre peut être un peu déroutant, mais je vais expliquer. Je travaille sur un devoir en C. On me donne un fichier .c et je dois proposer des implémentations pour certaines fonctions.

En bref, j’ai ceci comme un fichier .c

typedef int set_t; ... void init(set_t *a, int N); // Initialized an array to a of size N ... int main() { set_t a; init(&a, 10); } 

Dans quelques implémentations que j’ai trouvées, j’ai pu créer un tableau en utilisant un, mais je continue à avoir des erreurs de segmentation lorsque le programme est exécuté: – /. Est-il possible d’initialiser a tableau sans rien modifier dans le fichier .c d’origine, à l’ exception de l’implémentation de init(set_t *a, int N) ?

MODIFIER

Voici ma mise en œuvre actuelle de init -> cela conduit à une erreur de segmentation

 void init(set_t *a, int N) { //set_t thing[10]; *a = malloc(sizeof(set_t)*N); for (int i = 0; i < N; i++) { *(a + i) = i; } printf("value of a[2] = %d\n", a[2]); } 

Dans l’état actuel des choses, les exigences qui vous sont imposées sont totalement déraisonnables. Si vous ne construisez que pour 32 bits, donc sizeof(int) == sizeof(int *) , vous pouvez utiliser un casting brutal pour contourner les contraintes. Cependant, le code ne fonctionnera pas sur une machine 64 bits (à moins que sizeof(int) == sizeof(int *) , ce qui n’est le cas sur aucune machine à laquelle je peux penser immédiatement.

Ainsi, la force brute et la technique de lancer sont:

 void init(set_t *a, int N) { assert(sizeof(set_t) == sizeof(set_t *)); // Ick, but necessary! set_t *base = malloc(sizeof(set_t)*N); if (base == 0) *a = 0; else { *a = (int)base; // Brutal; non-portable; stupid; necessary by the rules given! for (int i = 0; i < N; i++) { base[i] = i; printf("value of a[2] = %d\n", base[2]); printf("value of a[2] = %d\n", ((int *)*a)[2]); // Brutal and stupid too } } 

De plus, dans le code de main() , vous devrez utiliser ((int *)a) pour rendre le type utilisable pour le déréférencement, etc. que tout va marcher. Peut-être, mais probablement pas.

À ce stade, cela ressemble à quelqu'un qui trompe criminellement les programmeurs novices innocents. Ce n'est pas la façon dont il devrait être codé du tout. Cependant, si c'est ce que le médecin (professeur) ordonne, c'est ce que vous devez faire. Mais c'est une parodie des bonnes pratiques de codage AFAICS et AFAIAC.

Le professeur s’est rendu compte qu’il avait commis une erreur dans la tâche et l’a corrigé. Changé set_t a à set_a *a .

Merci pour votre aide (espérons que je n’ai pas causé trop de maux de tête!