分配给struct中的char *时的Segfault

时间:2017-02-05 19:15:09

标签: c struct segmentation-fault

所以我有一个结构“序列”,里面有一个char *。当我尝试创建一个序列时,每当我尝试更改char *它时会出现段错误。这是相关的代码。结构:

typedef struct _sequence {
  unsigned int length;
  unsigned char* bytes;
} Sequence;

构造函数:

Sequence* newSequence(unsigned char firstByte) {      //Creates new  sequence, allocates memory
  printf("Creating new Sequence\n");
  Sequence* seq = (Sequence*)malloc(sizeof(Sequence));
  printf("Have new sequence\n");
  seq->length = 1;
  printf("Set length\n");
  seq->bytes[0] = firstByte;
  printf("Set variables\n");
  return seq;
}

现在我在这里只有一个main函数用于测试目的,这个文件最终会没有main函数。但这是我以前测试的:

int main() {
  char test[] = "ab";
  printf("Testing sequences!\n");
  Sequence* newSeq = newSequence(test[0]);
  printf("Made new sequence!\n");
  outputSequence(newSeq, stdout);
  printf(" <-- new Sequence created\n");
  return 0;
}

printfs再次用于测试目的。它始终打印出构造函数中的“Set length \ n”,然后是段错误。我究竟做错了什么?谢谢!

2 个答案:

答案 0 :(得分:3)

您正确地为结构分配了快速,但是您没有为bytes元素指向的缓冲区分配任何空间。

此行调用未定义的行为,因为bytes未初始化:

seq->bytes[0] = firstByte;

您需要同时分配一个缓冲区并将seq->bytes指向它。

答案 1 :(得分:2)

Sequence* seq = malloc (sizeof(Sequence));

这里为一个char *和一个int分配内存空间,但是你需要为char *指向的内容分配空间,这样:

seq->bytes = malloc (my_string_size);

只有这样才能开始在分配的内存块中存储字符。

编辑:例如,要存储一个单个字符,您可以这样做:

seq->bytes = malloc(1);
seq->bytes[0] = firstByte;

将其用作单个字符。但是C操纵字符串的好习惯是总是以这种方式留下一个字符:

seq->bytes = malloc(2);
seq->bytes[0] = firstByte;
seq->bytes[1] = '\0';

第二种方法看起来更像一个真正的字符串&#39;在C.