首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >小代码的分割错误

小代码的分割错误
EN

Stack Overflow用户
提问于 2018-05-01 03:33:21
回答 4查看 129关注 0票数 1

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

代码语言:javascript
复制
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);
}

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

EN

回答 4

Stack Overflow用户

发布于 2018-05-01 03:34:36

字符串需要有NUL终止符,而你没有,也没有空间给它。

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

代码语言:javascript
复制
char array1[4];
// ...
array1[3] = 0;

另外,您要求打印一个字符串,但却提供了一个字符。您需要提供整个buffer:

代码语言:javascript
复制
printf("%s", array1);

那你就没问题了。

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

票数 2
EN

Stack Overflow用户

发布于 2018-05-01 03:39:00

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

其次,array1[i+1]是一个单一的char而不是字符串,所以使用%c代替%s作为

代码语言:javascript
复制
printf("%c", array1[i+1]);
票数 2
EN

Stack Overflow用户

发布于 2018-05-01 03:39:12

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

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

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

代码语言:javascript
复制
char array[] = "abc";

它将自动为null终止,大小为4。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50107027

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档