55972


0x560FC6BC (ucrtbased.dll) で例外がスローされました (ConsoleApplication1.exe 内):
0xC0000005: 場所 0x00900000 への書き込み中にアクセス違反が発生しましたということですが、どういうことでしょうか

[code]

    #include "pch.h"
    #include <iostream>
    #include<string.h>
    #include<stdio.h>
    
    int main(void)
    {
        char str1[256], str2[] = "DRAGONQUESUT";
        scanf_s("%s", str1);
    
            if (strcmp(str1, str2) == 0) {
                printf("同じ\n");
            }
            else {
                printf("違う\n");
            }
        return 0;
    }
    
[/code]


CC BY-SA 4.0
2019-06-21T08:38:50.310
55971
2019-06-21T08:59:23.650
2019-06-21T08:59:23.650
4236
34680
question
c visual-c++
C言語のstrcmp関数を実行すると、例外のスローというのが出てきて実行されません


`strcmp`に辿り着く前にエラーが発生しているはずです。  
[`scanf_s`](https://docs.microsoft.com/en-us/cpp/c-runtime-
library/reference/scanf-s-scanf-s-l-wscanf-s-wscanf-s-l?view=vs-2019#remarks)は

> Unlike `scanf` and `wscanf`, `scanf_s` and `wscanf_s` require you to specify
> buffer sizes for some parameters. Specify the sizes for all `c`, `C`, `s`,
> `S`, or string control set [] parameters. The buffer size in characters is
> passed as an additional parameter. It immediately follows the pointer to the
> buffer or variable. For example, if you're reading a string, the buffer size
> for that string is passed as follows:
[code]

>     char s[10];
>     scanf_s("%9s", s, (unsigned)_countof(s)); // buffer size is 10, width
> specification is 9
>  
[/code]

と説明されています。`scanf`と異なり、`%s`を使用した場合は受け取るバッファの次にバッファサイズを指定しなければなりません。

そして、C言語およびC++言語の可変引数では正確な引数情報が受け渡しできないため、誤った引数を渡した場合にはアクセスエラーが発生し得ます。

[code]

    scanf_s("%s", str1, (unsigned)_countof(str1));
    
[/code]

[先の質問にも回答](https://ja.stackoverflow.com/a/55731/4236)しましたが、使用環境に対応した参考書を読まれることをお勧めします。


CC BY-SA 4.0
2019-06-21T08:54:13.433
55972
2019-06-21T08:54:13.433
4236
55971
answer