ANSI C - 将数据从函数传递给CHAR指针

时间:2014-12-05 17:31:52

标签: c pointers visual-c++

我在理解" char *"适用于不同的文件。例如,我有一个简单的 CURL 功能,可以帮助我将数据发送到其他HTTP WEB服务。但我也需要接受,这里的功能位于' 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&#39; String java =&#34; asdasd&#34;;&#39; ,即使我知道这是char pointer

感谢。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

return strdup(s.ptr);

这将自动malloc字符串,但您不必担心。它基本上会为你复制字符串。 s.ptr是一个局部变量;如果你想要返回它,请将它分配堆并说出return s->ptr。您必须执行此操作,因为s.ptr是本地的,因此在函数返回后,您将无法再访问s.ptr指向的堆栈内存。