c - 获取总线错误 : 10 when looping through a string array

标签 c

<分区>

我初始化了 2 个字符串数组,我认为它们是 {NULL, NULL, NULL} 我正在尝试遍历数组 variableName 并检查某个字符串是否存在例如“你好”。它在这种情况下不存在,所以我希望它打印 "not found" 但我得到一个 Bus error: 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};

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

关于c - 获取总线错误 : 10 when looping through a string array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54321474/

相关文章:

c - C语言如何将字符数组转换为二进制数组

c++ - g+++strncat : might overflow destination buffer

c - 将一个字符附加到一个字符 *

计算平均值返回错误结果

c - 如何创建类型安全的枚举?

c - 链接器如何确定 .rodata 部分中某些数据的地址?

条件始终为真。我的代码中有错误,还是 IDE 中有错误?

sql - 在sql语句中使用变量-c接口(interface)

c - C 语言编程中查找多维数组中的元素

c - 在结构中使用 posix_memalign 出现段错误