我希望在
之后*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的指针,因为我的OS是64位的,所以它占用8个字节。 我们使用* b取消引用指针,即访问其内容。 b具有char *类型,a [0]具有char类型,* b具有char类型。怎么了?
答案 0 :(得分:2)
这里的问题是您没有为char
分配任何b
指向的位置,但是您尝试写到b
指向的位置,这就是它崩溃的原因。
您可能想要类似的东西:
b = &a[0]
现在b
包含a
的第一个元素的地址,即&a[0]
(也恰好与您通过a
获得的地址相同,方式)。
或者,如果您希望b
指向它自己的char
并像代码中那样复制第一个字符,则可以事先为其分配内存:
b = malloc(sizeof(char)); // after this, *b=a[0]; can be done
如果这样做,别忘了在完成后释放该内存:
free(b);
答案 1 :(得分:0)
*b=a[0];
您崩溃了,因为您在未初始化时取消引用 b
所以您写入一个未知的地址,并有机会使该地址无效并导致崩溃,最糟糕的是何时可以写入