C++ 段错误追加、push_back 和运算符 = 或 +=

标签 c++ string segmentation-fault

我有一个非常简单的代码来从文件中读取并将字符追加到字符串并制作一个结构数组。我使用 init 方法初始化字符串并使用 push_back(char) 追加到字符串,但都初始化push_back 给我段错误。 我想也许这是一个编译器问题,所以我下载了一个全新的 cygwin 安装仍然没有用。我尝试了 MinGW,在 MinGW 中我仍然遇到错误,但我看不到它,因为在调试时没有任何效果,在控制台 printf 中没有出现并且 cin 没有工作所以我无法继续初始化并且只能在运行代码时看到错误。作为最后的结果我尝试了 Visual Studio 但它甚至没有编译我的代码因为我没有恒定的数组大小。

typedef struct Employee_S {
    string ID, name, surname;
    int age;
    double salary;
} *Employee, Employee_t[1];

Employee employee_init() {
    Employee employee = (Employee) malloc(sizeof (Employee_t));
    if (employee == NULL) {
        printf("Error @ linked_arraylist_init: Cannot allocate memory. (Initialize Error)\n");
    } else {
        (employee->ID) = "";
        (employee->name) = "";
        (employee->surname) = "";
    }
    return employee;
}

我已经尝试使用 +=、append、=、push_back 进行初始化,它们都给出了段错误

这是它创建的堆栈转储

Exception: STATUS_ACCESS_VIOLATION at rip=0057B1CAF9F
rax=3FFFFFFFFFFFFFF9 rbx=0000000600062BF0 rcx=0000000000000000
rdx=000000010040407A rsi=0000000000000000 rdi=000000000023A3E0
r8 =0000000000000000 r9 =000000010040407A r10=0000000000240000
r11=00000001004010E2 r12=0000000000000001 r13=0000000000000000
r14=0000000000000001 r15=0000000000000000
rbp=000000000023A340 rsp=000000000023A2C0
program=D:\Programming Stuff\asd\dist\Debug\Cygwin_4.x-Windows\asd.exe, pid 3320, thread main
cs=0033 ds=002B es=002B fs=0053 gs=002B ss=002B
Stack trace:
Frame        Function    Args
0000023A340  0057B1CAF9F (00000000000, 0000023AB2F, 10000000023A39E, 0000023AAD0)
0000023A340  0010040110E (0057B1C65FE, 00000000000, 00000000000, 0000023A8E0)
0000023A3D0  00100401783 (0000023A3F0, 0000023A800, 00100000020, 0000023A9FB)
0000023A460  0010040224E (00000000020, FF0700010302FF00, 0018004819A, 00000000000)
0000023AB90  0018004820B (00000000000, 00000000000, 00000000000, 00000000000)
00000000000  0018004611B (00000000000, 00000000000, 00000000000, 00000000000)
00000000000  00180046274 (00000000000, 00000000000, 00000000000, 00000000000)
00000000000  001004027A1 (00000000000, 00000000000, 00000000000, 00000000000)
00000000000  00100401010 (00000000000, 00000000000, 00000000000, 00000000000)
00000000000  7FFECA3416AD (00000000000, 00000000000, 00000000000, 00000000000)
00000000000  7FFECC494629 (00000000000, 00000000000, 00000000000, 00000000000)
End of stack trace

如果我能在这件事上得到一些帮助,我会很高兴。

最佳答案

C malloc 只为员工分配内存,它不构造对象,因此不能正确构造字符串等成员。

在这种情况下你应该使用new/delete:

Employee employee = new Employee_S();

也没有必要使用指针,代码更简单,更安全:

struct Employee_S {
    string ID;
        string name; 
        string surname;
    int age;
    double salary;
};

要默认初始化 Employee_S 成员,您只需编写

 Employee_S  es = {};

关于C++ 段错误追加、push_back 和运算符 = 或 +=,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23288852/

相关文章:

c++ - 如何在 emacs 中使用公司模式、irony 后端和 irony header

PHP 字符串中多次出现的单词

C++访问 vector 的一定范围的索引

c++ - 指向父的指针无故更改

c - 程序接收信号SIGSEGV,Segmentation fault错误

python - Caffe编译报错: ld: can't map file, errno=22

c++ - 将 vector<vector<int>> 传递给参数

C++指针返回结构实现: Linked List

c# - 在 C# 中为 IEnumerable<string> 的每个成员添加前缀/后缀

python - 执行 arch -i386 pip2 install skype4py 时可执行文件中的 CPU 类型错误