常量字符* 未正确分配

Const char* not assigning properly?

本文关键字:分配 字符 常量      更新时间:2023-10-16

我有以下代码:

#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();