簡體   English   中英

可變大小的char []-可以嗎?

[英]Variable sized char[] - Is it OK?

如果這很愚蠢,請原諒我,但我是C / C ++的新手。

在我創建的套接字庫中,我的ClientSocket :: recv(int bufsize)函數使用'bufsize'初始化char []數組以從C套接字讀取。 只要使用G ++進行編譯,該代碼就可以正常工作。

我遇到的問題是正在編譯我的代碼的某些人遇到以下錯誤: socket.cxx||In member function 'std::string ClientSocket::recv(int)':| socket.cxx|269|error: ISO C++ forbids variable length array 'buffer'| socket.cxx||In member function 'std::string ClientSocket::recv(int)':| socket.cxx|269|error: ISO C++ forbids variable length array 'buffer'|

現在,根據我在該論壇上看到的內容,Microsoft僅支持C89,而GCC支持C99,其中可接受大小可變的數組。 同樣在該線​​程上,他們建議使用_alloca()-問題是,它僅支持1mb。 我寧願沒有限制。

如果那是使其與GCC / MSVC ++交叉編譯的唯一可能方法,我想我將不得不忍受它。 很高興知道替代方法。 像malloc()這樣的東西可以工作嗎? (以前從未使用過,所以我不知道)如果是這樣,請您告訴我如何使用它或鏈接到教程/文檔? 謝謝!

PS:這是我的recv()函數的代碼:

std::string ClientSocket::recv(int bufsize) {

    // isConnected() is a ClientSocket function
    if (!isConnected()) throw SocketException("Not connected.");

    char buffer[bufsize+1];

    // I did this because sometimes it was returning partial garbage :\
    memset(buffer, 0, bufsize);

    // the :: prefix means to call the recv() from the header files instead of ClientSocket::recv()
    int ret = ::recv(sockfd, buffer, bufsize-1, 0);

    if (ret < 0) {
        switch(errno) {
            case ECONNREFUSED:
                throw SocketException("Connection refused on recover.");
                break;
            case ENOTCONN:
                throw SocketException("Not connected.");
                break;
            default:
                throw SocketException("Unknown error reading socket.");
                break;
        }
    } else if (ret == 0) {
        // we got disconnected, return empty string. (connected is a protected variable of ClientSocket)
        connected = false;
        return "";
    }

    return buffer;
}

編輯:根據建議,我計划使用vector buffer(bufsize+1, 0); ... recv(sockfd, &buffer[0], bufsize, 0); ... return &buffer[0]; vector buffer(bufsize+1, 0); ... recv(sockfd, &buffer[0], bufsize, 0); ... return &buffer[0]; char *buffer = new char[bufsize + 1]; memset(buffer, 0, bufsize); ... recv(sockfd, buffer, bufsize, 0); ... string tmp = buffer; delete [] buffer; return string(tmp); char *buffer = new char[bufsize + 1]; memset(buffer, 0, bufsize); ... recv(sockfd, buffer, bufsize, 0); ... string tmp = buffer; delete [] buffer; return string(tmp); -仍在安裝MSVC ++以便對其進行測試,但我相信它會起作用。 非常感謝! StackOverflow搖滾!

g ++允許使用C ++中的C99可變長度數組作為語言擴展。

標准C ++不支持它們。

在C ++中,請使用std::vectorstd::string

干杯,……

嘗試這樣做:

char * buffer = new char[bufsize + 1];

我將創建一個簡單的緩沖區類,該緩沖區類包裝了char *來處理此問題。 它將使用new來分配緩沖區。 我相信也可以使用vector並且仍然符合標准。 但是我不確定如何以推薦的方式進行操作。

您甚至不需要使用memset,如果您使用的是gcc或g ++,則可以使用char類型的常規聚合實際上將其全為零,請考慮以下幾點:

char * buffer[bufsize+1] = {0};

該代碼僅在gcc / g ++中有效,因為gcc允許在堆棧上使用可變大小的數組。

您唯一的其他選擇是使用:

char * buffer = new char[bufsize+1];
// and assign it zeros with std::fill
std::fill(buffer, buffer+bufsize+1, 0); 

暫無
暫無

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

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