我尝试使用“extern”设置一个全局变量数组 ptr,但在我用来初始化它的函数返回后,该数组变为 NULL。
我在 globals.h 中声明 ptr
#ifndef GLOBALS_H
#define GLOBALS_H
extern const int N;
extern double *ptr;
void init_globals();
void cleanup_globals();
#endif /* GLOBALS_H*/
globals.c 用于定义和初始化它:
#include "globals.h"
#include <stdlib.h>
#include <stdio.h>
const int N=3;
double *ptr;
void init_globals()
{
double *ptr = calloc(N, sizeof(double));
for(int i = 0; i<N; i++)
{
ptr[i] = 9;
}
}
void cleanup_globals()
{
free(ptr);
ptr = NULL;
}
最后是 main.c 文件:
#include <stdio.h>
#include "globals.h"
#include <stdlib.h>
int main()
{
init_globals();
if (ptr == NULL)
{
printf("ptr is NULL...\n");
}
cleanup_globals();
return 0;
}
我正在将 cmake 与 VScode 和 Visual Studio Build Tools 2019 一起用于编译器 CMakeLists.txt 代码:
cmake_minimum_required(VERSION 3.0.0)
project(test_project VERSION 0.1.0)
include(CTest)
enable_testing()
set(CMAKE_C_STANDARD 17)
add_executable(test_project globals.c main.c)
include_directories(test_project PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include(CPack)
编译得很好。我检查了调试器,我看到正在分配的数组和我选择的值,但是一旦 init_globals() 返回,ptr 就会变为 NULL。我的印象是它不应该。我相信文件链接正确,所以我有点无能为力。