使用malloc的数组中的SIGSEGV错误

时间:2014-06-15 21:03:20

标签: c++ malloc

我在这段代码中收到SIGSEGV错误,我无法弄明白。所以请有人帮助我。我无法理解如果我通过malloc函数将内存分配给数组,我必须以零开始指数或1。

#include<iostream>
#include<stdio.h>
using namespace std;
#include<malloc.h>

long long int gold_coins(long long int[],long long int);

int main()
{
    long long int n,i,d;
    long long int* m;
    cin>>n;
    while(n!=EOF)
    {
        m = (long long int*) malloc(n+1);
        for(i=0;i<=n;i++)
           m[i]=i;
        d=gold_coins(m,n);
        cout<<d<<endl;
        cin>>n;
    }
    return(0);
}

long long int gold_coins(long long int m[],long long int n)
{
    if(n<4)
        return m[n];
    else
    {
        long long int q=gold_coins(m,n/2)+gold_coins(m,n/3)+gold_coins(m,n/4);
        if(q>m[n])
            m[n]=q;
        return(m[n]);
    }
}

提前致谢。

1 个答案:

答案 0 :(得分:5)

  

我在此代码中收到SIGSEGV错误,我无法弄明白   它

我们首先解释一下分段错误是什么。

分段错误

访问冲突是一个陷阱(系统异常/错误),当进程尝试访问无效的内存地址时会产生这种陷阱:它尝试写入只读内存或者根本不允许进程处理此内存,包括取消引用null指针和寻址不存在的内存地址(这可以使用例如mmap进行操作)。在这种情况下,SIGSEGV信号(11)被发送到违规过程。

在硬件级别上,分段故障是作为内存管理单元引发的操作实现的,作为内存保护功能的一部分。该计算机硬件单元可以是单独的集成电路,也可以与CPU一样放在同一IC上,就像在现代计算机,微处理器中一样。

要在程序代码中找到导致SIGSEGV的行,我们应该查看堆栈跟踪/堆栈窗口等。我们还可以在导致此问题的行之前放置一个断点并调查程序状态。如果核心被倾倒,我们也可以看看这个。 Linux提供了一套grsecurity补丁,可以增强对Web服务器的缓冲区溢出,堆栈溢出等的保护。


的malloc

标准函数malloc(),在我的实现中声明为

/* Allocate SIZE bytes of memory.  */
extern void *malloc (size_t __size) __THROW __attribute_malloc__ __wur;

将要分配的 bytes 的数量作为其参数。

C标准§ 7.20.3.3 malloc函数

  

概要1

     

包括stdlib.h

     

void * malloc(size_t size);

     

说明

     

2 malloc函数分配&gt;指定大小的对象的空间   按大小而且其价值是不确定的。

     

返回

     

3 malloc   function返回空指针或指向已分配的指针   空间。


这意味着这里

m = (long long int*) malloc(n+1);

您正在分配n + 1个字节,但是需要(n+1)*sizeof(long long int)个字节来存储n+1类型的long long int个变量,因此您应该写:

m = malloc( ( n + 1) * sizeof( long long int));

或更好

m = malloc( ( n + 1) * sizeof *m)
   ^
   // in C cast should be omitted ( it is still needed if you want your code
   // to compile with a C++ compiler)
   // sizeof *m can be used as () are needed only for a type names

https://stackoverflow.com/a/605858/1141471