为什么从函数返回后全局指针会更改其值?

时间:2019-12-15 10:13:57

标签: c

我正在设置指向局部变量的全局指针的值,如下所示。全局指针的值在函数范围内是正确的,但一旦从函数返回执行,则返回NULL。

In file included from D:/newnativetest/app/src/main/cpp/Eigen/src/Core/Matrix.h:14:
In file included from D:/newnativetest/app/src/main/cpp/Eigen/src/Core/../../Eigen:1:

根据我的理解,addr指针的值应与返回的指针(date_text)或文本相同。但是,返回后返回NULL。我在哪里弄错了 我在机器上看到以下输出

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>

char *addr = NULL;

char* date(){
    time_t now;
    time(&now);
    char* text = asctime(localtime(&now));
    text[strlen(text) - 1] = '\0';
    printf("addr -%p :%s\n", addr, addr);
    char* addr = text;
    printf("addr -%p :%s\n", addr, addr);
    return text;
}

int main(){
    char* date_text = date();
    printf("text -%p :%s\n", date_text, date_text);
    printf("addr -%p :%s\n", addr, addr);
    return 0;
}

2 个答案:

答案 0 :(得分:2)

该行:

char* addr = text;

此行addr中的

是全局变量局部变量 shadowing 。因此,不,您不会更改全局变量。将行替换为

addr = text;

用于更改全局变量。

答案 1 :(得分:1)

您要在此处重新命名*addr local 版本:

printf("addr -%p :%s\n", addr, addr);
char* addr = text; // <--
printf("addr -%p :%s\n", addr, addr);

shadows全局版本。删除char*,您将收到所需的行为。