动态数组上的分段错误(核心转储)错误

时间:2014-10-31 17:22:47

标签: c

我在尝试构建动态数组时遇到了这个问题,我认为realloc函数有什么问题,如果你能帮我一把,我会很感激。 我能够第一次输入名字,但是当我第二次进行时,问题就开始了

typedef struct {
      char nom[30], prenom[20];
      int age;

        } ITEM;

        void Lire(ITEM **items, int *nb_items)
        {
           int i = 0;

           printf("* Entrer les donnees et taper . pour terminer\n\n");

           for (i = 0; TRUE; i++) 
            {

                   ITEM *temp = (ITEM *) realloc(*items, ((i + 1) * sizeof(ITEM)));
                    if (temp == NULL)
                    {
                        free(*items);
                        printf("Il n'y a pas de memoire! \n");
                        exit (0);
                    }
                    *items = temp;
                    printf("> nom    : ");
                    scanf("%s", (*items[i]).nom);

                    if ((*items[i]).nom[0] == '.')
                    break;

                    printf("> prenom : ");
                    scanf("%s", (*items[i]).prenom);

            }
        }
int main(int argc, char *argv[])
{
   ITEM *items;
   int nb_items=0;
   items = (ITEM *) malloc(sizeof(ITEM));
   if(items == 0)
   {
       printf("Il n'y a pas de memoire! \n");
       exit (0);
   }
   Lire(&items, &nb_items);
   free (items);
   exit(0);
}

3 个答案:

答案 0 :(得分:2)

您的问题在于运算符优先级:*items[i]计算结果为items[i][0],您需要items[0][i],即:{/ p>

(*items)[i]

答案 1 :(得分:1)

数组下标访问比*更紧密。这会导致*items[i]被解释为*(items[i]),例如在此声明中:

scanf("%s", (*items[i]).nom);

因此访问items就好像它是指向ITEM的指针数组一样。实际上它是指向ITEM结构数组的指针,应该像这样访问:

scanf("%s", (*items)[i].nom);

答案 2 :(得分:0)

让我的生活更轻松

            *items = temp;
            ITEM *current = &temp[i];
            printf("> nom    : ");
            scanf("%s", current->nom);
            ...etc

使代码更易于阅读并简化整个运算符优先级isuuse