#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的有效输入?但是当我没有取消引用指针时它并没有崩溃。如果我取消引用它,它不应该给我输入的价值吗?但是,如果我没有取消引用它,它怎么会给我价值呢?
答案 0 :(得分:1)
函数puts
期望内存中以空字符结尾的字符串的地址。
在您的代码中,变量ptrName
确实指向内存中以空字符结尾的字符串。
但是通过调用puts(*ptrName)
,您将传递该字符串的第一个字符。
当传递给函数puts
时,该字符的值将扩展为地址的大小(通常为4或8个字节),并且该函数假定指向有效的以null结尾的字符串。
然后该函数尝试读取该内存地址的内容,这很可能会产生非法的内存访问(虽然官方称其为未定义的行为 - 任何事情都可能发生)。
答案 1 :(得分:1)
ptrName是指向char的指针。 * ptrName是char。函数puts将指针作为参数,而不是char。当你像这样使用它时,它会尝试将Char的值解释为指针,这将导致内存违规。