C中的结构问题

时间:2014-04-29 22:23:33

标签: c struct

我有以下结构

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;。对我来说,奇怪的是为一个人完美而不为其他人工作。

我做错了什么?

3 个答案:

答案 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;在某处结构。