以下に記述されたコードに小さな問題があります。VS 2010 はそれをコンパイルして実行し、予測結果を取得します。しかし、Qt Creator でこのコードをコンパイルしようとすると、毎回この警告が表示されます:「予想されるトークン ')' が int になりました」はい、プログラムは Qt Creator によって実行されますが、プログラムは爆発します。このコードの問題点:
#include <stdio.h>
#include <stdarg.h>
#define ARR_SIZE 2
int **getAddresses(int amount, ...)
{
static int *arr[ARR_SIZE] = {};
va_list vl;
if(amount > 0)
{
va_start(vl, amount);
int i;
for(i = 0; i < amount; i++)
{
*(arr + sizeof(int) * i) = va_arg(vl, int*); //This one is highlighted by the Qt Creator.
}
va_end(vl);
return 0;
}
else
{
return arr;
}
}
int main(void)
{
int a = 3, b = 5;
getAddresses(ARR_SIZE, &a, &b);
printf("BEFORE: %d, %d\n", a, b);
int **res = getAddresses(0), i;
for(i = 0; i < ARR_SIZE; i++)
{
*(*(res + sizeof(int) * i)) += 5;
}
printf("AFTER: %d, %d\n", a, b);
return 0;
}
事前にご回答いただきありがとうございます。
追加: Qt Creator は、このコード行を強調表示します *(arr + sizeof(int) * i) = va_arg(vl, int*);
さらに、Dev++ は、警告、エラー、クラッシュなしでこのコードを実行できます。
GCC は Fedora Linux 14 でコンパイルできます。
[Admin@localhost testerprog]$ gcc tester.c -o tester
[Admin@localhost testerprog]$ ls
tester tester.c
[Admin@localhost testerprog]$ ./tester
BEFORE: 3, 5
AFTER: 8, 10
[Admin@localhost testerprog]$
GCC バージョンは 4.5.1 20100924 (Red Hat 4.5.1-4) です。