C语言 函数返回空值而不是字符数组的地址[重复]

yqkkidmi  于 2023-03-22  发布在  其他
关注(0)|答案(1)|浏览(108)

此问题在此处已有答案

error: function returns address of local variable(8个答案)
2天前关闭。
我试图在C中复制返回堆栈变量的问题,但它没有像我预期的那样工作。lowercase3是我期望返回本地char数组地址的函数:

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

char *lowercase3(const char* str) {
    char copy[strlen(str) + 1];
    for (int i = 0; i <= strlen(str); i++) {
        copy[i] = tolower(str[i]);
    }
    return copy;
}

int main() {
    char stack[13] = "Le Land";
    char heap[13] = "Standford";
    char const* const_literal = "Hello World!";

    char* result1 = lowercase3(stack);
    char* result2 = lowercase3(heap);
    char* result3 = lowercase3(const_literal);
    // print stack heap and const_literal
    printf("stack: \"%s\", result: \"%s\"\n", stack, result1);
    printf("heap: %s, result: %s\n", heap, result2);
    printf("const_literal: %s, result: %s\n", const_literal, result3);
}

但是,当返回copy时,它只返回null。
我运行了调试器,变量“copy”是一个值为leland的char数组。所以我希望它返回堆栈变量“copy”的地址。为什么函数在这里返回null?

klsxnrf1

klsxnrf11#

未定义行为
char *lowercase3(const char* str) {
    char copy[strlen(str) + 1];
    return copy;
}

这返回一个指向函数本地内存的指针。这是未定义的行为。

考虑使用更好的编译器

我还建议使用一个更好的编译器,clang 16.0.0会给予以下警告:
https://godbolt.org/z/jzdWYz36a

<source>:11:12: warning: address of stack memory associated with local variable 'copy' returned [-Wreturn-stack-address]
    return copy;
           ^~~~
1 warning generated.

相关问题