小代码的分段错误

时间:2018-04-30 19:33:21

标签: c segmentation-fault

我正在尝试测试一些东西,我做了一个小测试文件。代码是:

void main(){
    int i = 0;
    char array1 [3];
    array1[0] = 'a';
    array1[1] = 'b';
    array1[2] = 'c';

    printf("%s", array1[i+1]);
    printf("%d", i);
}

编译并尝试运行时收到分段错误。请让我知道我的问题是什么。

4 个答案:

答案 0 :(得分:2)

字符串需要有一个NUL终止符,你没有NUL终结符,也没有空间。

解决方案是再添加一个字符:

printf("%s", array1);

此外,您要求打印字符串,但提供字符。您需要提供整个缓冲区:

{{1}}

然后你没事。

花时间了解C字符串是如何工作的,特别是关于终结符的要求,因为缓冲区溢出错误不是开玩笑。

答案 1 :(得分:2)

请告诉我我的问题是什么。 ?首先char array1[3];没有空终止,因为没有足够的空间将'\0'放在array1的末尾。为避免此未定义的行为,请增加array1的大小。

其次,array1[i+1]是一个char非字符串,因此请使用%c代替%s

printf("%c", array1[i+1]);

答案 2 :(得分:2)

我建议你为自己制作一本关于C的好书/视频系列。它不是一种非常有趣的语言。

无论如何,你的问题是你还没有形成正确的字符串。在C中,字符串是指向恰好用字符填充的连续内存区域的开头的指针。没有关于它的大小或任何其他特征存储的数据。只有它开始的地方和它是什么。因此,您必须提供有关字符串何时显式结束的信息。这是通过将字符串中的最后一个字符设置为所谓的空字符(在转义序列'\0'表示的C中)来完成的。

这意味着任何字符串必须比您希望它保留的内容长一个字符。您也不应该像这样手动设置字符串。使用像strlcpy这样的库函数来完成它。即使您的数组太小(通过截断字符串),它也会自动添加空字符。或者,您可以静态创建这样的文字字符串:

char array[] = "abc";

它将自动以null结尾并且大小为4。

答案 3 :(得分:1)

printf在格式化字符串中看到"%s"说明符时,它需要char*作为相应的参数,但是您传递了char array1[i+1]的值char表达式。 int被提升为char *,但仍然与SELECT * FROM YourTable WHERE c_specialty IN ( SELECT c_specialty FROM YourTable GROUP BY c_specialty HAVING COUNT(c_specialty) = 1) 不兼容,即使它没有机会成为任何有意义字符串的有效指针......