недопустимый аргумент типа '->' (иметь 'struct arr') - PullRequest
0 голосов
/ 19 марта 2020
#include<stdio.h>
#include<stdlib.h>

struct arr{
    int *temp;
    int size;
}*var;

void inputArray(int);
void displayArray(int);

int main()
{

    int cases,i;
    printf("Enter the no of test cases\n");
    scanf("%d",&cases);
    for(i=0;i<cases;++i)
    {
        printf("Entering test case %d:\n\n",i+1);
        inputArray(i);
    }
    printf("You have entered the following\n");
    for(i=0;i<cases;++i)
    {
        printf("Test case %d\n\n",i+1);
        displayArray(i);
    }
    return 0;
}

void inputArray(int count)
{
    int i;
    printf("Enter the size of the array\n");
    scanf("%d",&(var+count)->size);
    (var+count)->temp=(int*)malloc(sizeof(int)*(var+count)->size);
    if((var+count)->temp==NULL)
    {
        printf("NOT ENOUGH MEMORY IN HEAP");
        exit(1);
    }
    printf("Enter the array\n");
    for(i=0;i<(var+count)->size;++i)
    {
        scanf("%d", &(var+count)->temp[i] );
    }

}

void displayArray(int count)
{
    int i;
    printf("\n");
    for(i=0;i<(var+count)->size;++i)
    {
        printf(" %d ",(var+count)->temp[i]);
    }
    printf("\n");
}

В приведенном выше коде всякий раз, когда я заменяю (var+count)-> ... на var[count]->, он показывает ошибку: «недопустимый аргумент типа« -> »(есть« struct arr »)», но нет проблема, когда я использую temp[i] или temp+i. И var, и temp являются указателями. Так почему я получаю эту ошибку?

Еще один не связанный вопрос, где или когда мне нужно освобождать динамически размещенный указатель temp. temp был динамически размещен внутри функции void inputArray(int);, которая вызывается в al oop в main.

Ответы [ 2 ]

2 голосов
/ 19 марта 2020

(var+count) ! = var[count] но

*(var+count) == var[count]

и потому

(*(var+count)).temp или (var+count)-> temp, затем

var[count].temp или (&var[count]) -> temp

MAKE SURE var правильно инициализируется и ссылается на действительный объект перед используя это !!

1 голос
/ 19 марта 2020

Объявленный указатель со значением c хранения

struct arr{
    int *temp;
    int size;
}*var;

инициализируется нулями и не указывает на выделенную память.

Таким образом, ваша программа имеет неопределенное поведение.

По крайней мере, вам нужно выделить массив типа struct arr с регистрами elements перед вызовом функций.

Например

var = malloc( cases * sizeof( struct arr ) );

Что касается вопроса

В приведенном выше коде всякий раз, когда я заменяю (var + count) -> ... на var [count] ->, появляется сообщение об ошибке: «неверный аргумент типа» ->

, тогда выражение var[count] не является указателем. Оно имеет тип struct arr.

Вот демонстрационная программа, которая показывает, как может быть выполнено назначение.

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

struct arr
{
    int *temp;
    size_t size;
};

void inputArray( struct arr *var, size_t count )
{
    printf( "Enter the size of the array: " );

    size_t n = 0;

    scanf( "%zu", &n );

    ( var + count )->temp = malloc( n * sizeof( int ) );

    if ( ( var + count )->temp == NULL )
    {
        ( var + count )->size = 0;
    }
    else
    {
        ( var + count )->size = n;

        if ( n != 0 )
        {
            printf( "Enter %zu element(s) of the array: ", n );
            for ( size_t i = 0; i < n; ++i )
            {
                scanf( "%d", &( var + count)->temp[i] );
            }
        }           
    }

    putchar( '\n' );
}

void displayArray( const struct arr *var, size_t count )
{
    for ( size_t i = 0; i < ( var + count )->size; ++i )
    {
        printf( "%d ", ( var+count )->temp[i] );
    }
    putchar( '\n' );
}

int main(void) 
{
    printf( "Enter the no of test cases: " );

    size_t n = 0;

    scanf( "%zu", &n );

    struct arr *var = malloc( n * sizeof( struct arr ) );

    if ( var == NULL ) 
    {
        puts( "Error. Not enough memory." );
        n = 0;
    }

    for ( size_t i = 0; i < n; i++ )
    {
        printf( "Entering test case %zu:\n", i+1 );
        inputArray( var, i );
    }

    if ( n != 0 )
    {
        puts( "You have entered the following" );

        for ( size_t i = 0; i < n; ++i )
        {
            printf("Test case %zu:" ,i + 1 );
            displayArray( var, i );
        }

        for ( size_t i = 0; i < n; ++i )
        {
            free( ( var + i )->temp );
        }
    }

    free( var );

    return 0;
}

Вывод программы может выглядеть как

Enter the no of test cases: 5
Entering test case 1:
Enter the size of the array: 1
Enter 1 element(s) of the array: 1
Entering test case 2:
Enter the size of the array: 2
Enter 2 element(s) of the array: 1 2
Entering test case 3:
Enter the size of the array: 3
Enter 3 element(s) of the array: 1 2 3
Entering test case 4:
Enter the size of the array: 4
Enter 4 element(s) of the array: 1 2 3 4
Entering test case 5:
Enter the size of the array: 5
Enter 5 element(s) of the array: 1 2 3 4 5
You have entered the following
Test case 1:1 
Test case 2:1 2 
Test case 3:1 2 3 
Test case 4:1 2 3 4 
Test case 5:1 2 3 4 5 
...