将动态数组从一个函数内部传递到C中的另一个函数

时间:2011-02-06 16:31:06

标签: c

如果我在函数内创建一个动态数组并在其中插入值,并且我想在其他函数中使用此数组,但我希望它的值不被销毁,我应该将它声明为静态和extern ?如果是这样,我该怎么做?

例如:

交流转换器

void func1(void)
{
    char *filename;
    file_name=(char *) malloc ((SIZE)*sizeof(char));

    strcpy(file_name , other_file_name); 
    file_name[N-1] = '\0'; 
    file_name[N-2] = 'x';

bla bla
} 

b.c

void func2(void)
{
operations on file_name
}

my_main.c

#include <stdio.h>
MORE INCLUDES HERE

#include "a.h"
#include "b.h"
int main()
{

bla bla ...

return 0;
}

这是目的,但我应该在func1()static extern char *filename;内声明吗? 如果这是正确的方式,我还应该做些什么才能让它发挥作用?

3 个答案:

答案 0 :(得分:1)

请勿将其声明为extern。在这种情况下使用全局变量是非常糟糕的风格。你想要做的是传递一个指向文件名数组的指针作为func2的参数。当您调用malloc时,操作系统会为堆中的内存分配独立于调用堆栈的内存。因此,即使func1返回它仍然存在(直到你调用free)。

例如

void func1(void)
{
char * filename;
filename = (char*)malloc((SIZE)*sizeof(char));
//do stuff
func2(filename);
}

void func2(char * filename)
{
//do stuff to filename
}

答案 1 :(得分:0)

如果通过malloc分配内存,则只需从函数返回指针即可。分配的内存不会自动释放。您必须使用free来执行此操作。

答案 2 :(得分:0)

您一次只能使用一个存储类 - 因此您无法同时使用staticextern来限定单个变量。

使用动态分配的数组,知道哪些代码将释放分配的空间至关重要。如果不这样做,您将有内存泄漏。在小规模的程序中,尽管内存泄漏,程序仍会运行,但这可能并不重要。但是,在大型程序中,尤其是长期运行的程序(文字处理程序,DBMS等),这一点至关重要。

您可以将动态分配的数组 - 或指向动态分配的数组的指针 - 传递给另一个函数。如果您不希望其他函数修改它,您应该编写另一个函数,因此它需要const SomeType *arg作为参数。然后编译器将确保您的代码不会修改数组。

因此:

header.h

extern void func2(const char *filename);
extern void func1(void);

交流转换器

#include "header.h"
#include <stdlib.h>
#include <string.h>

extern const char *other_file_name; // Should be in a header!

void func1(void)
{
    char *filename;
    size_t N = strlen(other_file_name) + 1;
    filename = (char *)malloc(N);

    strcpy(filename, other_file_name); 
    file_name[N-1] = '\0'; 
    file_name[N-2] = 'x';

    func2(filename);
    free(filename);
} 

b.c

#include "header.h"

void func2(const char *filename)
{
    ...operations on filename...
}

的main.c

#include "header.h"

int main(void)
{
    ...
    func1();
    ...
    func2("/etc/passwd");
    return 0;
}

或者,不太理想,您可以将filename变为全局变量。在这种情况下,您应该在header.h中声明它。但是,您不能让编译器强制执行func2()应将变量视为常量的约束 - 这是不使用全局变量的另一个原因。

另见SO 1433204有关C中extern变量的讨论。