C语言 小代码的分段错误



我正在尝试测试某些内容,为此我制作了一个小的测试文件。代码为:

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);
}

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

请让我知道我的问题是什么。 首先char array1[3];不是空终止的,因为没有足够的空间将''放在array1的末尾。为了避免这种未定义的行为,请增加array1的大小。

其次,array1[i+1] 是单个char而不是字符串,因此请使用 %c 而不是 %s as

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

我建议你给自己买一本关于C的好书/视频系列。这不是一种突然上手很有趣的语言。

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

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

char array[] = "abc";

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

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

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

char array1[4];
// ...
array1[3] = 0;

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

printf("%s", array1);

那你就没事了。

花时间了解 C 字符串的工作原理,特别是对终止符的要求,因为缓冲区溢出错误不是开玩笑的。

printf在格式字符串中看到"%s"说明符时,它期望char*作为相应的参数,但您传递了array1[i+1]表达式的char值。那个char被提升为int但仍然与char *不兼容,即使它是,它也没有机会成为任何有意义的字符串的有效指针......

相关内容

  • 没有找到相关文章

最新更新