声明数组而不创建新的int [size]时发生SIGSEGV错误

时间:2019-07-09 04:26:09

标签: c++ arrays pointers

我试图在必须返回指向数组第一个元素的指针的地方编写代码。

我尝试使用此功能:-

 public class LoginFacadeImpl implements LoginFacadeInt {
       @Value("${project.ldap.authentication}")
        private Boolean isProjectLDAPAuthenticationEnabled;
    @Override
        public UserDto authenticateUser(String userName, String password) {
    try {
                authenticateViaLDAP(userName, password);
            } catch (Exception e1) {
                //do authetication against database
                UserEntity userEntityForAuthentication = 
                UserManagementDaoInt.authenticateUser(userName,
                        AuthenticationUtils.convertPasswordToSha256(password));
}

这给了我错误。 但是当我这样声明相同的数组时:

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

成功执行。

这两者有什么区别?

1 个答案:

答案 0 :(得分:1)

您无法在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,但来自另一个内存池)。查看mallocnew here之间的区别。另一个选择(没有动态内存)是声明一个固定大小的静态数组。因此,编译器将保留内存,您可以将该数组的地址传递给函数

相关问题