我正在尝试测试某些内容,为此我制作了一个小的测试文件。代码为:
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 *
不兼容,即使它是,它也没有机会成为任何有意义的字符串的有效指针......