【发布时间】:2017-09-30 11:30:12
【问题描述】:
https://gist.github.com/macarr/b49c0097666a613f639c4eab931f31d4
我正在用 C 语言制作一个小应用程序,它应该连接到 ecobee API。暂时忽略这是愚蠢的/可怕的/为什么上帝使用 C 作为 REST API 客户端,这是一个有趣的个人项目。
我目前遇到了内存管理问题。我已经用 cmets 注释了提供的要点,并剪掉了我认为不相关的代码。基本上,在我到达 getTokens 之前,该应用程序完全按预期工作。然后下面的代码吓坏了:
struct authorizations getTokens(char* apiKey, char* authCode) {
char* body = "grant_type=ecobeePin&code=";
body = concat(body, authCode);
printf("%s!!!!!!!!!!\n", body); //as expected
concat2(body, "&client_id=");
printf("%s!!!!!!!!!!\n", body); //as expected
concat2(body, apiKey);
printf("%s!!!!!!!!!!\n", body); //garbage
...
concat 和 concat2 的功能见要点。
char* concat(const char *s1, const char *s2)
{
char* result;
result = malloc(strlen(s1)+strlen(s2)+1);//+1 for the zero-terminator
if(!result) {
exit(1);
}
strcpy(result, s1);
strcat(result, s2);
printf("CONCAT1: %s\n", result);
return result;
}
void concat2(char *s1, const char *s2) {
char temp[strlen(s1)];
strcpy(temp, s1);
printf("%s:%s\n", temp, s2);
s1 = realloc(s1, strlen(temp) + strlen(s2) + 1);//+1 for the null terminator
if(!s1) {
exit(1);
}
strcpy(s1, temp);
strcat(s1, s2);
printf("CONCAT2: %s\n", s1);
}
在我的函数结束时,我 free(body),这会杀死应用程序,因为显然 body 已被释放。我猜我的一个reallocs 不工作还是什么?
最让我困惑的是,当我两天前处理不良数据时(对 api 进行无效调用,只是从错误中提取信息以填充未来的请求 - 当时我没有设置登录),一切正常。一旦我开始获取真实数据,应用程序就开始“堆栈粉碎”。这是我昨晚能推的。
此外,任何关于我在字符串连接和指针操作方面出错的一般建议都将受到欢迎。假设我已经听说过为什么我不应该使用 C 作为 REST API 客户端
【问题讨论】:
-
"concat 和 concat2 的功能见要点。" - 请参阅How to Ask,了解本网站的运作方式以及您需要提供的内容。简而言之:如果该网站离线怎么办?
-
concat2有问题。将其更改为返回类似body = concat2(body, "&client_id=");的值 -
您需要仔细考虑
realloc返回值这一事实。为什么需要这个值?难道我们不能直接说realloc(ptr, newsize)就可以了?现在,当您回答完这个问题后,请查看concat2。 -
请在您的问题中发布
concat和concat2的正文 - 我无法访问提供的链接。 -
还有
char temp[strlen(s1)];off-by-one 错误 -->char temp[strlen(s1)+1];注意:realloc保存原始内容。
标签: c memory-management ecobee