C中的分段错误将字符串赋值给char

时间:2011-02-16 19:02:08

标签: c

#include <stdio.h>
#include <stdlib.h>
int main()
{
    char a="9jhjhi";
    printf("%s",a);
}

为什么会出现分段错误?屏幕背后会发生什么?

8 个答案:

答案 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的指针(指向该字符串的开头) - 无论它是什么。

printf中的

%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时,它的值为a0-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”