常量字符* 未正确分配
Const char* not assigning properly?
我有以下代码:
#define FROM "<example@gmail.com>"
#define TO "<example2@gmail.com>"
const char *payload_text[] = {
"Date: Mon, 29 Nov 2010 21:54:29 +1100rn",
"To: " TO "rn",
"From: " FROM "(Example User)rn",
"Subject: SMTP TLS example messagern",
"MIME-Version: 1.0rn",
"Content-Type: multipart/mixed; boundary="KkK170891tpbkKk__FV_KKKkkkjjwq"rn",
"rn",
"This is a multipart message in MIME format.",
"rn",
"--KkK170891tpbkKk__FV_KKKkkkjjwqrn",
"Content-Type: text/plain",
"rn",
"here goes the text messagern",
"rn",
"--KkK170891tpbkKk__FV_KKKkkkjjwqrn",
"Content-Type: image/jpeg; name="test.jpg"rn",
"Content-Transfer-Encoding: base64rn",
"Content-Disposition: attachment; filename="test.jpg"rn",
"rn",
NULL, /*19*/
"rn",
"--KkK170891tpbkKk__FV_KKKkkkjjwq--rn",
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, "rn");
}
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, "example2@gmail.com");
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: %sn",
curl_easy_strerror(res));
curl_slist_free_all(recipients);
curl_easy_cleanup(curl);
}
return (int)res;
}
但是,当我编译和运行时,payload_source()
在第 18 个标记之后停止读取payload_text。这完全切断了我分配给payload_text[19]的依恋。关于为什么这样做的任何想法?
问题是从 split76
返回的值是临时的,并且在分配完成后被销毁。在此之后访问它的任何尝试都会导致未定义的行为。如果需要存储指向字符串缓冲区的指针,可以创建本地std::string
来保存它,以确保它的生存时间足够长,以便使用。
std::string encodedFile(split76(readFileToBase64("C:\Users\thrymgjol\code\emailtest\bin\Release\test.jpg")));
payload_text[19] = encodedFile.c_str();