【问题标题】:Segfault when assigning to char* in struct在结构中分配给 char* 时出现段错误
【发布时间】:2017-02-05 19:15:08
【问题描述】:

所以我有一个结构“序列”,其中有一个 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”,然后是段错误。我究竟做错了什么?谢谢!

【问题讨论】:

    标签: c struct segmentation-fault


    【解决方案1】:

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

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

    seq->bytes[0] = firstByte;
    

    您还需要分配一个缓冲区并将seq-&gt;bytes指向它。

    【讨论】:

    • 或者将seq->bytes定义为一个固定长度的char数组
    【解决方案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';
    

    第二种方法看起来更像是 C 中的真正“字符串”。

    【讨论】:

    • 这与我认为是错误的,但不确定。谢谢你解释得这么好。最短时间过后,我会检查答案。
    猜你喜欢
    • 2021-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-09
    • 1970-01-01
    • 2021-07-23
    • 2022-08-20
    • 2014-05-31
    相关资源
    最近更新 更多