【发布时间】: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* 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 中说的'String java = "asdasd";',即使我知道那是char pointer。
谢谢。
【问题讨论】:
标签: c pointers visual-c++