以下のfreeSマクロでポインタの変数リストを解放したいと思っています:freeS(s1、s2、...);Freeはva_argリストとして送信されたポインタを解放しません
私のコードは、freeSF関数からの最初のポインタアドレスで印刷を取得しても、最初のポインタを解放しません。 メインでは、フリー(s1)が動作しますが、それはすべきです。期待どおりのメインクラッシュでフリー(s2)。
freeSF関数でs1ポインタを解放するにはどうすればよいですか?
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
#include <stdlib.h>
#define freeS(...) freeSF("", __VA_ARGS__, NULL)
void freeSF(char *paramType, ...) {
va_list pl;
va_start(pl, paramType);
paramType = va_arg(pl, char *);
while (paramType) {
printf("arg %p\n", paramType);
free(paramType);
paramType = va_arg(pl, char *);
}
va_end(pl);
}
int main(int ARGC, char** ARGV) {
char *s1 = strdup("1");
char *s2 = strdup("2");
printf("s1 %p, s2 %p\n", s1, s2);
freeS(s1, s2);
free(s1);
}
あなたはしています: 'freeS(s1、s2)' '次に' free(s1) 'をしています。あなたは二重自由です。 http://ideone.com/shZ3Scはうまく動作します。あなたはそれが解放されていないことをどのように知っていますか? – Brandon
ポインタがdoubleの場合、エラーがあります。 './a.out 'のエラー:ダブルフリーまたは破損(fasttop):0x00000000024c5030。それは無料でしか起こらない – Remy
それはエラーを引き起こさない:http://ideone.com/2sQPXlあなたはまだ 'free'を2回呼んでいて、それは未定義の振る舞いです。' free(s1)あなたがすでに 'freeS(s1、s2)'をしているときに 'free(s2)'を呼び出すことができます。 – Brandon