vsprintf()中出现分段错误

Segmentation Fault in vsprintf()

本文关键字:分段 错误 vsprintf      更新时间:2023-10-16
    #define printm(p) writeToAnalyticsFile p
    void writeToAnalyticsFile (const char* format, ...)
    {
        std::string errorLog;
        std::string headerLine = ""errorText":";
        FILE *fp = fopen( "Analyse.txt", "w" );
        if( 0 == fp )
        {
        }
        else
        {
            va_list args;
            va_start (args, format);
            vsprintf (const_cast<char*>(errorLog.c_str()),format, args);
            va_end (args);
            fputs(headerLine.c_str(),fp);
            fputs(""",fp);
            fputs( errorLog.c_str(), fp );
            fputs(""",fp);
            fclose(fp);
        }
    }

    class abc
    {
    public:
        static const char *  func()
        {
            std::string str = "john";
            return str.c_str();
        }
    };

    int main()
    {
        printm(("My  Name is %s and surname is %s and age is %d",abc::func(),"john",25));
        return 0;
    }

我基本上想用writeToAnalytics(——)取代printm((——)),它将数据写入文件。

我得到下面的代码分割故障。问题是在main中调用abc::func()。这是因为str在func()中的本地存储吗?

func函数是不正确的,因为它返回一个无效的指针:

    static const char *  func()
    {
        std::string str = "john";
        return str.c_str();
    }

string在函数结束时被销毁,因此指针str.c_str()是一个悬空指针——指向一个不再存在的字符串。

解决方案是仅return "john"。字面量永远存在

    static const char *  func()
    {
        return "john";
    }

或者,更好的是,返回string

    static string  func()
    {
        std::string str = "john";
        return str;
    }

,在呼叫点使用abc::func().c_str()

(可能还有其他问题,但这对我来说是最明显的)