我在这段代码中收到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]);
}
}
提前致谢。
答案 0 :(得分:5)
我在此代码中收到SIGSEGV错误,我无法弄明白 它
我们首先解释一下分段错误是什么。
访问冲突是一个陷阱(系统异常/错误),当进程尝试访问无效的内存地址时会产生这种陷阱:它尝试写入只读内存或者根本不允许进程处理此内存,包括取消引用null指针和寻址不存在的内存地址(这可以使用例如mmap进行操作)。在这种情况下,SIGSEGV信号(11)被发送到违规过程。
在硬件级别上,分段故障是作为内存管理单元引发的操作实现的,作为内存保护功能的一部分。该计算机硬件单元可以是单独的集成电路,也可以与CPU一样放在同一IC上,就像在现代计算机,微处理器中一样。
要在程序代码中找到导致SIGSEGV的行,我们应该查看堆栈跟踪/堆栈窗口等。我们还可以在导致此问题的行之前放置一个断点并调查程序状态。如果核心被倾倒,我们也可以看看这个。 Linux提供了一套grsecurity补丁,可以增强对Web服务器的缓冲区溢出,堆栈溢出等的保护。
标准函数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