Ошибка SIGSEGV при объявлении массива без создания нового int [size] - PullRequest
0 голосов
/ 09 июля 2019

Я пытался написать код, в котором я должен вернуть указатель, указывающий на первый элемент массива.

Я попытался использовать это: -

int *construct(int arr[],int n)
{
  int size=(int)(ceil(log2(n)));
  size=2*pow(2,size)-1;
  int st[size];
  for(int i=0;i<size;i++)
    st[i]=INT_MAX;
  constructUtil(arr,st,0,n-1,0);
  int *pt=&st[0];
  return pt;
} 

Это дало мне ошибку.Но когда я объявил один и тот же массив следующим образом:

int *st=new int[size];

Он успешно выполнен.

В чем разница между этими двумя?

1 Ответ

1 голос
/ 09 июля 2019

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

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

int* construct(int n);

int main()
{
    int* ArrayPointer = construct(100);
    printf("Address: %p", ArrayPointer);

    for(int i = 0; i < 100; i++)
    {
        printf("%i\n\r", ArrayPointer[i]);
    }

    free(ArrayPointer);
    return 0;
}

int* construct(int n)
{
    int* array = (int*)malloc(n * sizeof(int));
    for(int i = 0; i < n; i++)
    {
        array[i] = i;
    }

    return array;
} 

Инструкция new делает нечто похожее на функцию malloc (не совсем то же самое). Ключевая операция new - запросить у ОС немного свободной памяти для динамического выделения (например, malloc, но из другого пула памяти). Смотрите разницу между malloc и new здесь . Другой вариант (без динамической памяти) - объявить статический массив с фиксированным размером. Таким образом, компилятор зарезервирует память, и вы можете передать адрес этого массива в вашу функцию

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...