C函数与指针参数

我正在编写一个C程序,它将数据输出文件,生成 python脚本并调用pyplot来进行绘图.

但是,当我按指针传递参数时,它可以正确编译,但无法运行.它返回错误.当我使用Xcode调试模式并逐步执行它时,它会偶然提供正确的结果,但并非总是如此.有时它也会返回错误.

我怀疑它可能是由一些内存分配问题引起的,但我无法确定究竟是什么问题.

我的代码如下:

1)主要

#include <iostream>
#include <stdlib.h>
#include <cmath>
#include "PyCPlot.h"

using namespace std;

double pi = 3.1415926;

int main(int argc,const char * argv[]) {

    int nline = 100;

    double * np_list = new double(nline);
    double * pack_fraction_np = new double (nline);

    for (int i=0; i<nline; i++){
        np_list[i] = double(i)/double(nline)*2*pi;
        pack_fraction_np[i] = cos(np_list[i]);
    }

    PyCPlot_data_fout("RandomPacking",nline,np_list,pack_fraction_np);
    PyCPlot_PythonScript("RandomPacking","Random Packing");
    PyCPlot_pyplot("RandomPacking","Random Packing");

    return 0;
}

2)头文件

#ifndef PyCPlot_h
#define PyCPlot_h

#include <iostream>
#include <cmath>
#include <fstream>
#include <string>
#include <stdlib.h>

using namespace std;


int PyCPlot_data_fout(string datafilename,int nline,double * x,double *y){
    ofstream fout;
    fout.open(datafilename+".txt");
    fout << nline << endl;
    for (int i=0; i<nline; i++){
        fout << x[i] << "  " << y[i] << endl;
    }
    fout.close();
    return 0;
}

int PyCPlot_PythonScript(string datafilename,string plttitle){

    string strhead = "import numpy as np\nimport matplotlib.pyplot as plt\n";
    string strpltfig = "plt.figure()\n";
    string strpltplt = "plt.plot(xlist,ylist)\n";
    string strplttit = "plt.title('"+plttitle+"')\n";
    string strpltshw = "plt.show()\n";

    string strfileopen ="f = open('"+datafilename+".txt','r')\n";
    string strreadline ="size = map(int,f.readline().split())\n";
    string strpltlist ="xlist = np.zeros((size))\nylist = np.zeros((size))\n";
    string strfor = "for i in range(size[0]):\n    xlist[i],ylist[i] = map(float,f.readline().split())\n";

    ofstream pyout;
    pyout.open("PyCPlot_"+datafilename+".py");
    pyout << strhead << strfileopen << strreadline << strpltlist << strfor;
    pyout << strpltfig << strpltplt << strplttit << strpltshw;
    pyout.close();
    return 0;
}

int PyCPlot_pyplot(string datafilename,string plttitle){

    string strsystemsh ="source ~/.bashrc; python PyCPlot_"+datafilename+".py";
    system(strsystemsh.c_str());

    return 0;
}

#endif /* PyCPlot_h */

当它运行时,我得到以下错误消息

malloc: *** error for object 0x1002002e8: incorrect checksum for freed object - object was probably modified after being freed.

解决方法

你想传递一个数组,所以传递一个实际的数组,它可以在运行时调整大小(std :: vector),而不是一些希望指向数组的第一个元素的随机指针(在这种情况下,它没有’ T)

你的错误是使用new double(x)而不是new double [x].前者分配一个值为x的单个double,后者分配一个x大小为double的数组并返回指向第一个元素的指针,但正如我所说,你根本不会遇到这个问题你有没有真正使用过std :: vector而没有涉及90年代早期风格的指针(更不用说,如果你使用了std :: vector,你就不会有内存泄漏).

相关文章

在有效期内的苹果开发者账号(类型为个人或者公司账号)。还...
Appuploader官网--IOS ipa上传发布工具,证书制作工具跨平台...
苹果在9月13号凌晨(北京时间)发布 iOS 16,该系统的设备可...
计算机图形学--OpenGL递归实现光线追踪
Xcode 14打出来的包在低版本系统运行时会崩溃,报错信息是Li...