я могу использовать этот код вместо функции malloc, потому что он, кажется, работает одинаково для динамического выделения памяти на языке C - PullRequest
1 голос
/ 30 марта 2019

Я изучаю язык динамического выделения памяти c, я нашел ниже код, который использует функцию malloc, но могу ли я использовать код наконец для той же цели, не используя функцию malloc. Оба кода выдают тот же результат

// код, который использует функцию malloc

#include<stdio.h>
#include<malloc.h>
int main(){
    int *ptr;
    int n,sum=0;
    printf("Enter the size of array \n");
    scanf("%d",&n);
    ptr=(int*)malloc(n*sizeof(int));
    if (ptr==NULL)
    {
        printf("Memory not allocated \n");
    }
    else
    {
        for (int i = 0; i < n; ++i)
        {    
            printf("Enter element at %d position \n",i+1);
            scanf("%d",(ptr+i));
            sum=sum+(*(ptr+i));
        }
        printf("sum = %d",sum);
    }
}

// код, который не использует функцию malloc

#include<stdio.h>
int main(){
    int n,sum=0;
    printf("Enter the size of array \n");
    scanf("%d",&n);
    int a[n];
    for (int i = 0; i < n; ++i)
    {    
        printf("Enter element at %d position \n",i+1);
        scanf("%d",&a[i]);
        sum=sum+a[i];
    }
    printf("sum = %d",sum);
}

Ответы [ 3 ]

2 голосов
/ 30 марта 2019

Если ваш пользователь вводит большое число, подход VLA (= массив переменной длины) рискует переполнением стека.

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

Проще просто malloc.


Пример ограничения размера VLA:

....
enum { MAX_CNT = 128 };
int a[n <= MAX_CNT ? n : 1];
int *ptr = a <= MAX_CNT ? &a[0] : malloc(int[n]);
if(!ptr){ printf("Memory not allocated \n"); return -1; }
//...
//...
if (a!=ptr) free(ptr);

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

С другой стороны, функция VLA не является обязательной частью C, что означает, что не все соответствующие реализации должны ее поддерживать.

0 голосов
/ 31 марта 2019

После попытки выяснить, почему ваш код работает, при более тщательном рассмотрении я вижу, что вы заполняете массив и немедленно повторно используете значение. Таким образом, вам все равно, если он будет поврежден. На самом деле, вам вообще не нужен массив. Приведенный ниже код также будет работать, даже не делая вид, что использует массив.

#include<stdio.h>
int main(){
    int n,sum=0;
    printf("Enter the size of array \n");
    scanf("%d",&n);
    for (int i = 0; i < n; ++i)
    {    
        printf("Enter element at %d position \n",i+1);
        int v;
        scanf("%d",&v);
        sum=sum+v;
    }
    printf("sum = %d",sum);
}
0 голосов
/ 30 марта 2019

Для указателей, которые сохраняют время жизни программы, вы обычно хотите использовать malloc / free, однако в этом случае это не имеет большого значения, так как вы выполняете всю работу в функции main,Оба этих примера кода делают одно и то же и дают один и тот же результат.

Массивы в C в любом случае просто являются динамически размещаемыми указателями.

...