【发布时间】:2019-06-08 06:13:16
【问题描述】:
我预计之后
*b = a[0]
行:
printf("%c\n", *b);
将打印字符串 a 中的第一个字符。这是我的短代码:
#include <stdio.h>
int main(){
char a[20];
char* b;
scanf("%s", a);
printf("a: %s\n", a);
*b=a[0]; // I suppose something here is wrong
printf("%c\n",*b);
return 0;}
输入:
STRING
输出是:
a: STRING
Segmentation fault (core dumped)
据我所知,当我们尝试访问未分配的内存(静态或动态)时,会发生分段错误。 在这里,b 是指向 char 的指针,它需要 8 个字节,因为我的操作系统是 64 位的。 使用 *b 我们取消引用指针,即访问它的内容。 b 具有 char* 类型,a[0] 具有 char 类型,*b 具有 char 类型。怎么了?
【问题讨论】:
-
当然,指针本身是64位的,但它指向哪里呢?谁分配了这些内容?
-
@Angew 你是说即使我为指针分配了空间(通过 char* b),我也必须为 b 指向的变量分配空间?就像我们调用 malloc 为维度为 n 的数组分配空间一样,我应该以某种方式为这个单个字符分配空间?
-
没错。好吧,你可以让它指向已经存在的东西,但是你的
*b=a[0];行说“取a的第一个元素并复制到b指向的地方”。为此,它必须已经指向某个有效的地方。
标签: c pointers char variable-assignment