私の下の私の関数(Visual Studio 2015で)に対して次のメッセージが表示される理由を理解できません。C - strtok_s - アクセス違反の読み取り場所
0xC0000005:アクセス違反の読み取り場所0x0000002C。
私はthis answerを読みましたが、それは私を助けません。
このコードは何について記述していますか?
「インデックス、値」の組のグループに分けられたintの文字列があります。インデックスはユニークです。各グループはセミコロンで区切られています。例:1,2; 3,5; 2,2; 3,4
インデックスに各値を持つintの配列を取得しようとしています。
これまでのコードでは、文字列を抽出してchar* buffer
に入れました。
次に、「インデックス、値」のグループをセミコロンで区切って、char** arrayKeyValue
に保存します(struct inputElement
というメンバ)。もう1つの構造体は、配列内の「インデックス、値」グループの数を表すintです。私は関数 "separateStringBySemicolon"でこれを行います。
次に、 "index、value"の各グループを新しい配列に分けようとします。ここで各 "index"は "value"と一致します。私は私の構造体を関数 "separateKeyValue"に渡すことでこれを行います。私はstrtok_s
を使用しますが、エラーが発生します。
以下の関数(token2 = strtok_s(arrayOfKeyValue[j], sepComma, &next_token2);
)の最初の呼び出しでエラーが発生します。 token2
またはnext_token2
にアクセスすることはできませんが、わかりません。もしそうなら、なぜですか?
double* separateKeyValue(struct inputElement* inputElement)
{
int count = inputElement->length;
char** arrayOfKeyValue = inputElement->data;
double* arrayDecimal = malloc(count * sizeof(double));
char sepComma = ','; //wrong should be char sepComma[] = ",";
char* token2 = NULL;
char* next_token2;
printf("Value in arrayofkeyvalue: %s", arrayOfKeyValue[0]);
for (size_t j = 0; j < count; j++)
{
token2 = strtok_s(arrayOfKeyValue[j], sepComma, &next_token2);
unsigned int index;
sscanf_s(token2, "%d", &index);
double value;
sscanf_s(next_token2, "%d", &value);
arrayDecimal[index] = value;
printf("res[%d] = %d\n", index, arrayDecimal[index]);
printf("\n");
}
return arrayDecimal;
}
この質問には多くのコンテキストがありません。 'separateKeyValue'関数に正確にどのような入力が渡されますか? –
'inputElement'とは何ですか? 'inputElement-> data'とは何ですか?彼らはどのように初期化されますか?どこからどのようにこの関数を呼び出しますか? [良い質問をする方法を読む](http://stackoverflow.com/help/how-to-ask)、[最小限の完全で検証可能な例]を作成する方法を学んでください(http://stackoverflow.com/jp)。/help/mcve)。 –
具体的には、問題は 'arrayofKeyValue [j]'の値の1つでほぼ確実です。これはほとんどあなたが私たちに示していないことです。 – Useless