使用带有指向字符的指针的scanf函数

可能重复:
使用scanf进行分段错误

我写了以下代码。

int main(){ char arrays[12]; char *pointers; scanf("%s",arrays); scanf("%s",pointers); printf("%s",arrays); printf("%s",pointers); return 0; } 

当我写scanf("%s",pointers);时,为什么会出错scanf("%s",pointers);

 char *pointers; 

必须初始化。在将字符串pointers某个地址之前,您无法将字符串扫描到pointers 。 计算机需要知道从键盘读取的值的存储位置。

 int main(){ char arrays[12]; char *pointers= arrays; scanf("%s",pointers); printf("%s",pointers); return 0; } 

因为您正在写入尚未初始化的内存中的地址。 通过未初始化的指针写入内存指针会调用未定义的行为。 分配足够的内存:

 pointers = malloc(256); if(!pointers) perror("malloc"); else scanf("%255s", pointers); 

或者将其声明为静态数组:

 char pointers[256]; 

您还应该考虑使用fgets()而不是scanf()。

您可能想要阅读i您对fgets()感兴趣:

scanf()和fgets()之间的区别

  • char *pointers; 创建一个指针变量。
  • pointerspointersaddress ,默认情况下是不确定的。
  • *pointers*pointers的地址中的数据,在分配地址之前,您无法执行此操作。

就这样做吧。

 char arrays[12]; char *pointers; pointers = arrays; scanf("%s",pointers); 

你能详细说明错误,我现在不在编译器周围。

但是要使scanf和printf工作,你必须将它放在程序的顶部:

 #include  #include  

两者都是C的标准库.IO包含scanf,我很确定printf是相同的。 但是,除非您知道哪些库需要哪些function,否则每个程序都包含两个标准库。 尝试使用自定义头文件,因此您不需要为每个文件提供大量#includes。

不要忘记用于内存分配的malloc语句。

但是我不确定你试图用你的代码做什么,请详细说明一下?

pointers正在使用而没有初始化,如int x; printf("%d\n", x); int x; printf("%d\n", x); 。 在使用之前,您需要使指针指向某个东西。 你正在读哪本书?

pointers是一个整体指针。 你无法写入它。 您将分配足够的内存来存储字符串,就像使用arrays 。 使用指针,可以使用动态分配(参见malloc )。