【发布时间】:2011-08-16 13:38:42
【问题描述】:
不要担心我的帖子的长度,它很简单,我只是不知道如何把它更短:
我有两种非常类似于通过函数合并两个数组的方法。这里我调用函数combine_data()。这些数组称为data1 和data2。假设我的数组是这样的:
int num1 = 4;
int num2 = 6;
double data1[num1] = /* some values */
double data2[mum2] = /* some values */
解决方案 1
我可以使用我认为更优雅的解决方案,但我不确定这是否是好的做法并且会正常运行。 该解决方案依赖于一个旨在使数组持久化的静态变量。不知何故,感觉它可能会以某种方式在我的脸上爆炸。
// SOLUTION 1
double* combine_data(
const int num1, const double* const data1,
const int num2, const double* const data2
) {
int i;
int num = num1 + num2;
double *combi; // static because the data stored the should persist
combi = (double*)malloc( num*sizeof(*combi) );
/* some code */
for(i=0; i<num1; ++i) combi[i] = data[i];
for(i=num1; i<num; ++i) combi[i] = data[i];
return combi;
}
double *combi = combine_data(num1, data1, num2, data2);
/* some code */
free(combi); // problem with free of a static variable in combine_data() ???
解决方案 2
或者我可以使用我更习惯的方法,将指针用于相同的功能:
// SOLUTION 2
void combine_data(
const int num1, const double* const data1,
const int num2, const double* const data2
double* combi
) {
/* some code */
for(i=0; i<num1; ++i) combi[i] = data[i];
for(i=num1; i<num; ++i) combi[i] = data[i];
}
int num = num1 + num2;
double *combi = (double*)malloc( num*sizeof(combi) );
combine_data(num1, data1, num2, data2, combi);
/* some code */
free(combi);
解决方案 2 的问题是没有什么能阻止用户这样做:combine_data(num1, data1, num2, data2, data1),这会搞砸data1。解决方案 2 隐藏了分配,并且更易于使用,我发现它更优雅,但我不知道它会如何表现,尤其是在释放内存时。 哪种解决方案最好,为什么?
顺便说一句。两者有区别吗?:
const int* const name
const int const *name
编辑:其中一个确实是我在错误代码中看到并想知道的语法错误。也丢弃了static。
【问题讨论】:
-
为什么需要解决方案1中的静态指针?为什么不直接返回一个指向分配内存的指针并让调用者释放它呢?
-
double *combi = (double*)malloc( num*sizeof(combi) );的工作方式巧合,因为您有一个 64 位操作系统,并且指针的大小与doubles 相同。sizeof(combi)与sizeof(double*)相同;你真正需要的是sizeof(*combi)。 -
@zbeak 是的,我知道。我只是打错了,但感谢您的更正!