【发布时间】:2021-09-16 02:42:24
【问题描述】:
我在 SO 上找到了一个 answer,它建议使用以下解决方案在 c 中重新初始化数组。
int *foo = (int[]){1,2,3,4,5};
我不太确定这样的语法到底能做什么,我有几个问题:
如果我的数组是之前创建的,会不会导致内存泄漏?
double *my_array = (double[]){1.1, 2.2, 3.3, 4.4, 5.5};
...
my_array = (double[]){-1.1, -2.2, -3.3}; // Do i need to call free(my_array) first?
是否允许在函数调用中使用这种方式?
void foo(int *arr)
{
arr = (int[]){-2, -7, 1, 255};
}
int main()
{
int *my_array = (int[]){1, 2, 3};
foo(my_array);
if (my_array[2] != 1)
return -1;
}
概括:
- 这样的语法是否只是在堆中分配具有预定义值的新内存并返回指针?
- 它会自动清除前一个指针中的所有内容吗?
【问题讨论】:
-
在您的第二个 sn-p 中,
foo函数只是更改作为其参数传递的指针的副本,并且对main中的值没有影响。您可以将参数设为int **arr,但是,您将返回一个指向本地数据的指针,并且会出现未定义的行为。 -
@Adrian Mole,也许你是对的,但是编译和运行程序会改变原始数组。
-
当我在你上次的 sn-p 中运行代码时,
my_array[2]的值仍然是3(正如我所料)。 -
对不起,我的错,我把这个例子过于简单化了,好像它正在改变原来的例子。
-
您的编辑(在发布答案后进行)使该答案显得无效。您应该考虑回滚该编辑。 (好吧,似乎在您进行编辑时正在编写答案......不过,无论如何可能会回滚:这是一个很好的答案,并解释了您的方法的基本问题。)