Мутация массива в C - PullRequest
3 голосов
/ 08 июля 2019

Если массивы в C имеют фиксированный размер, то почему этот код работает правильно?Этот код работает, но мой учитель сказал, что я сделал это неправильно ...

int main()
{
    int n,element,i;
    printf("Enter the size of Array : ");
    scanf("%d",&n);
    int a[n];

    for(i=0;i<n;i++){
        printf("Enter  %d no element : ",i+1);
        scanf("%d",&a[i]);
    }

    printf("Enter the new element to be inserted at the End: ");
    scanf("%d",&element);

    n=n+1;
    a[n-1]=element;

    for(i=0;i<n;i++){
        printf("%d\t",a[i]);
    }
}

Ответы [ 3 ]

5 голосов
/ 08 июля 2019

не работает. По крайней мере, не надежно. Это неопределенное поведение , так как вы обращаетесь к памяти вне массива. Если вы не выходите слишком далеко за пределы массива, он часто работает, но делать это очень опасно, и то, как вы его обрабатываете, неприемлемо ни при каких обстоятельствах.

Если вам нужно изменить размер, используйте динамическое распределение следующим образом:

int *a = malloc(n*sizeof(*a));
if (!a) { /* Handle error */ }

и затем:

n=n+1;
// Using a void pointer, because this pointer should not be used for 
// dereferencing
void *tmp = realloc(a, n*sizeof(*a));
if (!tmp) { /* Handle error */ }
a = tmp;

На самом деле, я бы предпочел динамическое распределение вместо использования VLA: s в любой день. Тот факт, что они сняли требование к компиляторам поддерживать их в стандартах современного C, является хорошим признаком того, что их использование является плохой идеей. А поскольку их поддержка больше не является обязательной, их использование МОЖЕТ нарушить ваш код в будущем.

0 голосов
/ 08 июля 2019

На High Speed ​​Rail вы покупаете билет, и очень повезло, что рядом с вами есть еще один пустой сайт, а затем вы кладете на него свою сумку. Это не означает, что вы владеете этим сайтом, просто потому, что у вас нет другогосайт сейчас.

На самом деле для программы вы не объявляете, что владеете этой памятью, вы можете исправить ее и делать все нормально, пока одна программа не объявляет свою память.встань рядом с тобой и покажи свой билет.

int a[n];//mean you own n size of int so you  own a[0]~a[n-1] this n mean in this line your n value,if next line n increase a's size will not increase
//------------------------------------------------------------
//Not legal because n is not const
int a[n];
//------------------------------------------------------------
//In fact this is legal
int *a;
a=(int*)malloc(sizeof(int)*n);//will alloc n of int for you
    //Do something you want
    //
free(a);//release your memory alloc
//------------------------------------------------------------
//Or just give a big enough for a like
int a[1000];
//------------------------------------------------------------
0 голосов
/ 08 июля 2019

что делать, если я хочу освободить назначенную ячейку памяти для последней введенной вами переменной.

1 - будет ли он освобожден?

На меньшем уровне это будет работать для вас, подумайте в более широкой перспективе, где вы должны тщательно использовать каждый бит, это не очень хорошая практика (подумайте в этой перспективе). Вместо этого вам будет предложено использовать динамическое распределение памяти, что улучшит качество вашего кода.

...