C谜题指针
基本上我想在这里实现的是具有全局变量指针数组结构哪些大小在编译时不知道 - 在我的示例下面是它的my_struct **tab
。在最终版本中,我想调用一个JNI方法,它将初始化我的指针数组,并且希望保留它们以用于其他一些方法。C谜题指针
不幸的是,我不是C程序员,我真的很难与这个问题斗争。下面我展示了我试图做的事情;显然,这不起作用。任何建设性的反馈将是非常有帮助的。
(对不起missunderstanding与包括它应该是C代码)
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int tag;
} my_struct;
my_struct **tab;
void * get_pointer_to_struct() {
my_struct * s;
/* allocate memory */
if ((s = (my_struct *) malloc(sizeof (my_struct))) == NULL) {
return NULL;
}
return s;
}
void free_structures(int j) {
for (int a; a < j; a++) {
my_struct *s;
s = (my_struct *) tab[a];
/* free memory */
free(s);
tab[a] = NULL;
}
}
void init_pointers_array(int j) {
my_struct * temp_arr[j];
for (int i = 0; i < j; i++) {
temp_arr[i] = (my_struct *) get_pointer_to_struct();
temp_arr[i]->tag = i;
}
tab = temp_arr;
}
int main() {
//initialization
init_pointers_array(10);
//usage
for (int a = 0; a < 10; a++) {
if (tab[a]) {
my_struct * str_tmp = tab[a];
printf("Integer that you have entered is %d\n", str_tmp->tag);
}
}
//free mem
free_structures(10);
return 0;
}
my_struct * temp_arr[j];
然后
tab = temp_arr;
是错。(不仅*
限定符的位置是可怕的,并有多余的强制转换会严重降低代码的可读性,但是)temp_array
是一个本地自动数组,因此它将在函数返回时解除分配。随后对其地址做任何事情都会导致未定义的行为。您可能要malloc()
吃的结构,而不是一些内存(石膏只能有才能的代码是可用在C++在C,这是强烈反对,使多余的类型转换。):
my_struct **tab;
tab = (my_struct **)malloc(sizeof(tab[0]) * number_of_structs);
int i;
for (i = 0; i < number_of_structs; i++) {
tab[i] = (my_struct *)malloc(sizeof(tab[0][0]));
}
而对于释放它:
int i;
for (i = 0; i < number_of_structs; i++) {
free(tab[i]);
}
free(tab);
这个问题最初被标记为C,但代码显然是C++。当然,在C++中需要'malloc()'强制转换。你应该适当地更新你的答案。 –
@JonathanLeffler正确,谢谢你指出。 – 2013-01-10 23:43:06
这里的问题是,我必须使用我的特定函数返回指向分配结构的指针(在我的示例中由void * get_pointer_to_structure模仿) – kookee
几点:
-
get_pointer_to_struct
可以简单地返回的malloc
结果。并更改它的签名以避免额外转换为my_struct*
。 -
temp_array
在堆栈上创建,因此当init_pointers_array
退出时不再存在。malloc
它也是如此。这是你最大的问题。 - 这是一般情况。你做了很多多余的工作,这会让你的代码糟糕透顶。尽量避免重复转换和不需要的变量。
任何以'#include'和'using namespace std;'开始的代码显然都不是C代码;那就是C++材质。或者前两行是假的,应该删除(并将问题重新编辑并重新编辑回C),或者它确实是C++,并且您需要确保您知道您正在使用哪种语言。 –
这是C,不是C++。 '使用名称空间标准;'不是C++程序。 –
ahhh,对不起,我没有早点指出,目标代码是C而不是C++,这只是显示思维方式的骨架代码。目标代码将成为C库移植JNI调用的一部分。 – kookee