c# 在C中声明后初始化全局数组

kzipqqlq  于 2023-05-05  发布在  C#
关注(0)|答案(3)|浏览(253)

我需要一个全局数组的大小取决于用户。问题是我不知道如何声明一个数组globalLy,但是在得到用户输入以知道大小之后初始化它。我甚至不确定这是否可能,因为阵列的存储是在程序开始运行后分配的。所以我的问题是,我如何初始化一个全局数组后decleration的数组大小为t?

//what i want to achieve 
...
struct some_name* sn;
...

main(){
...
   sn = some_name[t]; //Where t is unkown before running the code
...
}
lf5gs5x2

lf5gs5x21#

你可以在运行时动态分配你的数组,如下所示:

struct some_name* sn;
....
sn = malloc(t * sizeof(struct some_name));

这样做的缺点是,您要重复两次类型名称,如果sn的类型发生了变化,您必须记住也要更改malloc()
避免该问题的等效替代方案是:

sn = malloc(t * sizeof *sn);

malloc()分配的内存是未初始化的,可以包含任何内容。如果你想要零填充内存,你可以用途:

sn = calloc(t, sizeof *sn);

当你完成它的时候,不要忘记释放你的记忆:

free(sn);

另外,不要忘记,如果malloc()calloc()无法分配您请求的内存,它们都可以返回NULL。您应该始终检查这一点,并适当地处理错误。
编辑:注意struct some_name* sn;定义的是指针,而不是数组。在为它分配了所需的内存并将sn设置为该值之后,它可以被视为数组,例如。您可以使用相同的[]符号访问其元素:

sn[0].foo = 12;
ndh0cuux

ndh0cuux2#

如何在声明为大小为t数组后初始化全局数组?
在C中,initialization 有特定的含义,不能在声明后出现。* 分配 * 可以稍后进行。
一旦定义了一个 array,它的大小就不会改变,所以代码不能有一个大小的数组,然后再改变成另一个。
相反,代码可以稍后分配内存并将其分配给指针。分配大小可能会改变。

#iinclude <stdlib.h>

struct some_name* sn = NULL;
size_t sn_size = 0;

int main() {
  sn_size = foo(); // some user input
  sn = malloc(sizeof sn[0] * sn_size);
  if (sn == NULL && sn_size > 0) {
    Handle_eooor();
  }

  // Assign
  for (size_t i = 0; i < sn_size; i++) {
    sn[i] = ...; // OP's assignment code.
  }

  ...

  free(sn);
}

拉特尔

kxxlusnw

kxxlusnw3#

#include<stdio.h>
struct some_name* sn;

int main()
{
    sn = malloc(t*sizeof(some_name)); // stores garbage values by default
    // sn = calloc(t, sizeof(some_name)); // stores zero values by default
    free(sn); // free the memory space
    return 0;
}

相关问题