繁体   English   中英

为什么该程序给我一个“细分错误”?

[英]Why does this program give me a “segmentation fault”?

因此,我的兄弟正在编写一个程序,将字符串中的所有单词都转换为主题标签,但是由于某种原因,它总是在执行结束时出现“分段错误”错误。 我试图找到可能导致它的原因,但没有找到。 这是代码:

#include <stdio.h>
#include <string.h>

char* setHashtag(char text[10000])
{
    int i, j;

    printf("Initial text = %s\n", text);

    for (i = 9998; i >= 0; i--)
    {
        text[i+1] = text[i];
    }
    text[0] = ' ';

    for (i = 0; text[i+1] != '\0'; i++)
    {
        if(text[i] == ' ' && text[i+1] != ' ')
        {
            for (j = 9998; j > i; j--)
            {
                text[j+1] = text[j];
            }
            text[i+1] = '#';

            printf("Partial text = %s\n", text);
        }
    }

    return text;
}

void execute() {
    char text[5000], textFinal[10000];

    gets(text);

    strcpy(textFinal, setHashtag(text));
    printf("%s\n", textFinal);
}

int main()
{
    execute();
    printf("Back to main\n");
    return 0;
}

您将大小为5000的数组传递到函数中,但在其中访问了10000元素。 当然会崩溃。

函数声明中指定的数组大小无关紧要。 编译器将忽略它。 这个

char* setHashtag(char text[10000])

相当于这个

char* setHashtag(char *text)

也就是说,该函数将收到一个指向原始参数数组开头的指针,而不是该参数数组的新本地副本(C中的裸数组不可复制)。

这意味着当您调用函数为

char text[5000];
...
setHashtag(text)

text数组不会神奇地变成char [10000]数组。 它仍然是最初声明的char [5000]数组。 在函数内部尝试访问text[9998]等会导致未定义的行为。

由于您的setHashtag函数期望使用固定大小为10000数组,因此最好将函数声明为

char* setHashtag(char (*text)[10000])

并以setHashing(&text)形式setHashing(&text)数组参数。 这将确保您将无法传递错误大小的数组。 在函数内部,您必须以(*text)[i]访问数组。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM