C: ajout d'élément de tableau alloué dynamiquement
J'ai essayé de trouver une solution via Google: je ne pouvais pas trouver quelque chose qui a aidé; il paraît même que si je faisais cela correctement. Les seules pages que j'ai pu trouver concernant l'envoi de mon tableau alloué dynamiquement via une fonction traitées avec la matrice à l'intérieur d'une structure, qui est scalaire, donc se comporte différemment. Je ne veux pas utiliser une structure en ce moment, je suis en train d'apprendre à propos de BARRAGE et de travailler avec des pointeurs et des fonctions.
Cela dit, je suis sûr que c'est très primaire, mais je suis coincé. Le code compile, mais il se fige quand je lance l'exécutable. (Je suis en utilisant minGW gcc, si ce qui compte. Et je ne suis pas clair du tout, dès maintenant, sur la façon d'utiliser gdb.)
Voici le code (finalement, je veux que l'ensemble du code à une liste de tableaux-comme structure de données):
#include <stdio.h>
#include <stdlib.h>
void add( int element, int *vector);
void display_vector( int *vector );
void initialize_vector( int *vector );
int elements = 0;
int size = 10;
int main(void)
{
int *vector = 0;
initialize_vector(vector);
add(1, vector);
//add(2, vector);
//add(3, vector);
//add(4, vector);
//add(5, vector);
//add(6, vector);
//add(7, vector);
//add(8, vector);
//add(9, vector);
//add(10, vector);
//add(11, vector);
display_vector(vector);
return 0;
}
void add( int element, int *vector)
{
vector[elements++] = element;
return;
}
void display_vector( int *vector )
{
int i;
for( i = 0; i < elements; i++)
{
printf("%2d\t", vector[i]);
if( (i + 1) % 5 == 0 )
printf("\n");
}
printf("\n");
return;
}
void initialize_vector( int *vector )
{
vector = (int *)malloc(sizeof(int) * size);
}
- Pourquoi avez-vous
elements
etsize
comme des variables globales, maisvector
est une variable locale? Puisque vous ne pouvez pas avoir plus d'un vecteur à cause de la globalelements
variable, vous pourriez aussi bien fairevector
une variable globale ainsi. - Vous affectez l'adresse de la mémoire nouvellement allouée pour le pointeur. L'original pointeur est toujours un NULLPTR.
- Très bon point @Barmar.
- ne dois-je pas faire l'original pointeur null alors? Il s'exécute de la façon dont il est mis en place maintenant avec dboals modifications de code.
Vous devez vous connecter pour publier un commentaire.
Modifié pour le rendre un peu plus clair.
Le problème est votre routine init est de travailler avec une copie de "vecteur" et est malloc qui pratiquent dans cette copie plutôt que l'original de vecteur de pointeur. Vous perdez le pointeur vers le bloc de mémoire sur le retour de l'initialiser.
Changer le paramètre de vecteur à une poignée (pointeur de pointeur) dans cette fonction,
Ensuite modifier l'appel à init pour ce
Je n'ai pas le compiler, mais il faut corriger le code.
*vector = ...
En C, la fonction, les arguments sont passés par valeur, ce qui signifie qu'il est une copie locale pour tous les arguments passés à une fonction, si vous modifiez un argument dans une fonction, vous modifiez uniquement la copie locale de cet argument. Donc, si vous voulez changer la valeur d'un argument dans une fonction, vous devez passer son adresse à cette fonction, derefer que l'adresse et affecter le résultat de cette fonction.
Assez pour la théorie, voici comment réparer votre code:
Dans plus d'autres réponses, je voudrais suggérer une autre approche.
En supposant au moins C99 conforme compilateur, je préfère suggérons de garder la taille allouée à un membre d'une structure en terminant par une flexible membre du groupe (voir aussi cette) comme:
Alors vous construire un tel vecteur avec
Pour ajouter un élément dans un vecteur, en retournant le vecteur d'origine ou un grand un:
et vous pourriez code:
À la libération comme un vecteur, il suffit d'utiliser
free(myvec);
Si vraiment vous ne voulez pas utiliser de
struct
vous devriez garder à l' variables distinctes utilisés pour la longueur du vecteur, la répartition de la taille de votre vecteur, le pointeur de votre allouée dynamiquement tableau:Si vous voulez être en mesure de gérer plusieurs vecteurs, puis placez l'ensemble au-dessus de longueur utile, réparti de la taille et tableau dynamique dans certains
struct dynamic_array_st
(dont le pointeur que vous devez passer à la appropriée des routines commemake_dynamic_vector(struct dynamic_array_st*)
,append_dynamic_vector(struct dynamic_array_st*, int)
, etc ....) ou bien les transmettre sous forme de trois formals de routines similaires, puis vous aurez besoin pour passer leur adresse parce que les routines de les changer, par exemple,create_dynamic_vector(unsigned *countptr, unsigned *sizeptr, int**vectarrptr)
que vous invoquez commecreate_dynamic_vector(&mycount, &mysize, &myvectarr);
etc.Je pense qu'un flexible de membre du groupe est toujours le plus propre approche.