使用指向字符的指针和scanf函数

17

我已经编写了以下代码:

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

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

6个回答

16
char *pointers;

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

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

5
我喜欢你提供了malloc的替代方案。 - autistic

10

因为您正在写入未初始化的内存地址。对未初始化指针所指向的内存进行写操作会引发未定义行为。要么分配足够的内存:

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

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

char pointers[256];

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

如果你对fgets()感兴趣,可以阅读下面这篇文章:

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


“指针默认指向空”这种说法是错误的。 - autistic
确定吗?指针不能保证为NULL,它不是静态变量。 - Emanuele Paolini
@KingsIndian,那个编辑中的代码严重有问题。此外,当您使用%s格式说明符时,scanf将与fgets表现不同。 - autistic
2
@modifiablelvalue 修正了打字错误。我只建议使用 fgets()。我没有说它们是彼此等价和替代的。如果某人不知道标准函数的工作原理,我希望他们在使用前阅读手册。 - P.P
@modifiablelvalue 哈哈,无论如何我添加了手册链接和另一个描述差异的问题 :) - P.P

5
  • char *pointers; 创建一个指针变量。
  • pointers 是由 pointers 指向的地址,默认情况下是不确定的。
  • *pointers 是由 pointers 指向的地址中的数据,直到分配地址后才能进行操作。

就是这样。

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

s/which is NULL by default/默认情况下是未确定的/ - autistic

3

pointers 被未初始化使用,就像 int x; printf("%d\n",x);。在使用前需要指向某个东西。你正在读哪本书?


1

pointers 是一个未初始化的指针。您无法将数据写入其中。您需要分配足够的内存来存储字符串,就像使用 arrays 一样。使用指针时,可以使用动态分配(参见 malloc)。


0

你能详细说明一下错误吗?我现在身边没有编译器。

但是为了让scanf和printf正常工作,你必须在程序的开头加上这个:

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

这两个都是C语言的标准库。IO包含scanf,我相信printf也在同一个库中。但是在你知道哪些函数需要哪些库之前,为每个程序包含两个标准库不会有害。尽量使用自定义头文件,这样您就不需要为每个文件进行大量的#include。

不要忘记使用malloc语句进行内存分配。

但我不确定您的代码意图是什么,请详细说明?


这根本不是答案。没有头文件甚至不是崩溃的原因。 - Antti Haapala -- Слава Україні

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接