c - 另一个函数返回时主函数中的变量访问?

标签 c

所以我在互联网上看到了这段代码,用于在 C 中使用递归反转字符串。

除了 reverse 的部分,我理解代码函数返回 str1然后 str1印在main功能。 str1不是通过引用传递的,而只是通过地址传递的。那么当它通过 main 打印时,它如何打印反转的字符串而不是原始字符串?功能?

void reverse(char str1[], int index, int size);

int main() {
    char str1[20];
    int size;

    printf("Enter a string to reverse: ");
    scanf("%s", str1);
    size = strlen(str1);
    reverse(str1, 0, size - 1);
    printf("The string after reversing is: %s\n", str1);
    return 0;
}

void reverse(char str1[], int index, int size) {
    char temp;
    temp = str1[index];
    str1[index] = str1[size - index];
    str1[size - index] = temp;
    if (index == size / 2) {
        return str1;
    } else {
        reverse(str1, index + 1, size);
    }
}

最佳答案

对于初学者,您展示的功能是错误的。如果像这样将空字符串传递给函数

reverse(str1, 0, size - 1);

那么表达式 size - 1 将等于 -1。结果,由于在这些语句中尝试访问数组以外的内存,该函数将具有未定义的行为

str1[index] = str1[size - index];
str1[size - index] = temp;

该函数有两个参数。字符串函数通常返回指向目标字符串的指针。所以如果函数 reverse 也返回指向字符串的指针会更好。

它可以定义得更简单。例如

char * reverse(char *s, size_t n)
{
    if (!(n < 2))
    {
        char c = s[0];
        s[0] = s[n - 1];
        s[n - 1] = c;

        reverse(s + 1, n - 2);
    }

    return s;
}

你可以这样调用它

printf("The string after reversing is: %s\n", reverse( str1, strlen( str1) ));

至于你质疑这个声明

void reverse(char str1[], int index, int size);

等价于下面的声明

void reverse(char *str1, int index, int size);
             ^^^^^^^^^^

当一个数组被传递给 tp 这样的函数时

reverse(str1, 0, size - 1);

然后数组指示符被转换为指向其第一个元素的指针。在函数内,数组不会从一个内存区域移动到另一个内存区域。它停留在同一个地址。仅更改数组的元素。所以在退出函数之后,数组的元素将被修改,但它们在内存中的地址将与调用函数之前在数组中的地址相同。事实上,数组元素通过引用传递给函数,即通过指向数组第一个元素的指针。

关于c - 另一个函数返回时主函数中的变量访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41015452/

相关文章:

c - C 语言维吉尼亚密码程序

c - 意外的 pipe() 行为

c - 寻找良好的小型 DES 实现

c - C查询激活记录

c - 头文件中声明函数的链接器混淆 (C)

c - 指针数组的重新分配问题

c++ - 如何像构造函数初始化 C++ 中的所有类对象一样初始化 C 中结构中的所有对象?

c - C中结构成员(指针与数组)的内存分配之间的差异

c - 使用 c 进行矩阵加法

c - csv 文件中的指针和结构