c++ - 使用 double 的 sprintf 语句出错(缓冲区溢出?)

标签 c++ arrays segmentation-fault printf

我遇到错误的 sprintf 语句。我添加了一个 printf 命令来帮助调查,似乎我的一个 double 没有被理解(printf 输出一串无意义的数字,而 %3.1f 应该是。)但是, double 第一次被正确解释它在 printf 语句中被调用。通过将大小名称从 120 增加到 320,段错误确实消失了。但是 double 仍然没有被正确解释,即它仍然输出一串无意义的数字,而简单的 %3.1f 应该是。我不知道我做错了什么。有任何想法吗?代码的最小测试用例版本和下面发布的错误消息。

    #include <iostream>
    #include <string>
    #include <fstream>
    #include <sstream>
    #include <strstream>
    #include <vector>

    using namespace std;


    void Back_Subt_beta()
    {

        int resonances = 4;
        char name[320];
        double rpos[66];
        double rbinmin[66];
        double rbinmax[66];

        ifstream binedgein;
        binedgein.open("binedges.dat");
        if (binedgein.is_open()) {
            cout << "data file opens" << endl;
            }
        for (int vline=1; vline<=4; vline++)
        {
            binedgein >> var1 >> var2 >> var3;
            rpos[vline-1] = var1;
            rbinmin[vline-1] = var2;
            rbinmax[vline-1] = var3;
        }
        binedgein.close();


        for (int m=2; m<=7; m++)
        {
            for (int j=0; j<resonances; j++)
            {
                printf("resonance%0#7.2feV/gammas_%3.1feV_Mcl%i", rpos[j],rpos[j],m);
                sprintf(name,"resonance%0#7.2feV/gammas_%3.1feV_Mcl%i",rpos[j],rpos[j],m);
            }
        }
        exit();
    }

和文件 binedges.dat

16.2      16.0      16.5
38.75     38.25     39.25
44.5      43.5      45.5
55.25     54.75     55.75

错误:

Processing Back_Subt_beta.C...
data file opens

 *** Break *** segmentation violation
resonance0016.20eV/gammas_917241681885348612676436160464141677586357964289319457240620564649334534999701390133785258335880600276911524435084428436805391368574132924760441246552362332456319675531264.0eV_Mcl16(no debugging symbols found)
Using host libthread_db library "/lib/tls/libthread_db.so.1".
Attaching to program: /proc/7689/exe, process 7689
[Thread debugging using libthread_db enabled]
[New Thread -1208284352 (LWP 7689)]
(no debugging symbols found)...done.
(no debugging symbols found)...done.
(no debugging symbols found)...done.
(no debugging symbols found)...done.
(no debugging symbols found)...done.
(no debugging symbols found)...done.
(no debugging symbols found)...done.
(no debugging symbols found)...done.
(no debugging symbols found)...done.
(no debugging symbols found)...done.
(no debugging symbols found)...done.
(no debugging symbols found)...done.

0x006dd7a2 in _dl_sysinfo_int80 () from /lib/ld-linux.so.2
#1  0x014d3533 in __waitpid_nocancel () from /lib/tls/libc.so.6
#2  0x0147c869 in do_system () from /lib/tls/libc.so.6
#3  0x00962b8d in system () from /lib/tls/libpthread.so.0
#4  0x00bebc8e in TUnixSystem::Exec () from /usr/local/root/lib/libCore.so
#5  0x00be6dfb in TUnixSystem::StackTrace () from /usr/local/root/lib/libCore.so
#6  0x00be5c53 in TUnixSystem::DispatchSignals () from /usr/local/root/lib/libCore.so
#7  0x00bebf4d in SigHandler () from /usr/local/root/lib/libCore.so
#8  0x00be0590 in sighandler () from /usr/local/root/lib/libCore.so
#9  <signal handler called>
#10 0x014b1d0a in strcmp () from /lib/tls/libc.so.6
#11 0x003033be in G__searchvariable () from /usr/local/root/lib/libCint.so
#12 0x002f9514 in G__getvariable () from /usr/local/root/lib/libCint.so
#13 0x0021de97 in G__getitem () from /usr/local/root/lib/libCint.so
#14 0xbfeb89dc in ?? ()
#15 0x0021c633 in G__getexpr () from /usr/local/root/lib/libCint.so
#16 0x00000048 in ?? ()
#17 0x002e9bc8 in G__letvariable () from /usr/local/root/lib/libCint.so
#18 0xbfeb987c in ?? ()
Root > Function Back_Subt_beta() busy flag cleared

最佳答案

我认为您的问题是 char 数组 name 只有 120 个字节,但是您使用 sprintf 语句溢出了该缓冲区。将 char 缓冲区的大小从 120 字节增加到更大的值。更好的是,使用 snprintf() 而不是 sprintf()

关于c++ - 使用 double 的 sprintf 语句出错(缓冲区溢出?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11145746/

相关文章:

c++ - clang++: 标准头文件中的错误

c++ - 在 linux 上打印函数地址总是打印 1

使用一维数组的 C malloc 段错误

加载文件时的核心转储

c++ - 对 WSACleanup() 的错误调用杀死了 WSAStartup()

python - Cython:如何使用用户定义的 C++ 类转换?

java - 获取二维数组内平方的平均值

python - 在 Python 中使用 rjust() 并减少 for 循环

regex - Perl:比较两个文件并打印匹配和不匹配的数据

c - 相同代码的段错误