C 获取总线错误:在字符串数组中循环时为10

C 获取总线错误:在字符串数组中循环时为10,c,C,我初始化了两个字符串数组,我认为它们是{NULL,NULL,NULL}我试图迭代数组变量名并检查是否存在某个字符串,例如“hello”。在这种情况下它不存在,所以我希望它打印出“notfound”,但是我得到了一个总线错误:10 char variableName[3][20]; char variableValue[3][20]; void addVar(char name[], char value[]) { if (varDeclared(name, variableName)

我初始化了两个字符串数组,我认为它们是
{NULL,NULL,NULL}
我试图迭代数组
变量名
并检查是否存在某个字符串,例如“hello”。在这种情况下它不存在,所以我希望它打印出
“notfound”
,但是我得到了一个总线错误:10

char variableName[3][20];
char variableValue[3][20];

void addVar(char name[], char value[]) {

    if (varDeclared(name, variableName) == 1) {

        printf("exists");
        int index = getIndex(name, variableName);
        changeVal(value, variableValue, index);

    }
    else {
        printf("not found");
    }
}

int varDeclared(char name[], char variableName[][20]) {

    int i = 0;

    while(variableName[i]) {
        if (strcmp(name, variableName[i]) == 0) {
            return 1;
            break;
        }
        i++;
    }
    return 0;
}

int getIndex(char name[], char variableName[][20]) {

    int i = 0;

    while(variableName[i]) {
        if (strcmp(name, variableName[i]) == 0) {
            return i;
            break;
        }
        i++;
    }
    return 0;
}
当你申报时

char variableName[3][20];
char variableValue[3][20];
并非
variableName[0]
variableName[1]
variableName[2]
将保持
NULL
。相反,它们将保留各自的行地址

因此,您的支票如下所示

 while(variableName[i]) {
    .....
    i++;
 }
将始终返回true,并且您访问超出范围


更改如下

while(variableName[i][0] != '\0') //Loop until empty string.
或声明指针数组

 char *variableName[3] = {NULL,NULL,NULL};
 char *variableValue[3] = {NULL,NULL,NULL};
请确保在取消引用之前分配内存。

当您声明

char variableName[3][20];
char variableValue[3][20];
并非
variableName[0]
variableName[1]
variableName[2]
将保持
NULL
。相反,它们将保留各自的行地址

因此,您的支票如下所示

 while(variableName[i]) {
    .....
    i++;
 }
将始终返回true,并且您访问超出范围


更改如下

while(variableName[i][0] != '\0') //Loop until empty string.
或声明指针数组

 char *variableName[3] = {NULL,NULL,NULL};
 char *variableValue[3] = {NULL,NULL,NULL};

请确保在取消引用之前分配内存。

是否可以添加一个
main()
函数来显示正在运行和崩溃的代码?请进行修改。还考虑检查这个列表“斯特凡”,你最好问一下。要做到这一点,请在您的评论中写入
[mcve]
。您可以添加一个
main()
函数来显示正在运行和崩溃的代码吗?请创建一个。还考虑检查这个列表“斯特凡”,你最好问一下。要做到这一点,请在评论中写入
[mcve]