14

我编写了以下代码。

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

为什么我写 `scanf("%s",pointers) 时会报错?

4

6 回答 6

15
char *pointers; 

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

int main(){
   char arrays[12];
   char *pointers= arrays;
   scanf("%s",pointers);
   printf("%s",pointers);
   return 0;
}
于 2013-01-27T09:35:48.467 回答
10

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

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

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

char pointers[256];

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

您可能想阅读您对 fgets() 感兴趣的内容:

scanf() 和 fgets() 的区别

于 2013-01-27T09:19:13.953 回答
5
  • char *pointers;创建一个指针变量。
  • pointers是 所address指向的pointers,默认情况下是不确定的。
  • *pointers是 指向的地址中的数据,在pointers分配地址之前您无法执行此操作。

就这样做吧。

char arrays[12];
char *pointers;
pointers = arrays;
scanf("%s",pointers);
于 2013-01-27T09:23:42.350 回答
2

pointers是一个未初始化的指针。你无法写入它。你应该分配足够的内存来存储一个字符串,就像你对arrays. 通过指针,可以使用动态分配(参见malloc)。

于 2013-01-27T09:19:14.897 回答
2

pointers在没有初始化的情况下使用,例如int x; printf("%d\n", x);. 在使用它之前,你需要让你的指针指向某个东西。你在看哪本书?

于 2013-01-27T09:20:05.720 回答
1

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

但是要使 scanf 和 printf 工作,您必须在程序的顶部有这个:

#include <stdio.h>
#include <stdlib.h>

两者都是 C 的标准库。 IO 包含 scanf,我很确定 printf 是相同的。但是,除非您知道哪些函数需要哪些库,否则为每个程序都包含两个标准库并没有什么坏处。尝试使用自定义头文件,这样您就不需要为每个文件添加大量#includes。

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

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

于 2013-01-27T09:29:43.740 回答