2010-09-27 4 views
3

У меня вопрос относительно назначений ограниченных указателей. См. Комментарии в коде для конкретных вопросов. В целом, я просто интересно, что это законно с ограничением (я читал стандарт, но все еще есть вопросы :-(Ограниченные назначения указателей

int* Q = malloc(sizeof(int)*100); 

{ 
    int* restrict R = Q; 

    for(int j = 0; j < rand()%50; j++) 
    { 
     R[j] = rand(); 
    } 

    Q = R; // The standard says assigning restricted child pointers to their parent is illegal. 
      // If Q was a restricted pointer, is it correct to assume that this would be ILLEGAL? 
      // 
      // Since Q is unrestricted, is this a legal assignment? 
      // 
      // I guess I'm just wondering: 
      // What's the appropriate way to carry the value of R out of the block so 
      // the code can continue where the above loop left off? 
} 

{ 
    int* S = Q; // unrestricted child pointers, continuing where R left off above 
    int* T = Q+1; // S and T alias with these assignments 

    for(int j = 0; j < 50; j++) 
    { 
     S[j] = T[j]; 
    } 
} 

Спасибо за вашу помощь!

+0

Что вы подразумеваете под «переносить значение« R »из блока»? Ваш код вообще не изменяет 'R', у вас есть' R == Q' во всех местах, где 'R' находится в области видимости. Кстати, принятие ответа через несколько минут после того, как вы задали вопрос, это то, что рекомендуют долгосрочные пользователи. –

ответ

1

Поскольку объект модифицируется (массив выделяется в первой строке) не изменяется через Lvalue выражение, за исключением привлечения запретной указатель, R в том блоке, где R объявлена, я думаю, что код в вашем примере хорошо определена.

Если Q были ограничены указатель, пример не будет определен.

+0

Спасибо за вашу помощь ... снова! :) – Andrew

+0

Добро пожаловать - просто поймите, что я считаю, что формулировка определения «ограничение» будет довольно сложной (возможно, так же, как и вы), поэтому моя уверенность в моем ответе может быть не такой сильной, как для других ответы ... –