使用scanf%p UB

时间:2017-02-10 19:21:09

标签: c pointers scanf

来自C11标准(草案):7.21.6.2/12

  

如果输入项是先前在同一程序中转换的值   执行,结果的指针应该等于该值;   否则%p转换的行为是未定义的。

请有人为此部分标准提供代码。无法理解从输入中获取%p的用法。

2 个答案:

答案 0 :(得分:5)

首先,这是一个使用字符串版本的输入和输出(demo)的小型演示:

int val = 123;
char buf[100];
sprintf(buf, "%p", (void*)&val);
printf("Original =%s\n", buf);
void *ptr;
sscanf(buf, "%p", &ptr);
printf("Read back=%p\n", ptr);
int *iPtr = ptr;
if (iPtr == &val) {
    printf("Pointers match\n");
}

顶部的sprintf将指针写入输出缓冲区; sscanf将其读回来。

输入sscanf的字符串与sprintf生成的字符串完全匹配,因此标准保证iPtr == &val将评估为true,以及行为被定义为。传递与同一个正在运行的程序生成的任何内容都不匹配的字符串将是未定义的行为。

答案 1 :(得分:0)

int main(){
    int c =5;
    int *p;
    printf("Address of C: %p\n Please Enter the above address: " , &c);
    scanf("%p", &p);
    *p=10;
    printf("\nNew value of  C: %d", c);
}

您可以通过scanf手动设置指针。如果你有拼写错误,那就很危险。