2017-10-29 12 views
0

最近、コーディングコンテストでこのスニペットが出てきました。これはどのように機能するのか分かりませんでした。 2行目は long long intへのポインタを作成します。long long intへのポインタへのアクセス

  1. forループの下付き文字を使用するにはどうすればよいですか?

  2. 可能であれば、2回目の繰り返しでセグメント化エラーが発生しませんか?このスニペットをどのように解釈するか

int Q = 3; 
long long *queryArray = (long long*)malloc(sizeof(long long)); 

for(i_queryArray = 0; i_queryArray < Q; i_queryArray++){ 
    scanf("%lld", &queryArray[i_queryArray]); 
} 

+0

メモリにアクセスすることはありません – tkausl

+2

コードが範囲外にアクセスしています。それは未定義の動作です。それが動作するように見えるものを含め、何かが起こる可能性があります。 –

+0

何が間違っていますか? downvote! –

答えて

2

このコードは実際には間違っています。範囲外になり、存在しないインデックス[1][2]に書き込みます。

無効な配列要素にアクセスしても、必ずしもセグメンテーションフォールトが発生するとは限りません。これは未定義の動作で、何かが起こる可能性があります(クラッシュ、無関係なデータの破損、または一見問題なく動作していることを意味します)。

一般にサブスクリプティングについて混乱している場合は、a[b]はちょうど*(a + b)を意味します。 ptr[0]*(ptr + 0)の場合は*ptrなので、最初の繰り返しは正常です。

関連する問題