構造体内の変数またはメンバーのいずれかに一致する可能性があるメタバリアブルを宣言するために使用する正しいタイプは何ですか?

StackOverflow https://stackoverflow.com/questions/2043787

  •  20-09-2019
  •  | 
  •  

質問

構造体内の変数またはメンバーのいずれかに一致する可能性があるメタバリアブルを宣言するために使用する正しいタイプは何ですか?

たとえば、次の例のソースコードを考えてみましょう。

#include <stdio.h>
#include <stdlib.h>

struct some_struct {
        int i;
        char *s;
};

void test(void)
{
        struct some_struct *ptr;
        char *s;

        s = malloc(100);
        ptr = malloc(sizeof(struct some_struct));
        ptr->s = malloc(100);

        puts("done");
}

以下で セマンティックパッチ:

@@
identifier ptr;
//idexpression ptr;
//expression ptr;
expression E;
@@

ptr = malloc(E);
+if (ptr == NULL)
+       return;

ptr->s 割り当ては一致しません expression ptr 使用されている。使用する expression これは私には少し広すぎるように思えます。これは正しいですか、それを行う唯一の方法ですか?

役に立ちましたか?

解決

一般的に、あなたはあらゆるlvalueポインターをキャッチしたいのですが、式に値が割り当てられている場所のみを一致させるため、 malloc, 、単純な表現は仕事をうまく行います(非ポインターまたは非lbalueはコンパイラに文句を言うべきだからです)。

あなたが持つ問題は、式に副作用がある場合です。

struct some_struct *a[10];
int i = 0;

a[i++] = malloc(sizeof(struct some_struct));
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top