【问题标题】:ANSI C - passing data from function to a CHAR pointerANSI C - 将数据从函数传递到 CHAR 指针
【发布时间】:2015-02-03 22:57:11
【问题描述】:

我无法理解“char*”在不同文件中的工作方式。例如,我有一个简单的 CURL 函数,可以帮助我将数据发送到其他 HTTP WEB SERVICES。但我也需要收到,这是位于 'curlate.h' 中的函数:

#include <stdio.h> 
#include <curl/curl.h>

struct string
{
    char * ptr;
    size_t len;
};

void init_string(struct string * s)
{
    s - > len = 0;
    s - > ptr = malloc(s - > len + 1);
    if (s - > ptr == NULL)
    {
        fprintf(stderr, "malloc() failed\n");
        exit(EXIT_FAILURE);
    }
    s - > ptr[0] = '\0';
}

size_t writefunc(void * ptr, size_t size, size_t nmemb, struct string * s)
{
    size_t new_len = s - > len + size * nmemb;
    s - > ptr = realloc(s - > ptr, new_len + 1);
    if (s - > ptr == NULL)
    {
        fprintf(stderr, "realloc() failed\n");
        exit(EXIT_FAILURE);
    }
    memcpy(s - > ptr + s - > len, ptr, size * nmemb);
    s - > ptr[new_len] = '\0';
    s - > len = new_len;

    return size * nmemb;
}

char* curlate_and_print(char url[])
{
    //printf("Curlating ... %s : ",url);
    CURL *curl;
    CURLcode res;

    struct string s;
    init_string(&s);

    curl = curl_easy_init();
    if(curl)
    {
        curl_easy_setopt(curl, CURLOPT_URL, url);
        /* example.com is redirected, so we tell libcurl to follow redirection */ 
        curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
        curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10);

        /* Perform the request, res will get the return code */ 
        res = curl_easy_perform(curl);

        /* Check for errors */ 
        if(res != CURLE_OK)
        {
            curl_easy_strerror(res);
        }
        else
        {
            curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc);
            curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s);
            res = curl_easy_perform(curl);

            // *** THE FUNCTION PRINTS THE RESULT HERE WITH NO PROBLEM
            printf("\nCURL_STRING BEGIN\n%s\nCURL_STRING END\n", s.ptr);
            free(s.ptr);
        }

        /* always cleanup */ 
        curl_easy_cleanup(curl);

    }

    return s.ptr;
}

脚本运行没有问题,它正在打印东西,但我也返回类似return s.ptr; 的值,我想在main.c 中使用这个字符串数据。

现在,我在main.c调用curlate_and_print函数,它正在打印数据,但是无论我做什么,我都无法在main.c打印它!

char* content2 = curlate_and_print(link_to_curlate);

为什么char* content2main.c 中是空的? s.ptr 不为空,有内容结果。

这是我在main.c 中的内容:

if(debug >= 1)  printf("Testing, curlating %s : \n",link_to_curlate);
// in content2 sa se verse output-ul din curlate_and_print(link_to_curlate);
char* content2 = curlate_and_print(link_to_curlate);

printf("\n");

printf(">%s\n",content2); // *** I GET EMPTY STRING
printf(">%s\n",content2); // *** I GET EMPTY STRING
printf(">%s\n",content2); // *** I GET EMPTY STRING
printf(">%s\n",content2); // *** I GET EMPTY STRING
printf(">%s\n",content2); // *** I GET EMPTY STRING

我该如何解决这个问题?

我认为,问题是我无法理解char* content2 = "asdasd" 的作用,对我来说就像在 JAVA 中说的'String java = "asdasd";',即使我知道那是char pointer

谢谢。

【问题讨论】:

    标签: c pointers visual-c++


    【解决方案1】:

    尝试将函数的返回语句更改为:

    return strdup(s.ptr);
    

    这将自动 malloc 字符串,但您不必担心。它基本上会为您复制字符串。 s.ptr 是一个局部变量;如果你想返回它,让它堆分配并说return s-&gt;ptr。你必须这样做,因为s.ptr是本地的,所以函数返回后,你不能再访问s.ptr指向的栈内存。

    【讨论】:

    • 我刚刚评论了 1 行 // free(s.ptr); ,非常感谢您的帮助
    【解决方案2】:

    问题是当您第一次打印字符串时(在curlate_and_print 内),您会立即释放字符串缓冲区(调用free(s.ptr))。释放它后,尝试取消引用指针会导致未定义的行为。在您的情况下,字符串显示为空。

    【讨论】:

    • 是的,你是对的,非常感谢你的帮助
    猜你喜欢
    • 2011-05-22
    • 2021-12-02
    • 2021-09-07
    • 1970-01-01
    • 2012-07-28
    • 1970-01-01
    • 2016-03-27
    • 1970-01-01
    相关资源
    最近更新 更多