所以我有一个结构"序列",里面有一个字符*。 当我尝试创建一个序列时,每当我尝试更改字符*时,它都会出现段错误。 下面是相关代码。 结构:
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 中看起来更像是一个真正的"字符串"。