構造体内の変数またはメンバーのいずれかに一致する可能性があるメタバリアブルを宣言するために使用する正しいタイプは何ですか?
-
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));
所属していません StackOverflow