#include <stdio.h>
#include <stdlib.h>
int main()
{
char a="9jhjhi";
printf("%s",a);
}
为什么会出现分段错误?屏幕背后会发生什么?
答案 0 :(得分:5)
您需要使用char *a = "..."
。
printf
时 %s
将通过字符串查找0
/ NULL
字节。在你的情况下,你没有为a
分配一个字符串文字,事实上你的编译器应该抛出一个警告,你试图从指针初始化char
。
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *a="9jhjhi";
printf("%s",a);
}
答案 1 :(得分:4)
您的错误是
char a="9jhjhi";
应该是
char *a="9jhjhi";
未定义的行为会发生什么 - 所以任何事情都可能发生。
您将字符串文字指定给char,因此您的a
将包含一个转换为char的指针(指向该字符串的开头) - 无论它是什么。
%s
转换假设您传递一个字符串,该字符串必须是一个char *,指向以0终结符结尾的字符序列。你传给它一个char,肯定不符合这些要求,所以它很不确定会发生什么 - 崩溃可能很常见。
你还应该从main()方法返回一些内容 - 它被声明为返回一个int。
答案 2 :(得分:1)
C没有字符串,如String b = new String();
C具有char。
类型的数组所以char a =“123123”应该是一个字符数组。
您没有在该代码中使用stdlib.h中的任何内容,因此没有理由#include它。
编辑:是的,nos也说了。数组名称是指针。
答案 3 :(得分:1)
a
被初始化为a(强制转换为整数并截断,因为char
是3或7个字节太小)指向char数组的指针(可能在ROM中的某个位置)。接下来的内容是未定义的,但它可能是这样的:当您将格式字符串中的printf
传递给%s
时,它的值为a
(0-255
中的内容来自堆栈的3个(或7个)不相关的字节,得到一些虚假的地址,并通过访问其他人的记忆而肆虐。
使用char *a = ...
。
答案 4 :(得分:1)
你的意思是
char *a = "9jhjhi";
如果在没有警告的情况下进行编译,则编译器设置会混乱。来自gcc的警告清楚地显示了正在发生的事情:
test.c: In function ‘main’:
test.c:5: warning: initialization makes integer from pointer without a cast
test.c:6: warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘int’
字符串文字被解释为指针,它被转换(并截断)为char
。
然后char
作为数字发送到printf
,但被解释为字符串。由于它不以任何方式以空值终止,printf
可能在通过该“字符串”比赛时超出内存。
答案 5 :(得分:0)
当您在没有指针符号的情况下声明char a
时,您只在堆栈上为单个字符分配足够的空间。
C中的字符串由char
数组或指向char
数组的指针表示,由空字符'\0'
终止。但是如果你使用文字字符串,编译器会为你处理所有这些。
以下是如何使代码工作的原因:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *a = "9jhjhi";
printf("%s",a);
}
答案 6 :(得分:0)
首先,您尝试将整个字符串保存到单个char变量中。请改用char数组(char [size])。您可能还希望使用“\ 0”终止字符串。
答案 7 :(得分:0)
您可以通过两种方式删除此错误。
1.char * p =“karthik A”
2.char [] p =“karthik A”