简体   繁体   中英

SIGSEGV error while declaring array without creating new int[size]

I tried to write code where i have to return the pointer pointing to the first element of array.

I tried using this:-

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;
} 

This gave me error. But when i declared the same array like this:

int *st=new int[size];

It executed successfully.

What is the difference between these two?

You can´t return a pointer to a local array in C. You have to use malloc to allocate the memory and generate a pointer to a memory region for your array. Now you can return the pointer and the memory stays valid:

#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;
} 

The instruction new does something similar to the malloc function (not exactly the same). The key operation of new is to ask the OS for some free memory for dynamic allocation (like malloc but from another memory pool). See the difference between malloc and new here . Another option (without dynamic memory) is to declare a static array with a fixed size. So the compiler will reserve the memory and you can pass the address of this array to your function

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM