使用malloc的数组中的SIGSEGV错误

use*_*705 -6 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]);
    }
}
Run Code Online (Sandbox Code Playgroud)

提前致谢.

4pi*_*ie0 5

我在这段代码中收到SIGSEGV错误,我无法弄明白.

我们先来解释一下分段错误是什么.

分段故障

访问冲突是一个陷阱(系统异常/错误),当进程尝试访问无效的内存地址时会产生这种陷阱:要么尝试写入只读内存,要么根本不允许进程处理此内存,包括取消引用空指针和寻址不存在的内存地址(可以使用例如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;
Run Code Online (Sandbox Code Playgroud)

将要分配的字节数作为其参数.

C标准 7.20.3.3 malloc函数

剧情简介1

包括stdlib.h

void*malloc(size_t size);

描述

2 malloc函数为一个对象分配>空间,该对象的大小由size指定,其值是不确定的.

返回

3 malloc函数返回空指针或指向已分配空间的指针.


这意味着在这里

m = (long long int*) malloc(n+1);
Run Code Online (Sandbox Code Playgroud)

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

m = malloc( ( n + 1) * sizeof( long long int));
Run Code Online (Sandbox Code Playgroud)

或更好

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
Run Code Online (Sandbox Code Playgroud)

/sf/answers/42410091/