我在理解" 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* content2
在main.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
。
感谢。
答案 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
指向的堆栈内存。