使用memcpy和数组时出现Segfault(段错误)求助
段错误原因分析与修复方案
核心错误:解引用空指针
代码里Table* table = {0};把table这个指针初始化为空指针(NULL)。空指针指向无效内存地址,直接通过table->elements访问或赋值,本质是对空指针进行解引用操作,这会直接触发段错误(Segfault)。两种修复思路
使用栈上的结构体变量
把指针换成结构体实例,直接在栈上分配内存,无需额外申请堆空间:Table table = {0}; // 栈上的结构体,elements默认初始化为NULL table.elements = calloc(1, sizeof(int)*3); // 用.访问成员,不用->后续所有
table->elements都要改成table.elements。给结构体指针分配堆内存
如果必须使用指针,先给指针分配有效内存空间: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
相关产品推荐
相关产品推荐

