C-初始化结构会导致分割故障



我有一个简单的 struct,如下:

typedef struct {
  char *raw_headers;
  char headers[128][512][512];
} HTTPrequest;

现在在同一文件中,我具有以下功能:

void init_request(char *raw_headers) {
  HTTPrequest request;
  request.raw_headers = raw_headers;
}

运行输出二进制时,这会导致分割故障。

我编译了文件,为

$ gcc Server.c -o Builds/debug

,我运行可执行文件为

$ ./Builds/debug

这是我的原始文件:

Parser.h

typedef struct {
  char *raw_headers;
  char headers[128][512][512];
} HTTPrequest;
void parser_init(char *raw_headers) {
  char *token, *key_value = NULL;
  token = strtok(raw_headers, "rn");
  int line_counter = 1
  HTTPrequest request;
  request.raw_headers = raw_headers;
  while (token) {
    char *line = token;
    if(line_counter != 1) {
    }
    token = strtok(NULL, "rn");
    line_counter++;
  }
}

server.h

int socket_create() {
  return socket(AF_INET, SOCK_STREAM, 0);
}
void infinite_loop(int socketFD) {
  char buffer[1024];
  memset(buffer, 0, sizeof(buffer));
  printf("Starting infinite loop, don't worry, everything would be okay!n");
  do {
    int connectionFD = accept(socketFD, (struct sockaddr*) NULL, NULL);
    /*Accept is a blocking call! The following code wont execute until, accept() returns.*/
    strcpy(buffer, "HTTP/1.1 200 OKrnContent-Type: text/htmlrnrnHello!");
    write(connectionFD, buffer, sizeof(buffer));
    char request[2048];
    memset(&request, 0, sizeof(request));
    read(connectionFD, &request, sizeof(request));
    printf("Request received!n");
    // Init the parser.
    parser_init(request);
    close(connectionFD);
  } while (true);
}

server.c

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <stdbool.h>
#include "Parser.h"
#include "Server.h"
void main() {
  struct sockaddr_in listeningAddr;
  int socketFD = socket_create();
  memset(&listeningAddr, 0, sizeof(listeningAddr));
  listeningAddr.sin_family = AF_INET;
  listeningAddr.sin_addr.s_addr = htonl(INADDR_ANY);
  listeningAddr.sin_port = htons(8070);
  bind(socketFD, (struct sockaddr*) &listeningAddr, sizeof(listeningAddr));
  if(listen(socketFD, 5) == -1) {
    printf("Woah there! I couldn't startup the server!");
  }
  infinite_loop(socketFD);
}

另外,错误消息:Segmentation fault (core dumped)

headers成员(32MiB)使您的结构太大,无法适合大多数默认的系统提供的堆栈(Linux上的8MiB)。

使其较小,琐碎的MCVES,例如:

typedef struct {
  char *raw_headers;
  char headers/*[128]*/[512][512]; }
HTTPrequest;
void init_request(char *raw_headers) {
  HTTPrequest request;
  request.raw_headers = raw_headers;
}
int main()
{
    init_request("hello, world");
}

将起作用,尽管初始化堆栈结构只是将其丢弃的堆栈结构并不是很有意义的

(初始化器功能通常将指向其初始化的结构并通过该指针初始化对象的结构。)

尽管您的httprequest很简单,但大小超过32MB。您很可能会遇到堆栈溢出...

这是堆栈溢出的典型情况!

原因是您的struct HTTPrequest太大,超过32 MB。3D阵列的大小为128 * 512 * 512 = 33554432字节,因为它是类型char

在任何情况下,几乎不使用3D阵列,并且仅在特殊情况下。重新考虑您的设计,并尝试使该数组成为2D而不是3D。

相关内容

  • 没有找到相关文章

最新更新