2014-11-23 55 views
0

我有以下代碼:Const char *分配不正確?

#define FROM "<[email protected]>" 
#define TO  "<[email protected]>" 

const char *payload_text[] = { 
    "Date: Mon, 29 Nov 2010 21:54:29 +1100\r\n", 
    "To: " TO "\r\n", 
    "From: " FROM "(Example User)\r\n", 
    "Subject: SMTP TLS example message\r\n", 
    "MIME-Version: 1.0\r\n", 
    "Content-Type: multipart/mixed; boundary=\"KkK170891tpbkKk__FV_KKKkkkjjwq\"\r\n", 
    "\r\n", 
    "This is a multipart message in MIME format.", 
    "\r\n", 
    "--KkK170891tpbkKk__FV_KKKkkkjjwq\r\n", 
    "Content-Type: text/plain", 
    "\r\n", 
    "here goes the text message\r\n", 
    "\r\n", 
    "--KkK170891tpbkKk__FV_KKKkkkjjwq\r\n", 
    "Content-Type: image/jpeg; name=\"test.jpg\"\r\n", 
    "Content-Transfer-Encoding: base64\r\n", 
    "Content-Disposition: attachment; filename=\"test.jpg\"\r\n", 
    "\r\n", 
    NULL, /*19*/ 
    "\r\n", 
    "--KkK170891tpbkKk__FV_KKKkkkjjwq--\r\n", 
    NULL 
}; 

struct upload_status { 
    int lines_read; 
}; 

static size_t payload_source(void *ptr, size_t size, size_t nmemb, void *userp) { 
    struct upload_status *upload_ctx = (struct upload_status *)userp; 
    const char *data; 

    if((size == 0) || (nmemb == 0) || ((size*nmemb) < 1)) { 
    return 0; 
    } 

    data = payload_text[upload_ctx->lines_read]; 

    if(data) { 
    size_t len = strlen(data); 
    memcpy(ptr, data, len); 
    upload_ctx->lines_read++; 

    return len; 
    } 

    return 0; 
} 

std::string readFileToBase64(const char* filename) { 
    /* converts binary file to base64 */ 
} 

std::string split76(std::string in) { 
    int lines = in.length()/76; 

    for(int i=0;i<lines;i++) { 
     in.insert((i+1)*76+i*2, "\r\n"); 
    } 

    return in; 
} 

int main(void) { 
    payload_text[19] = split76(readFileToBase64("C:\\Users\\thrymgjol\\code\\emailtest\\bin\\Release\\test.jpg")).c_str(); 

    CURL *curl; 
    CURLcode res = CURLE_OK; 
    struct curl_slist *recipients = NULL; 
    struct upload_status upload_ctx; 

    upload_ctx.lines_read = 0; 

    curl = curl_easy_init(); 
    if(curl) { 
    curl_easy_setopt(curl, CURLOPT_USERNAME, "[email protected]"); 
    curl_easy_setopt(curl, CURLOPT_PASSWORD, "legitpassword"); 
    curl_easy_setopt(curl, CURLOPT_URL, "smtp://smtp.gmail.com:587"); 
    curl_easy_setopt(curl, CURLOPT_USE_SSL, (long)CURLUSESSL_ALL); 
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); 
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L); 
    curl_easy_setopt(curl, CURLOPT_MAIL_FROM, FROM); 
    recipients = curl_slist_append(recipients, TO); 
    curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, recipients); 
    curl_easy_setopt(curl, CURLOPT_READFUNCTION, payload_source); 
    curl_easy_setopt(curl, CURLOPT_READDATA, &upload_ctx); 
    curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L); 
    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); 
    res = curl_easy_perform(curl); 
    if(res != CURLE_OK) 
     fprintf(stderr, "curl_easy_perform() failed: %s\n", 
       curl_easy_strerror(res)); 

    curl_slist_free_all(recipients); 
    curl_easy_cleanup(curl); 
    } 

    return (int)res; 
} 

然而,當我編譯和運行,payload_source()停止18後指數之閱讀payload_text。這完全切斷了我分配給payload_text [19]的附件。任何想法,爲什麼它這樣做?

+0

從'split76'返回的值是臨時值,並在分配完成後被銷燬。任何嘗試訪問它之後都會導致未定義的行爲。 – 2014-11-23 20:12:46

+0

@CaptainObvlious我應該如何解決這個問題? – 2014-11-23 20:18:50

+0

@DiaMcThrees,將它記憶到別的地方。 – shuttle87 2014-11-23 20:23:10

回答

0

問題是從split76返回的值是臨時的,並在作業完成後被銷燬。任何嘗試訪問它之後都會導致未定義的行爲。如果你需要存儲一個指向字符串緩衝區的指針,你可以創建本地std::string來保存它,確保它的使用壽命足夠長。

std::string encodedFile(split76(readFileToBase64("C:\\Users\\thrymgjol\\code\\emailtest\\bin\\Release\\test.jpg"))); 
payload_text[19] = encodedFile.c_str(); 
相關問題