Каким образом структура в c может быть собрана и ввод данных осуществляется через переменную-указатель? - PullRequest
1 голос
/ 15 июня 2019

Я пытаюсь реализовать struct с указателем. У меня есть большая проблема, что я ввел переменную struct pointer и выделил память, используя malloc пусть переменная указателя будет "ptr", тогда ptr будет содержать адрес. тогда почему мы используем '&' перед переменной ptr. (scanf ("% s% d", & (ptr + i) -> тема, & (ptr + i) -> отметки);)

Давайте рассмотрим другой пример:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n, i, *ptr, sum = 0;

    printf("Enter number of elements: ");
    scanf("%d", &n);

    ptr = (int*) malloc(n * sizeof(int));
    if(ptr == NULL)                     
    {
        printf("Error! memory not allocated.");
        exit(0);
    }

    printf("Enter elements: ");
    for(i = 0; i < n; ++i)
    {
        scanf("%d", ptr + i);
        sum += *(ptr + i);
    }

    printf("Sum = %d", sum);
    free(ptr);
    return 0;
}

Вот почему мы не используем '&' перед ptr для получения ip ??

выяснить оба случая ??

Я сделал, не используя '&' в scanf при использовании структуры

struct course
{
   int marks;
   char subject[30];
};

int main()
{
   struct course *ptr;
   int i, noOfRecords;
   printf("Enter number of records: ");
   scanf("%d", &noOfRecords);

   ptr = (struct course*) malloc (noOfRecords * sizeof(struct course));

   for(i = 0; i < noOfRecords; ++i)
   {
       scanf("%s %d", &(ptr+i)->subject, &(ptr+i)->marks);
   }

   printf("Displaying Information:\n");

   for(i = 0; i < noOfRecords ; ++i)
       printf("%s\t%d\n", (ptr+i)->subject, (ptr+i)->marks);

   return 0;
}

если "&" задано правильно если нет, то это указывает на ошибку сегментации

1 Ответ

1 голос
/ 15 июня 2019

&(ptr+i)->marks эквивалентно &((ptr+i)->marks), что эквивалентно &(ptr[i].marks).
То есть & не относится к указателю ptr, он применяется к члену структуры ptr[i].
И член marks является int, поэтому вам нужно передать указатель.

& перед (ptr+i)->subject (ptr[i].subject) быть не должно, поскольку он уже преобразуется в char* при передаче в функцию.

...