我在这段代码中收到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)
提前致谢.
我在这段代码中收到SIGSEGV错误,我无法弄明白.
我们先来解释一下分段错误是什么.
访问冲突是一个陷阱(系统异常/错误),当进程尝试访问无效的内存地址时会产生这种陷阱:要么尝试写入只读内存,要么根本不允许进程处理此内存,包括取消引用空指针和寻址不存在的内存地址(可以使用例如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;
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)
| 归档时间: |
|
| 查看次数: |
176 次 |
| 最近记录: |