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