"访问违规阅读位置" C

时间:2017-02-25 17:25:51

标签: c arrays pointers for-loop

我需要编写一个程序,其中包含一个带字母的数组(tab1),一个带指针的数组(tab2)和一个存储用户给出的单词的数组(tab2)。到目前为止它看起来像这样:

    #include<stdio.h>
    #include<string.h>

    #define W 5
    #define K 5
    #define D 24

    int main(){
        char tab1[W][K] = {
            'a', 'f', 'k', 'p', 'w',
            'b', 'g', 'l', 'r', 'x',
            'c', 'h', 'm', 's', 'y',
            'd', 'i', 'n', 't', 'z',
            'e', 'j', 'o', 'u' };
        char *tab2[D] = { NULL };

        for (int k = 0; k < 5; k++){
            for (int l = 0; l < 5; l++){
                printf("%c ", tab1[k][l]);
            }
            printf("\n");
        }

        char tab3[D+1];
        printf("\nGimme some word.\n");
        fgets(tab3, 24, stdin);

    }

现在,我必须通过一个给定的单词,检查其中的字母(在tab1中),并在tab3中指向它们。然后使用那些指针,我应该从tab1获取数据并打印单词。

int a = strlen(tab3);
        for (int m = 0; m < a; m++){
            for (int n = 0; n < 5; n++){
                for (int o = 0; o < 5; o++){
                    if (tab3[m] == tab1[n][o]){
                        tab2[m] = &tab1[n][o];
                    }
                }
            }
        }

        for (int p = 0; p < (a + 1); p++){
            printf("%c", *tab2[p]);
        }

它确实可以编译,但是当我运行它时,它会到达我提出被询问的单词的位置并按下输入它停止并给出此错误: ConsoleApplication17.exe中0x00CD409D处的未处理异常:0xC0000005:访问冲突读取位置0x00000000。

我无法告诉我哪里犯了错误,我会变得疯狂,拜托,有人可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

错误消息“访问冲突读取位置0x00000000”表示您的程序正在尝试读取位置0x0处的内存,这将导致异常。当您尝试取消引用时,数组tab2的一个元素值为零。 解决此问题的正确方法是检查算法并确保不会发生此情况(您正在取消引用未正确设置的指针变量)。 处理这些情况的一种安全方法是在取消引用指针之前进行空检查。 在您的情况下,(为了便于阅读)

if(tab2[p] != NULL)
{
    printf("%c", *tab2[p]);
}
else
{
    printf("This pointer is not yet initialized!");
}

请注意,这不会捕获指针可能包含的其他无效地址。在您的情况下,它将工作,因为您将tab2中的所有指针初始化为NULL。 另请注意,安全机制对于实体算法来说不是替代品。