簡體   English   中英

C ++ Segfault附加,push_back和運算符=或+ =

[英]C++ Segfault appending, push_back and operator = or +=

我有一個非常簡單的代碼從文件中讀取並將chars附加到字符串並構成結構的數組。我使用init方法初始化字符串,並使用push_back(char)附加到字符串,但初始化和push_back都給出了我segfault。 我堅信這可能是編譯器問題,所以我下載了新版的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進行初始化,所有這些都為segfault

這是它創建的堆棧轉儲

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 = {};

您必須使用運算符new而不是C函數malloc 調用malloc對象時,不會創建std::string類型的對象。 函數malloc不調用對象的構造函數。

函數employee_init可能如下所示

Employee employee_init() {
    Employee employee = new Employee_t();
    return employee;
}

同樣,如果您打算使用Employee_S類型的數組,那么最好使用std::vector在這種情況下,不需要該函數。 您可以簡單地定義

std::vector<Employee_S> employee;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM