PAT (Basic Level) Practice 1021 个位数统计 (Program received signal SIGSEGV, Segmentation fault 解决方法)

乙级1021
PAT (Basic Level) Practice 1021 个位数统计 (Program received signal SIGSEGV, Segmentation fault 解决方法)

第一眼我还以为是背包问题(因为没学过背包有点害怕)后来仔细看了下发现这个比背包简单太多了

各个月饼有总重和总售价,在这里取单价,根据性价比最高的购买就好
对于每个月饼,可以用struct保存它的总价、单价、重量,再排序一下就好
注意格式输出,C的格式输出非常方便易用

代码实现:

#include<stdio.h>
#include<iostream>
#include<cmath>
#include<stdlib.h>
using namespace std;
struct yb{
	double weight;
	double fullprice;
	double price;
}; 
int main(){
	int n;
	double d;
	cin>>n>>d;
	yb a[n];
	
	for(int i = 0;i<n;i++){
		cin>>a[i].weight;
	}
	
	for(int i = 0;i<n;i++){
		cin>>a[i].fullprice;
	}
	
	for(int i = 0;i<n;i++){
		a[i].price = a[i].fullprice / a[i].weight;
	}
	for(int i = 0;i<n-1;i++){
		for(int j = i;j<n;j++){
			if(a[i].price<a[j].price){
				swap(a[i],a[j]);
			}
		}
	}
	double price = 0;
	for(int i = 0;i<n;i++){
		if(d<=a[i].weight){
			price += a[i].price * d;
			break;
		}else{
			price += a[i].fullprice;
			d -= a[i].weight;
		}
	}
	printf("%.2lf\n",price);
	return 0;
}

如果是这样,在运行的时候会一直出不来东西,调试的时候会跳出警告:
Program received signal SIGSEGV, Segmentation fault
本意为:程序接收到了一个无效的内存(SIGSEGV),产生了段错误
后来将错误指向了

a[i].price = a[i].fullprice / a[i].weight;

这段代码并没有问题,既然是一个无效的内存,那么就是在赋值的时候并不知道将这个值赋予到哪里,也就是说a[i].price这个东西并没有在内存中
通过查询资料以及对自身情况的理解,问题就出在

yb a[n];

这一个潦草的定义上,本身用变量定义数组只有在c能做到,c++是不能做到的,c++的定义方式是先给其开辟一个 n*sizeof(elementtype) 大的内存再进行操作(具体我暂时也不是特别了解),这时候之前对 malloc()(动态内存分配) 的博文的作用就体现出来了

malloc(size_t size);

对于结构体类型的malloc,是查阅资料后看到的,我也会在原博文上更新
此时就对main函数中的数组进行如下定义代替原来的潦草定义就可以了

yb *a = (struct yb*)malloc(n*sizeof(struct yb));