gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 08:33:19 24 4
gpt4 key购买 nike

我无法理解“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不为空,有内容result。

这是我在 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

谢谢。

最佳答案

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

关于c - ANSI C - 将数据从函数传递到 CHAR 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27321534/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com