调用该函数会出现错误;这怎么解释?

Lor*_*ous 3 c arrays pointers function

我创建的函数(我将其称为 )string_deletion删除出现的特定子字符串,并将字符串向左移动子字符串的长度。该函数接受两个参数:指向数组中遇到子字符串的第一个字母的位置的指针,以及单词的长度。

这是函数:

void string_deletion(char *s, int m)
{
    char *index=s+m;
    while(*index!=0)
    {
        *(index-m)=*(index++);
    }
    *(index-m)=0;
}
Run Code Online (Sandbox Code Playgroud)

该函数将子字符串后面的所有字符向左移动一定量,该量取决于子字符串的长度,用 表示m。我已将index指针设置为指向子字符串出现后立即出现的字符,这是移位开始的标记。执行循环直到NUL遇到字符,然后退出循环。在顶点处,NUL被附加到字符串的末尾。

尽管主代码的其他部分无缝工作,但在必要时调用此特定函数会使程序停止工作并产生错误。这怎么解释呢?

这是完整的代码:

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

int string_len(char *s)
{
    int i=0;
    char *m=s;
    while(*m!=0)
    {
        i++;
        m++;
    }
    return i;
}
void word_enter(char *word_search)
{
    char r;
    char *m=word_search;
    while((r=getchar())!=EOF)
    {
        if(r=='\n')
        {
            *m=0;
            break;
        }
        else
        {
            *(m++)=r;
        }
    }
}
 
void string_disp(char *s)
{
    char *d=s;
    while(*d!=0)
    {
        putchar(*(d++));
    }
}

int string_comp(char *s, char *m)
{
    int stringlength_one=string_len(s);
    int stringlength_two=string_len(m);
    char *s_one=s;
    char *s_two=m;
    if(stringlength_one!=stringlength_two)
    {
        return 1;
    }
    else
    {
        while(*s_one!=0)
        {
            if(*s_one!=*s_two)
            {
                return 1;
            }
            s_one++;
            s_two++;
        }
    }
    return 0;
}

void string_deletion(char *s, int m)
{
    char *index=s+m;
    while(*index!=0)
    {
        *(index-m)=*(index++);
    }
    *(index-m)=0;
}

void string_search(char *s,char *d)
{
    char *m=s;
    char word_buffer[20];
    char *buffer_index=word_buffer;
    while(m!=&s[string_len(s)-string_len(d)+1])
    {
        buffer_index=word_buffer;
        if(*m==*d)
        {   
            int i=0;
            char *r=m;
            while(i<=string_len(d) && *r!=0)
            {
                *(buffer_index++)=*(r++);
                i++;
            }
            *buffer_index=0;
            if(string_comp(word_buffer,d)==0)
            {
                printf("\nInvoking deletion sequence\n");
                string_deletion(m,string_len(d));
            }
        }
    m++;
    }
}   
    
int main(void)
{
    int pos;
    char main_string[100],word[20];
    printf("Enter the main string: ");
    word_enter(main_string);
    printf("\nEnter the string you wish to delete: ");
    word_enter(word);
    string_search(main_string,word);
    string_disp(main_string);
    exit(EXIT_SUCCESS);
}
Run Code Online (Sandbox Code Playgroud)

n. *_* m. 6

*(index-m)=*(index++)
Run Code Online (Sandbox Code Playgroud)

这是未定义的行为。如果您使用后置或前置递增/递减,请勿在同一表达式中再次使用同一变量。

index[-m] = *index;
++index;
Run Code Online (Sandbox Code Playgroud)