繁体   English   中英

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

[英]segmentation fault in C assign string to char

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

为什么这会引发细分错误? 屏幕后面会发生什么?

您需要使用char *a = "..."

传递%s时, printf将通过字符串查找0 / NULL字节。 在你的情况你是不是指定一个字符串来a ,而实际上你的编译器应该扔了你试图初始化警告char从一个指针。

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

你的错误是

char a="9jhjhi";

应该

char *a="9jhjhi";

发生的是未定义的行为-因此任何事情都可能发生。

您将字符串文字分配给char,因此a将包含一个指针(指向该字符串的开头),该指针将转换为char-无论如何。

printf中的%s转换假定您向其传递了一个字符串,该字符串必须是char *,它指向以0终止符结尾的字符序列。 您为它传递了一个char,它肯定不满足那些要求,所以将要发生的事情是非常不确定的-崩溃很常见。

您还应该从main()方法返回一些内容-声明它毕竟要返回一个int值。

C没有字符串b = new String();

C具有char类型的数组。

因此char a =“ 123123”应该是一个字符数组。

您也没有在该代码中使用stdlib.h中的任何内容,因此没有理由#include它。

编辑:是的,也没有说什么。 数组名称是一个指针。

a初始化为一个指向char数组(可能在ROM中的某个位置)的指针(将其转换为整数,并由于char太小3或7个字节而被截断)。 接下来的内容是未定义的,但可能是这样的:当您将它传递给带有格式字符串中的%s printf时,它将从堆栈中获取a (在0-255 )和3(或7)个无关字节的值。 ,获取一些虚假的地址,并通过访问别人的记忆来发ha。

使用char *a = ...

你的意思是

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 ,但将其解释为字符串。 由于它绝不是以Null结尾的,因此在通过该“字符串”进行竞争时, printf可能会超出内存。

当声明不带指针符号的char a ,您仅在堆栈上为单个字符分配了足够的空间。

在C字符串由代表char阵列,或一个指向一个char阵列,由空字符结束'\\0' 但是,如果您使用文字字符串,则编译器会为您处理所有这些工作。

这是使代码正常工作的方法,然后:

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

首先,您试图将整个字符串保存到单个char变量中。 请改用char数组(char [size])。 您可能还想以“ \\ 0”终止字符串。

您可以通过两种方式消除此错误。

1.char * p =“ karthik A”

2.char [] p =“ karthik A”

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM