memcpy 和数组的段错误

问题描述 投票:0回答:1

我正在学习 C,只是想弄清楚我对内存如何分配的理解。我正在使用以下代码,它出现了段错误,但我不确定为什么。有什么指点吗? (没有双关语的意思)

#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);
  memcpy(table->elements, (int[]) {1, 1, 1}, 3*sizeof(int));

  int* new_elements = calloc(1, sizeof(int)*5);
  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]);
  }

  return 0;
}
c pointers dynamic-memory-allocation
1个回答
0
投票

Table* table = {0};
table
初始化为空指针。它指向“什么都没有。”

然后

table->elements = …
尝试使用
table
来引用结构中的
elements
成员。但是,由于
table
没有指向任何内容,因此没有结构,也没有可以访问的成员。最有可能的是,这会导致尝试访问未映射到您的进程的内存并导致段错误。

要修复此问题,您必须将

table
设置为指向
Table
类型结构的内存。或者您可以将
table
更改为结构体而不是指针,并在代码中进行相应的更改,例如将
table->elements
更改为
table.elements

© www.soinside.com 2019 - 2024. All rights reserved.