C语言 当我引用不是由我分配的内存地址时会发生什么?

yqlxgs2m  于 2022-12-02  发布在  其他
关注(0)|答案(1)|浏览(129)

下面是一个例子:`

#include <stdio.h>
#include <string.h>
int main()
{
    char s1[] = "abcd", c;
    scanf("%c", c);
    char* pToC = strchr(s1, c);
    if (pToC)
    {
        if (*(pToC - 1) == a)
        {
            printf("%c", c);
        {
    }
return 0;
}

'在这种情况下,如果我输入“a”会发生什么?我的程序中也有类似的情况,我正在考虑会发生什么。在我的程序中,我必须检查strstr()找到的单词前面是否有空格,但strstr()的结果也可能指向字符串的第一个字符。
我期望它只在我输入“B”的时候才能工作。
编辑:由于注解有最大字符数限制,我将把确切的代码放在这里

#include <stdio.h>
#include <memory>

char* WordReplace(char* input, const char* word, const char* replacement)//EXERCISE 13
{
    if (input == 0 || *input == 0 || word == 0 || *word == 0 || replacement == 0 || *replacement == 0)
    {
        return 0;
    }
    int inputLength = strlen(input), wordLength = strlen(word), replacementLength = strlen(replacement);
    char* buffer = input;
    while (strstr(buffer, word))
    {
        char* firstChar = strstr(buffer, word), * nextChar = strstr(buffer, word) + wordLength;
        if ((firstChar == input && *nextChar == ' ') ||
            (firstChar == input && *nextChar == 0) ||
            (*(firstChar - 1) == ' ' && *nextChar == ' ') ||
            (*(firstChar - 1) == ' ' && *nextChar == 0))
        {
            buffer = strstr(buffer, word);
            char* output = (char*)malloc(sizeof(char) * (inputLength - wordLength + replacementLength + 1));
            memmove(output, input, sizeof(char) * (buffer - input));
            if (buffer != input)
            {
                output[buffer - input - 1] = ' ';
            }
            output[buffer - input] = 0;
            strcat(output, replacement);
            strcat(output, buffer + wordLength);
            return output;
        }
        buffer = strstr(buffer, word) + 1;
    }
    return 0;
}

int main()
{
    char thirteenInput[] = "My name is Karl", thirteenWord[] = "My", thirteenReplacement[] = "Your";//INPUT
    printf("WordReplace\n%s, %s, %s\n", thirteenInput, thirteenWord, thirteenReplacement);
    char* thirteenOutput = WordReplace(thirteenInput, thirteenWord, thirteenReplacement);
    if (thirteenOutput)
    {
        printf("%s\n\n", thirteenOutput);
        free(thirteenOutput);
    }
    else
    {
        printf("Word was not found / input error!\n\n");
    }
    return 0;
}
uemypmqf

uemypmqf1#

如果array被定义为一个数组,并且某些特殊情况不适用,则访问array[-1]不是由C标准定义的。如果程序甚至试图计算地址array - 1,则该行为不是由C标准定义的。
当一个数组用订阅表示法访问时,如array[i],C 2018 6.5.2.1 2将其定义为等价于(*((array) + (i))),然后6.5.6 8用一个数组和一个整数定义+
...如果指针操作数和结果都指向同一数组对象的元素,或者指向数组对象最后一个元素之后的元素,则求值不会产生溢出;否则,行为未定义...
因为索引为-1的元素既不是数组中的元素,也不是最后一个元素之后的元素(正向;此处不包括第一元素之前的元素),则行为未定义。
即使你知道数组在内存中的位置,也知道数组前面的数据是什么,但这并不意味着索引为-1的数组访问是安全的,也不意味着它会访问数组前面的数据。因为C语言标准没有定义这种行为,所以编译器在优化过程中可能会以你意想不到的方式转换程序。使得阵列访问产生不同于访问先前存储器的行为。
注意
作为一个特殊情况的例子,如果我们有一个char指针p指向一个包含数组的结构,我们可以用p进行地址运算,只要结果仍然在结构内或超过它的最后一个字节,即使p指向数组,但加法产生的结果在数组之前。

相关问题