1

構造体のポインター配列から要素を取得しようとしています。正しい方法で行っているかどうかはわかりません。

    #include<stdio.h>

    typedef struct _str
    {
        int *a;
    } _str;


    main()
    {
        _str s[]={
            {1000,2000},
            {3000,4000,5000}
            };

        printf("%d\n", s[0].a);
        printf("%d\n", s[0].a + 1); /* Gives me 1004 instead of 2000 */

        printf("%d\n", s[1].a);
        printf("%d\n", s[1].a + 1); /* Gives me 3004 instead of 4000 */
    }
4

1 に答える 1

2

コードはきれいにコンパイルされません:

$ gcc -O3   -g      -std=c99   -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes -Wold-style-definition     wd.c -o wd  
wd.c:9:5: warning: return type defaults to ‘int’ [enabled by default]
wd.c:9:5: warning: function declaration isn’t a prototype [-Wstrict-prototypes]
wd.c: In function ‘main’:
wd.c:9:5: warning: old-style function definition [-Wold-style-definition]
wd.c:12:13: warning: initialization makes pointer from integer without a cast [enabled by default]
wd.c:12:13: warning: (near initialization for ‘s[0].a’) [enabled by default]
wd.c:12:13: warning: excess elements in struct initializer [enabled by default]
wd.c:12:13: warning: (near initialization for ‘s[0]’) [enabled by default]
wd.c:13:13: warning: initialization makes pointer from integer without a cast [enabled by default]
wd.c:13:13: warning: (near initialization for ‘s[1].a’) [enabled by default]
wd.c:13:13: warning: excess elements in struct initializer [enabled by default]
wd.c:13:13: warning: (near initialization for ‘s[1]’) [enabled by default]
wd.c:13:13: warning: excess elements in struct initializer [enabled by default]
wd.c:13:13: warning: (near initialization for ‘s[1]’) [enabled by default]
wd.c:16:9: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘int *’ [-Wformat]
wd.c:17:9: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘int *’ [-Wformat]
wd.c:19:9: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘int *’ [-Wformat]
wd.c:20:9: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘int *’ [-Wformat]
$

基本的に、それは「あなたにはできない」と言っているのですが、少なくともそうではありません。


警告は、何かを実行できないという意味ではありません。

コンパイラからの警告を無視できるようになる前に、この種の質問をしないように C を十分に習得する必要があります。一般に、コンパイラ (または少なくともコンパイラの作成者) は、C についてあなたよりも多くのことを知っています。なぜ何かに警告を与えてはいけないのかについて、標準の章と節を引用できるほど十分に理解するまでは、編集者の言葉を福音として扱ってください。また、私があなたのコードをレビューしている場合は、そのようなコードをこっそりとこっそり渡そうとしないでください — 私はそれを受け入れません.


このコードは、C99 複合リテラルでレスキューできます。

#include <stdio.h>

typedef struct str
{
    int *a;
} str;

int main(void)
{
    str s[] =
    {
        { (int[]){1000,2000} },
        { (int[]){3000,4000,5000} },
    };

    printf("%d\n", *(s[0].a + 0));
    printf("%d\n", *(s[0].a + 1));

    printf("%d\n", s[1].a[0]);
    printf("%d\n", s[1].a[1]);
}

また、アンダースコアで始まる名前は、基本的に実装用に予約されています。ルールはそれよりも少し複雑ですが、安全性を最大限に高めるために、アンダースコアで始まる名前は作成しないでください。そのため、名前をに変更_strしましたがstrstr通常、C では「構造体」よりも「文字列」を意味するために使用されます (しかし、より適切な名前のアイデアがありませんでした)。printf()最初の 2 つはある方法で、2 番目の 2 つは別の方法で記述されている、ステートメントで必要とされる余分なレベルの間接性に注意してください。

于 2013-05-25T03:29:18.433 に答える