我有以下结构
typedef struct rotor {
char characters[26];
char* rotationPos;
char* aPosition;
} rotor;
我希望像这样创建3个实例:
char cadeia3[26] = "BDFHJLCPRTXVZNYEIWGAKMUSQO";
char cadeia2[26] = "AJDKSIRUXBLHWTMCQGZNPYFVOE";
char cadeia1[26] = "EKMFLGDQVZNTOWYHXUSPAIBRCJ";
rotor* r1;
rotor* r2;
rotor* r3;
r1 = createRotor(cadeia1, 20);
r2 = createRotor(cadeia2, 20);
r3 = createRotor(cadeia3, 20);
createRotor
功能会自动创建转子:
rotor* createRotor(char* cadeia, char* c) {
int aux;
rotor* r;
for (aux = 0; aux < 26; aux++) {
if (cadeia[aux] == NULL || strlen(cadeia) > 26) {
return -1;
} else
r->characters[aux] = cadeia[aux];
}
r->characters[26] = '\0';
r->rotationPos = c;
r->aPosition = r->characters[0];
return r;
}
这仅适用于第一个转子......无论何时我想验证内容或在功能中使用任何其他转子,程序都会终止&#34;。对我来说,奇怪的是为一个人完美而不为其他人工作。
我做错了什么?
答案 0 :(得分:3)
对我来说看起来像未定义的行为。
您没有(动态)将rotor
所需的内存分配到任何地方。您的createRotor()
函数只是将数据存储在一些随机垃圾邮件地址(即r
的值)中,并且您尝试访问它。您永远不会将r
初始化为为您的程序分配的地址。
答案 1 :(得分:2)
char cadeia3[26] = "BDFHJLCPRTXVZNYEIWGAKMUSQO";
字符串文字已经有26个字符长,这意味着数组中没有空终止符。所以这个电话:
strlen(cadeia);
将调用未定义的行为。
使用:
char cadeia3[27] = "BDFHJLCPRTXVZNYEIWGAKMUSQO";
或
char cadeia3[] = "BDFHJLCPRTXVZNYEIWGAKMUSQO";
答案 2 :(得分:0)
三项建议更改:
1)如果您正在使用字节常量(例如&#34; 20&#34;),请将参数定义为&#34; char c&#34;,而不是&#34; char * c&# 34;:
rotor* createRotor(char* cadeia, char* c)
2)更重要的是,如果你的字符串长26个字母......那么字符数组必须是(至少)27个字符:
typedef struct rotor {
char characters[27];
char* rotationPos;
char* aPosition;
} rotor;
...
char cadeia3[27] = "BDFHJLCPRTXVZNYEIWGAKMUSQO";
3)最重要的是,确保你 ALLOCATE 你的每一个&#34;转子&#34;在某处结构。