gpt4 book ai didi

c++ - C++ 中 c_str() 和 char* 的不等式

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:04:44 24 4
gpt4 key购买 nike

我相信我刚刚找到了过去几天一直困扰我的错误,但它的含义让我非常头疼。

我在 macOS mojave 机器上使用本地 libcurl 工具(在/usr/lib 中),但我认为 cURL 本身不是问题所在。

我一直在尝试使用以下代码向 Twitter 提交 OAuth2 请求,所有 header 均已正确提供(未显示)。

// supplying https://api.twitter.com/oauth2/token?grant_type=client_credentials for ease of use
curl_easy_setopt(curl, CURLOPT_URL, "https://api.twitter.com/oauth2/token");
std::string grantType = "grant_type=client_credentials";
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, grantType.c_str());

然而,这失败了状态码

{"errors":[{"code":170,"message":"Missing required parameter: grant_type","label":"forbidden_missing_parameter"}]}

困惑,我试了一下:

curl_easy_setopt(curl, CURLOPT_URL, "https://api.twitter.com/oauth2/token");
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "grant_type=client_credentials");

哪个完美:

{"token_type":"bearer","access_token":"AAAAAAAAAAAAAAAAAAAAAIMu6QAAAAAArr86Rv2W70fTicd4yAir7..."}

所以要么我不理解 C++ 的一个关键方面,要么我已经打破了宇宙 — 为什么调用 c_str() 不会产生相同的输出?

我还一直在一个单独的项目中运行以下内容,以尝试了解正在发生的事情。

std::string string1 = "test";
char* string2 = "test";
assert((strcmp(string1.c_str(), string2)) || (string1.c_str() == string2));

为什么定义一个 char* 与定义一个字符串然后调用 c_str() 产生的值不同?

最佳答案

结果实际上是一个字符串生命周期问题,alter igel 指出:CURL_POSTFIELDS 必须在稍后的执行点访问字符串值,但此时字符串已经超出范围并从中删除内存。创建变量作为方法的参数必须自动创建一个 char* 文字,它不会被编译器尽快销毁,从而导致我上面概述的行为。谢谢您的帮助!

关于c++ - C++ 中 c_str() 和 char* 的不等式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52618498/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com