c - 在结构中分配给字符*时的隔离错误



所以我有一个结构"序列",里面有一个字符*。 当我尝试创建一个序列时,每当我尝试更改字符*时,它都会出现段错误。 下面是相关代码。 结构:

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

构造函数:

Sequence* newSequence(unsigned char firstByte) {      //Creates new  sequence, allocates memory
  printf("Creating new Sequencen");
  Sequence* seq = (Sequence*)malloc(sizeof(Sequence));
  printf("Have new sequencen");
  seq->length = 1;
  printf("Set lengthn");
  seq->bytes[0] = firstByte;
  printf("Set variablesn");
  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 createdn");
  return 0;
}

printfs 再次用于测试目的。 它总是在构造函数中一直打印到"设置长度",然后是段错误。 我做错了什么? 谢谢!

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

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

seq->bytes[0] = firstByte;

您还需要为其分配缓冲区和点seq->bytes

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] = '';

第二种方法在 C 中看起来更像是一个真正的"字符串"。

相关内容

  • 没有找到相关文章

最新更新