Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中的结构问题_C_Struct - Fatal编程技术网

C语言中的结构问题

C语言中的结构问题,c,struct,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] = "EKMFLGDQVZ

我有以下结构

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;
}
rotor*createRotor(char*cadeia,char*c){
int aux;
转子*r;
用于(aux=0;aux<26;aux++){
如果(cadeia[aux]==NULL | | strlen(cadeia)>26){
返回-1;
}否则
r->characters[aux]=cadeia[aux];
}
r->字符[26]='\0';
r->旋转位置=c;
r->aPosition=r->characters[0];
返回r;
}
这只适用于第一个转子。。。每当我想验证一个函数中的内容或使用任何其他函数时,程序就会“终止”。对我来说,奇怪的事情是完美地为一个人工作,而不是为其他人工作

我做错了什么

 char cadeia3[26] = "BDFHJLCPRTXVZNYEIWGAKMUSQO";
字符串文字已经有26个字符长,这意味着数组中没有空终止符的空间。所以这个电话:

 strlen(cadeia);
将调用未定义的行为

使用:

字符串文字已经有26个字符长,这意味着数组中没有空终止符的空间。所以这个电话:

 strlen(cadeia);
将调用未定义的行为

使用:


在我看来像是未定义的行为


您没有(动态)分配
rotor
所需的内存。您的
createRotor()
函数只是将数据存储在某个随机垃圾地址(即
r
的值)中,然后您尝试访问它。您从未将
r
初始化到为您的程序分配的地址。

在我看来像是未定义的行为


您没有(动态)分配
rotor
所需的内存。您的
createRotor()
函数只是将数据存储在某个随机垃圾地址(即
r
的值)中,然后您尝试访问它。您从未将
r
初始化为为您的程序分配的地址。

三个建议的更改:

1) 如果使用字节常量(如“20”),请将参数定义为“char c”,而不是“char*c”:

2) 更重要的是,如果字符串长度为26个字母。。。那么字符数组必须(至少)为27个字符:

typedef struct rotor {
    char characters[27];
    char* rotationPos;
    char* aPosition;
} rotor;
...
char cadeia3[27] = "BDFHJLCPRTXVZNYEIWGAKMUSQO";

3) 最重要的是,确保将每个“rotor”结构分配到某个位置。

三个建议的更改:

1) 如果使用字节常量(如“20”),请将参数定义为“char c”,而不是“char*c”:

2) 更重要的是,如果字符串长度为26个字母。。。那么字符数组必须(至少)为27个字符:

typedef struct rotor {
    char characters[27];
    char* rotationPos;
    char* aPosition;
} rotor;
...
char cadeia3[27] = "BDFHJLCPRTXVZNYEIWGAKMUSQO";

3) 最重要的是,请确保将每个“rotor”结构分配到某个位置。

为什么要为
char*c
参数传递
20
的值?对我来说,奇怪的是它根本不起作用。正如在他的诊断中,您没有为转子分配空间,因此它在第一次调用时没有崩溃是令人惊讶的(或者您运气不好,它当时没有崩溃)。但这就是未定义行为的问题:你无法预测将会发生什么。您还需要更加注意编译器警告;它应该告诉你很多事情。记住,编译器对C的了解比你多。为什么你要为
char*C
参数传递
20
的值?对我来说,奇怪的是,它根本不起作用。正如在他的诊断中,您没有为转子分配空间,因此它在第一次调用时没有崩溃是令人惊讶的(或者您运气不好,它当时没有崩溃)。但这就是未定义行为的问题:你无法预测将会发生什么。您还需要更加注意编译器警告;它应该告诉你很多事情。记住,编译器比你更了解C。但是数组从[0]到[26],27个位置对吗?@MMrj-但是数组从[0]到[26],27个位置对吗?对数组[n]的索引值总是从0到n-1(或者在本例中是0到26),但是数组从[0]到[26],27个位置对吗?@MMrj-但是数组从[0]到[26],27个位置对吗?对数组[n]索引值始终从0到n-1(在本例中为0到26)
typedef struct rotor {
    char characters[27];
    char* rotationPos;
    char* aPosition;
} rotor;
...
char cadeia3[27] = "BDFHJLCPRTXVZNYEIWGAKMUSQO";