C 语言中的"Access violation reading location"错误



我需要编写一个包含带有字母(TAB1)的数组的程序,带有指针(TAB2)的数组(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]);
        }

它确实编译了,但是当我运行它时,它将进入我给出的单词并按Enter停止并给出此错误的地步:consoleapplication17.exe中的0x00CD409D未经处理的例外:0xc0000005:访问违规行为阅读位置0x00000000。

我不能告诉我在哪里犯错,我会发疯的,请有人可以帮我吗?

错误消息"访问违规读取位置0x00000000"表示您的程序正在尝试在位置0x0读取内存,这将导致例外。当您试图将其删除时,数组TAB2的元素之一是具有零值。解决此问题的正确方法是检查您的算法并确保无法实现此情况(您正在确定未正确设置的指针变量)。处理这些情况的一种安全方法是在取消指针之前进行无效检查。在您的情况下,(可读性)

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

请注意,这不会捕获指针可能会保留的其他无效地址。在您的情况下,它将起作用,因为您将TAB2中的所有指针都初始化为null。另请注意,安全机制不能代替固体算法。

最新更新