ポインタ、配列

【初期化せずに値を入れようとした】

DWORD dwData[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
DWORD *pdwWork;

*pdwWork = dwData[0];

/* 配列の全要素を2倍にしたい */
for(i = 0; i < 10; i++){
*pdwWork = *pdwWork * 2;
pdwWork++;
}

print()


【初期化を並べて行うと、2つ目はポインタ変数にならない】
DWORD dwX, dwY;
DWORD* pdwX, pdwY;

dwX = 0x0X00;
dwY = 0x0C00;

pdwX = &dwX;
pdwY = &dwY;

/* 各変数に+1したい */
*pdwX = *pdwX + 1;
*pdwY = *pdwY + 1;

print()


【void型のままでは型がわからないので使えない】
DWORD dwData = 20;
void *pData;

pData = &dwData;

print(“%d\n”, *pData);


【変数の値を関数から取得する】
void get_xy(double x, double y)
{
print(x,y);
x = 2.0;
y = 4.0;
}

int main(void)
{
double x = 20.0;
double y = 40.0;

print(x,y);
get_xy(x, y);
print(x,y);

return 0;

}


【バッファオーバーラン】
void hello(void)
{
print(“hello\n”);
}

void func(void)
{
void *buf[10];
static int i;

for(i = 0; i < 100; i++){
    buf[i] = hello;
}

}

int main(void)
{
int buf[1000];
buf[999] = 10;

func();

return 0;

}
期待値はどこからも読んでないhello()が実行されること
スタックのリターンアドレスがhelloで上書きされるから


Comments

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です