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

Sau*_*h.V 10 c scanf

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

我写了以下代码.

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

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

Jun*_*sco 13

char *pointers; 
Run Code Online (Sandbox Code Playgroud)

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

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

  • 我喜欢你如何替代`malloc`. (5认同)

Gig*_*igi 7

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

pointers = malloc(256);
if(!pointers)
  perror("malloc");
else
  scanf("%255s", pointers);
Run Code Online (Sandbox Code Playgroud)

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

char pointers[256];
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • @modifiablelvalue修正了拼写错误.我只建议fgets().我没有说他们是相同的,也是替代品.我希望任何人在使用之前阅读手册,如果该人不知道标准功能如何工作. (2认同)

ATO*_*TOA 5

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

就这样做。

char arrays[12];
char *pointers;
pointers = arrays;
scanf("%s",pointers);
Run Code Online (Sandbox Code Playgroud)