错误:C ++文字内存处理不当

时间:2015-12-04 12:42:15

标签: c++

我已经尝试了很多来调试我的代码,但它仍然无法正常工作。整个代码只是崩溃,但没有全面的错误我提出代码请尝试调试那个。

代码:

#include <iostream>
#include<conio.h>
#include<string.h>
#include<fstream>
using namespace std;

void write(char fname[],char text[])
{
    strcat(fname,".txt");
    ofstream w(fname,ios::app);
    w<<text;
    w<<"\n";
    w.flush();
    w.close();
    cout<<" sippy "<<fname<<"  ";
}
int main ()
{
    int login=0;
    char t[100],id[100]="Its id ",pass[100]="Its password";
    login=1;
    strcpy(t,id);
    strcat(t,"\n");
    strcat(t,pass);
    cout<<" finally ";
    write("database",t);
    getch();
    strcpy(t,id);
    getch();
    cout<<t<<"  showing t here";
    getch();
    cout<<" hope this works for now  ";
    getch();
    cout<<"\nEnter the text"<<endl;
    write(id,t);
}

上述代码不适用于tdm gcc代码块

编辑1:

好的,现在已经检测到主要问题,这是一个小错误,通常是由于编程风格不好造成的。因为经常建议如果将一个字符串传递给一个函数,那么该特定函数会在传递的字符串的内存中分配一个新字符串。由于传递的字符串是文字,编辑新形成的字符串的代码会尝试编辑只读文字内存,这是一个错误

只读文字是因为如果编译器在某个不同的地方发现使用相同的文字,那么就可以使用相同的内存来刷新文字的内容,因此必须使文字读取并使用c仔细的样式字符串(应该使用std :: string)

感谢所有

1 个答案:

答案 0 :(得分:1)

如果您正面临SegFault,我认为这一行可能是问题所在:

write("database",t);

因为在write函数中,您在strcat上使用了fname,但是您传递了一个只读字符串。

另外,我认为最好使用真正的c ++而不是c +:

#include <string>
#include <iostream>
#include <fstream>

void my_write(std::sting & fname, std::string & text) {
    std::string file = fname + ".txt";
    std::osftream w(file, std::ios::app);
    w << text << "\n";
    w.flush();
    w.close();
}

int main() {
    std::string t = "";
    std::string id = "Its id";
    std::string pass = "Its password";
    std::string fname = "database";
    int login = 1;

   t = id + "\n" + pass;
   my_write( fname, t);
}

我没有测试过,但想法就在这里。