You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用memcpy和数组时出现Segfault(段错误)求助

段错误原因分析与修复方案
  • 核心错误:解引用空指针
    代码里Table* table = {0};把table这个指针初始化为空指针(NULL)。空指针指向无效内存地址,直接通过table->elements访问或赋值,本质是对空指针进行解引用操作,这会直接触发段错误(Segfault)。

  • 两种修复思路

    1. 使用栈上的结构体变量
      把指针换成结构体实例,直接在栈上分配内存,无需额外申请堆空间:

      Table table = {0}; // 栈上的结构体,elements默认初始化为NULL
      table.elements = calloc(1, sizeof(int)*3); // 用.访问成员,不用->
      

      后续所有table->elements都要改成table.elements。

    2. 给结构体指针分配堆内存
      如果必须使用指针,先给指针分配有效内存空间:

      Table* table = malloc(sizeof(Table));
      if (table == NULL) { // 必须检查内存分配是否成功
          perror("malloc failed");
          return 1;
      }
      table->elements = NULL; // 初始化成员,避免野指针
      

      程序结束前要记得释放结构体本身的内存:free(table);

  • 完整修复代码(栈结构体版本)

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef struct Table {
      int* elements;
    } Table;
    
    int main(void) {
      Table table = {0};
      table.elements = calloc(1, sizeof(int)*3);
      if (table.elements == NULL) {
          perror("calloc failed");
          return 1;
      }
      memcpy(table.elements, (int[]) {1, 1, 1}, 3*sizeof(int));
    
      int* new_elements = calloc(1, sizeof(int)*5);
      if (new_elements == NULL) {
          perror("calloc failed");
          free(table.elements);
          return 1;
      }
      memcpy(new_elements, (int[]) {2, 2, 2, 2, 2}, 5*sizeof(int));
    
      free(table.elements);
      table.elements = new_elements;
    
      for (int i = 0; i < 5; i++) {
        printf("%d\n", table.elements[i]);
      }
    
      free(table.elements); // 释放最终的内存,避免泄漏
      return 0;
    }
    

内容的提问来源于stack exchange,提问作者testing09

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 15:42:39