gpt4 book ai didi

c - 循环中 char* realloc 的错误

转载 作者:行者123 更新时间:2023-11-30 15:05:57 25 4
gpt4 key购买 nike

我正在尝试用 C 语言开发一个包含 HTTP 请求的小工具,但我有一个无法解决的问题,因为我无法准确找到我的错误:/

这是我的工具的一小部分,我认为函数“http_request”在某些 HTML 响应方面存在问题。

有时我会出现段错误,有时会出现“空闲无效的下一个大小”...我认为我的指针没有正确使用。

我尝试用很长的字符串重现该错误,但什么也没发生..

(我认为我的问题出在 /* 接收响应 */ 部分)

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>


#define BUF_SIZE 256


char *http_request(char *host, int port, char *r_http)
{
struct hostent *server;
struct sockaddr_in serv_addr;
int sockfd;

/* create the socket */
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) printf("ERROR opening socket");

/* lookup the ip address */
server = gethostbyname(host);
if (server == NULL)
{
printf("ERROR, no such host");
return NULL;
}
/* fill in the structure */
memset(&serv_addr,0,sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(port);
memcpy(&serv_addr.sin_addr.s_addr,server->h_addr,server->h_length);

/* connect the socket */
if (connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr)) < 0)
{
printf("ERROR connecting");
return NULL;
}
/* send the request */
int sent = 0,total = strlen(r_http), bytes, received;
do {
bytes = write(sockfd,r_http+sent,total-sent);
if (bytes < 0)
printf("ERROR writing message to socket");
if (bytes == 0)
break;
sent+=bytes;
} while (sent < total);


/* receive the response */
char *response = malloc(sizeof(char)*BUF_SIZE), *tmp_response = malloc(sizeof(char)*BUF_SIZE), rec_data[BUF_SIZE]={0};
// unsigned int new_size = BUF_SIZE;
size_t new_size = BUF_SIZE;

while((bytes = read(sockfd,rec_data,BUF_SIZE)))
{
/* Check if error or end of receipt */
if (bytes < 0 || bytes == 0)
{
if(bytes < 0)
printf("ERROR reading response from socket");
break;
}

/* Process vars */
if(new_size == BUF_SIZE)
snprintf(response,(BUF_SIZE+1),"%s",rec_data);
else {
tmp_response = realloc(tmp_response,sizeof(char)*strlen(response));
memset(tmp_response,0,sizeof(tmp_response));
snprintf(tmp_response,(new_size+1),"%s",response);

response = realloc(response,sizeof(char)*strlen(tmp_response)+sizeof(char)*strlen(rec_data));
memset(response,0,sizeof(response));
snprintf(response,(new_size+1),"%s%s",tmp_response,rec_data);
}
new_size+=BUF_SIZE;
memset(rec_data,0,sizeof(rec_data));
}
/* close the socket */
close(sockfd);

/* free space */
free(r_http);
free(tmp_response);
// free(response);
return response;
}


char *http_get(char *host, int port, char *get_request)
{
char *base_http = "GET %s HTTP/1.0\r\n\r\n", *r_http = malloc(sizeof(char)*strlen(base_http)+sizeof(char)*strlen(get_request));

sprintf(r_http,base_http,get_request);

return http_request(host,port,r_http);
}

int main(int argc, char *argv[], char *envp[])
{
char *resp = http_get("127.0.0.1",80,"/test.html");
printf("Response: |%s|\n",resp);
return 0;
}

最佳答案

主要问题:您的realloc大小始终是一次性的 - 您忘记了 snprintf 需要在字符串末尾为 0 字节留出空间(strlen 将始终给你比你实际需要存储字符串少一个字节)

其他(更边缘的)问题:

  • 您让 snprintf (这是一个相当昂贵的函数)完成简单的 memcpy 的工作
  • 我真的不明白拥有辅助缓冲区 tmp_response 的目的 - 您只需使用 rec_data 即可。您还可以消除代码中的一个 realloc 调用。
  • 还有相当多的memset(无论如何都与错误的参数一起使用)是不必要的 - 只需复制字符串即可,首先将缓冲区清除为 0 没有太大的目的,只要您确保一致地复制字符串末尾。

关于c - 循环中 char* realloc 的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39468894/

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