我正在尝试测试一些东西,我做了一个小测试文件。代码是:
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);
}
编译并尝试运行时收到分段错误。请让我知道我的问题是什么。
答案 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)
不兼容,即使它没有机会成为任何有意义字符串的有效指针......