我从以前的C项目中了解到,当我尝试在使用offree()之后访问指针时,ASAN告诉我“堆-使用后-免费”,但是在这种情况下,我甚至不理解,因为我在主目录的末尾使用了free(),之后什么也不做。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define URL "URL"
#define API_KEY "KEY"
void add_parameter(char *query, char *key, char *value)
{
const size_t new_len = strlen(query) + strlen(key) + strlen(value) + 3;
query = realloc(query, new_len * sizeof(char));
if (query)
{
strcat(query, "?");
strcat(query, key);
strcat(query, "=");
strcat(query, value);
query[new_len - 1] = '\0';
printf("%s\n", query);
}
}
int main()
{
char *query = malloc((strlen(URL) + 1) * sizeof(char));
memcpy(query, URL, sizeof(URL));
add_parameter(query, "api_key", API_KEY);
printf("%s\n", query);
free(query);
return 0;
}谢谢你的帮忙
发布于 2022-01-09 18:04:57
首先,指针query通过值传递给函数add_parameter。
add_parameter(query, "api_key", API_KEY);这意味着该函数处理函数中指针query值的副本。
更改副本不反映原始指针query。传递给函数的原始指针query值保持不变。
您需要通过引用传递指针。
C中的引用传递意味着通过指向对象的指针间接传递对象。删除指针,您将可以直接访问原始对象。
在这种情况下,函数将被声明为
int add_parameter(char **query, const char *key, const char *value);(由于参数key和value所指向的字符串不会在函数中更改,因此参数应该用限定符const声明),并且在必须编写的函数中进行声明。
int add_parameter( char **query, const char *key, const char *value )
{
const size_t new_len = strlen( query ) + strlen( key ) + strlen( value ) + 3;
char *tmp = realloc( query, new_len * sizeof( char ) );
int success = tmp != NULL;
if ( success )
{
strcat( rmp, "?" );
strcat( tmp, key );
strcat( tmp, "=" );
strcat( tmp, value );
printf("%s\n", tmp);
*query = tmp;
}
return success;
}函数中的此语句
tmp[new_len - 1] = '\0';是多余的。所以它被移除了
注意,realloc可以返回一个空指针.在这种情况下,如果不使用中间变量tmp,则可能会丢失早期分配的内存。
这个函数可以调用如下
add_parameter( &query, "api_key", API_KEY);或
if ( add_parameter( &query, "api_key", API_KEY) )
{
//...
}
else
{
//...
}发布于 2022-01-09 17:52:24
下面的行可能会导致问题
query = realloc(query, new_len * sizeof(char));因为query的值可能会改变。是的,main。它没有意识到这种变化。将query的更新版本传回main。
https://stackoverflow.com/questions/70643973
复制相似问题