【问题标题】:Declaring global variable (array) inside a function in C在 C 中的函数内声明全局变量(数组)
【发布时间】:2011-10-11 03:46:46
【问题描述】:

我需要在 C 中声明一个全局二维数组。

数组的大小由给定图片的宽高决定。

所以我首先要加载图片,然后才创建数组。但是如果我想让一个变量(在这种情况下,我的数组)是全局的,我必须在文件顶部声明它,而不是在函数内部。

那么,当我在 main() 函数执行后才知道数组的大小时,如何将数组声明为全局数组?

编辑: (我也尝试过其他解决方案,所以这个 cmets 指的是所有这些)@Mimisbrunnr 首先,感谢您的快速回复!

我已经尝试过了,但我看不到让它起作用。我可能错过了一些愚蠢的东西,但是“数组”如何成为全球性的?它在 test() 上说“数组”未声明

int *buffer;

int main() {
    int i;
    int x_size=100;
    int y_size=100;

    int * buffer = malloc(sizeof(int)*x_size*y_size);
    int ** array = malloc(sizeof(int*)*y_size);

    for(i = 0; i<y_size; i++) {
        array[i]=&buffer[i*x_size];
    }

    array[0][1] = 5;
    test();
    return 0;
}

void test(){
    printf("%d",array[0][1]);
}

【问题讨论】:

  • 你真的需要一个全局变量(指针)吗?你不能把它转过来吗?传递它会使函数原型“复杂化”,但会使管理变得更容易,尤其是在处理多线程应用程序时。
  • @pmg: OTOH,函数原型的“复杂化”明确了函数的工作原理。
  • 是的@ninja。我有一个很好的证据证明全局变量不好,但是这个评论框太小了:)
  • 我可以通过它......但正如你所说,它确实会使我的代码复杂化。而且由于我现在只是为了学习 C,所以我想知道如何解决这个问题的所有选项,所以以后当我在现实生活中的程序中遇到它时,我就能做到以最好的方式。

标签: c global-variables dynamic-allocation


【解决方案1】:

创建一个全局指针,然后将空间分配到其中。

char * buffer;

int main(void) {

    buffer = malloc( /* Width * Height */ );

}

【讨论】:

  • @user:606723:与指针对指针相比,这是一种更安全、更有效的处理二维数组的方法。
【解决方案2】:

我并没有实际执行此代码,但这应该可以帮助您入门。

int x_size = 100;
int y_size = 100;

int ** array;
array = malloc(sizeof(int *)*y_size);
for(int i = 0; i<y_size; i++)
array[i] = malloc(sizeof(int)*x_size);

larsmans 提出了一个很好的观点。

这个呢?

int x_size = 100;
int y_size = 100;

int * buffer = malloc(sizeof(int)*x_size*y_size);

int ** array = malloc(sizeof(int *)*y_size);
for(int i = 0; i<y_size; i++)
array[i] = &buffer[i*x_size];

看来您可能需要一些基本的 C 教程。

int *buffer;
int **array;
int main()
{
int x_size=100;
int y_size=100;
int i;
/*int * */ buffer = malloc(sizeof(int)*x_size*y_size);
/*int ** */ array = malloc(sizeof(int*)*y_size);
for(i = 0; i<y_size; i++)
 array[i]=&buffer[i*x_size];
array[0][1] = 5;
test();
return 0;
}
void test()
{
printf("%d",array[0][1]);
}

【讨论】:

  • 这稍微紧凑一些,但你仍然需要两次调用free 来删除数据(我知道,它是全球性的......)。此外,与使用具有适当索引技巧的单个数组相比,它的内存效率仍然较低,并且可能会丢失引用的局部性。
  • 也许,但我认为这对于可能不喜欢使用“适当的索引技巧”的人来说是一个很好的折衷方案。
  • 我尝试发表评论,但无法在 cmets 中创建新行,因此我编辑了我的主要帖子。谢谢!
  • 谢谢!它工作得很好!我现在正在学习 C,整个指针对我来说非常复杂——所有的 *、**、$、malloc 等等。无论如何,非常感谢 cmets!虽然我不确定我是否理解它,但我会尝试重新阅读我书中的变量和指针章节!
【解决方案3】:

使用static 变量(指针)并使用malloc 动态分配数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-13
    • 2012-09-01
    • 2014-01-17
    • 1970-01-01
    • 1970-01-01
    • 2019-05-09
    • 2015-05-11
    相关资源
    最近更新 更多