2014-09-01 3 views
0

Так что мне нужно, чтобы создать вызов strange_step, что приводит к ней распечатав, если заявление:Арифметика указатель с недействительными *

void strange_step(void* value) 
{ 
    if(*(int*)(value+5) == 15) 
    printf("4: Illinois\n"); 
else 
    printf("4: ERROR\n"); 
} 

Я попробовал следующее (так как, насколько мне известно, с НКУ, то лечит пустоту * как символ * так приращение 1 байт):

int arr[10]; 
arr[4] = 15; 
arr[5] = 15; 
arr[3] = 15; 
arr[2] = 15; 
arr[6] = 15; 
arr[7] = 15; 
arr[8] = 15; 
arr[9] = 15; 
//arr[10] = 15; 
strange_step(arr); 

но это только кажется, распечатайте случайные числа. Что мне не хватает?

+1

размер 'int' обычно 4 –

+5

Я думаю, что вы хотите' если (* ((INT *) значение + 5) == 15) ' – chux

+2

Я чувствую XY-проблему. Я * серьезно * сомневаюсь, что вам нужно (или даже даже хотеть) «странно», как вы показали. Чего вы действительно пытаетесь достичь? –

ответ

2

Когда вы набираете value+5, он перемещает указатель на 5 байт, прежде чем использовать его как int*. В зависимости от вашей платформы, int составляет 4 или 8 байтов. На прямом порядке байты машины

0F0000000F0000000F0000000F0000000F0000000F0000000F0000000F000000 
^  ^
value  value+5 

Вы трогание на int границы, так что вы, вероятно, найти значение, от какого-кратному 256. Я предполагаю, что вы видите 251658240 много? Вот почему.

+0

Да, заявление printf, которое я разместил в методе strange_step, неоднократно давал 2516582404. Итак, это означает, что мне нужен первый байт arr [1], равный 15?Извините за путаницу, это мой первый раз, когда речь идет о указателях –

+0

Или, действительно, могу ли я просто использовать массив символов и установить значение в массиве [4] как значение ascii 15? –

+0

Ну, я точно не знаю, что вы пытаетесь сделать. Что должен делать 'странный_step'? – ldgabbay

3

У вас есть две проблемы есть:

  • Doing указатель арифметика с void* не допускается
  • Чтение int из внеблокового указателя может привести к ошибке

Однако , если вы хотите, чтобы shoehorn 15 в надлежащее смещение, вы могли бы сделать это:

char data[32]; 
*((int*)&data[5]) = 15; 
strange_step(data); 

Отпечатает то, что вы ожидаете (demo). Однако, если вы не измените strange_step, чтобы прекратить чтение не выровненных данных, ваша программа будет полагаться на неопределенное поведение.

+0

Это имеет смысл. Почему & требуется перед данными? Я думаю, вы могли бы просто сказать данные [5], но это приводит к ошибке seg. –

+0

@ пользователь3424684 не требуется. Вы можете использовать '* ((int *) (data + 5)) = 15;' вместо этого, если хотите. Он может выглядеть так же, как и в вашей функции, но это не так. Примечание в вашей функции 'значение' является' void * ', (не полный тип). Здесь 'data' имеет полный тип (массив' char'). – WhozCraig

+0

@ user3424684 Перед 'data [5]' требуется амперсанд '&', чтобы принять адрес пятого байта. Вы можете заменить '& data [5]' на '(data + 5)'. – dasblinkenlight

0

Вы должны изменить функцию:

void strange_step(void* value) 
{ 
    // Treat the input pointer as an `int*`. 
    int* ip = (int*)value 

    // Use the 6-the value of the array. 
    // You could also use if (ip[5] == 15) 
    if(*(ip+5) == 15) 
    printf("4: Illinois\n"); 
    else 
    printf("4: ERROR\n"); 
} 
Смежные вопросы