使用char指针和char数组输入

Ash*_*dav 5 c input

考虑代码

#include<stdio.h>
int main(void)
{
   char* a;
   scanf("%s",a);//&a and &a[0] give same results-crashes 
   printf("%s",a);
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

为什么这段代码导致崩溃?而使用字符数组的代码工作得很好?

#include<stdio.h>
int main(void)
{
   char a[100];
   scanf("%s",&a[0]);//works fine
   printf("%s",a);
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

不同的是字符数组和指针?但是我知道指针只指向第一个元素是&a [0]应该工作正常但是高级代码崩溃所有三个是a,&a和&a [0]?我要收集的主要内容是,如果我坚持只使用scanf,我该如何输入字符指针?如果我不清楚,我道歉.提前致谢:)

pax*_*blo 9

因为char* a;在堆栈上为字符指针char a[100];分配空间,同时为100个字符分配空间.

在前一种情况下,您需要为指向指向的指针分配一些实际内存.导致崩溃的原因是将a其设置为某个任意值(您不对其进行初始化),以及当您scanf正在编写数据时.如果您只是使用a,那就让我们称之为第一种崩溃类型.

如果你使用&a它,它会在你自己的指针上写下你的输入,它会给你一个指向who-know-where的指针,导致第二个崩溃类型.这假设你没有输入更多的字符而不是溢出指针 - 这会破坏调用堆栈导致另一种崩溃情况(类型3).

作为建议,请不要使用没有边界检查的输入函数,除非您完全控制向他们呈现的数据.即使使用a char[100],有人也可能通过输入比缓冲区更多的字符来导致代码中的堆栈溢出.

我发现最好的办法是使用fgets(可以限制读取的字符)sscanf(尽管如果你得到的只是一个字符串,sscanf并不是真的需要).