【解決方法】C で配列のアドレスを ** に変換できないのはなぜですか?


こんにちは。 なぜ配列のアドレス(つまり、 &) に変換できません ** Cで?

私が試したこと:

私は次のことを試しました..

C
#include <stdio.h>


int main()
{
    int** a;
    int b[5];
    b[1] = 123;
    
    //a = &b; //< results in output of warning "assignment to ‘int **’ from incompatible pointer type ‘int (*)[5]’"
    int* c = b;
    a = &c; //< this works
    printf("*a is %i\n", (*a)[1]);
    
    return 0;
}

私はそれを期待します。 b に変換できます int*、変換することは可能でしょう &bint**。 ただし、これにより、上記のコード ブロックで説明した警告が表示されます。

Windows で mingw gcc を使用すると、これが (書き込みと読み取り) ** 配列のアドレスに割り当てられたもの)は、実際には一度は機能しましたが、二回目は機能しませんでした。

解決策 1

b は配列です。配列の名前は最初の要素へのポインタであるため、技術的には、 &b 整数へのポインタへのポインタです。 しかし、コンパイラはこれを (当然のことながら) 整数の配列へのポインタとみなしているため、これに同意しません。 また、配列はバックグラウンドで行われるポインター演算の糖衣構文であるため、皆さんが思っているように完全には機能しません。
作ることで回避できます b 代わりに int へのポインタ:

C
#include <stdio.h>
#include <malloc.h>
int main()
    {
    int** a;
    int* b = malloc(sizeof(int) * 5);
    b[1] = 123;
    
    a = &b; 
    printf("*a is %i\n", (*a)[1]);

    free(b);
    return 0;
    }

コメント

タイトルとURLをコピーしました