C指针解除引用

时间:2014-11-16 16:04:10

标签: c

#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <conio.h>

void main(){
    void generateId(char*, char*);

    char name[20];
    char id[7];
    printf("Enter your name: ");
    scanf("%s", name);
    generateId(name, id);

}

void generateId(char *name, char *id){

    char *ptrName = name;
    char *ptrId = id;
    puts(ptrName);//crashes if i used puts(*ptrName);
}

有人可以向我解释上面的注释行吗?如果我尝试取消引用指针,为什么程序崩溃时会给出小于20的有效输入?但是当我没有取消引用指针时它并没有崩溃。如果我取消引用它,它不应该给我输入的价值吗?但是,如果我没有取消引用它,它怎么会给我价值呢?

2 个答案:

答案 0 :(得分:1)

函数puts期望内存中以空字符结尾的字符串的地址。

在您的代码中,变量ptrName确实指向内存中以空字符结尾的字符串。

但是通过调用puts(*ptrName),您将传递该字符串的第一个字符。

当传递给函数puts时,该字符的值将扩展为地址的大小(通常为4或8个字节),并且该函数假定指向有效的以null结尾的字符串。

然后该函数尝试读取该内存地址的内容,这很可能会产生非法的内存访问(虽然官方称其为未定义的行为 - 任何事情都可能发生)。

答案 1 :(得分:1)

ptrName是指向char的指针。 * ptrName是char。函数puts将指针作为参数,而不是char。当你像这样使用它时,它会尝试将Char的值解释为指针,这将导致内存违规。