首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >免费后的堆使用,我不明白

免费后的堆使用,我不明白
EN

Stack Overflow用户
提问于 2022-01-09 17:49:16
回答 2查看 161关注 0票数 1

我从以前的C项目中了解到,当我尝试在使用offree()之后访问指针时,ASAN告诉我“堆-使用后-免费”,但是在这种情况下,我甚至不理解,因为我在主目录的末尾使用了free(),之后什么也不做。

代码语言:javascript
复制
#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;
}

谢谢你的帮忙

EN

回答 2

Stack Overflow用户

发布于 2022-01-09 18:04:57

首先,指针query通过值传递给函数add_parameter

代码语言:javascript
复制
add_parameter(query, "api_key", API_KEY);

这意味着该函数处理函数中指针query值的副本。

更改副本不反映原始指针query。传递给函数的原始指针query值保持不变。

您需要通过引用传递指针。

C中的引用传递意味着通过指向对象的指针间接传递对象。删除指针,您将可以直接访问原始对象。

在这种情况下,函数将被声明为

代码语言:javascript
复制
int add_parameter(char **query, const char *key, const char *value);

(由于参数keyvalue所指向的字符串不会在函数中更改,因此参数应该用限定符const声明),并且在必须编写的函数中进行声明。

代码语言:javascript
复制
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;
}

函数中的此语句

代码语言:javascript
复制
tmp[new_len - 1] = '\0';

是多余的。所以它被移除了

注意,realloc可以返回一个空指针.在这种情况下,如果不使用中间变量tmp,则可能会丢失早期分配的内存。

这个函数可以调用如下

代码语言:javascript
复制
add_parameter( &query, "api_key", API_KEY);

代码语言:javascript
复制
if ( add_parameter( &query, "api_key", API_KEY) )
{
    //...
}
else
{
    //...
}
票数 4
EN

Stack Overflow用户

发布于 2022-01-09 17:52:24

下面的行可能会导致问题

代码语言:javascript
复制
query = realloc(query, new_len * sizeof(char));

因为query的值可能会改变。是的,main。它没有意识到这种变化。将query的更新版本传回main

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70643973

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档