2013-01-10 26 views
0

基本上我想在这里实现的是具有全局变量指针数组结构哪些大小在编译时不知道 - 在我的示例下面是它的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; 
} 
+0

任何以'#include '和'using namespace std;'开始的代码显然都不是C代码;那就是C++材质。或者前两行是假的,应该删除(并将问题重新编辑并重新编辑回C),或者它确实是C++,并且您需要确保您知道您正在使用哪种语言。 –

+0

这是C,不是C++。 '使用名称空间标准;'不是C++程序。 –

+0

ahhh,对不起,我没有早点指出,目标代码是C而不是C++,这只是显示思维方式的骨架代码。目标代码将成为C库移植JNI调用的一部分。 – kookee

回答

1
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); 
+0

这个问题最初被标记为C,但代码显然是C++。当然,在C++中需要'malloc()'强制转换。你应该适当地更新你的答案。 –

+0

@JonathanLeffler正确,谢谢你指出。 – 2013-01-10 23:43:06

+0

这里的问题是,我必须使用我的特定函数返回指向分配结构的指针(在我的示例中由void * get_pointer_to_structure模仿) – kookee

0

几点:

  • get_pointer_to_struct可以简单地返回的malloc结果。并更改它的签名以避免额外转换为my_struct*
  • temp_array在堆栈上创建,因此当init_pointers_array退出时不再存在。 malloc它也是如此。这是你最大的问题。
  • 这是一般情况。你做了很多多余的工作,这会让你的代码糟糕透顶。尽量避免重复转换和不需要的变量。
3

此代码是如此难以阅读我很惊讶任何人打扰阅读它。遵循这些准则和您的所有问题都将迎刃而解:不是原始阵列

    • 使用std ::向量(或类似的数组类),如果你不需要它,不要使用动态分配的,但如果你使用代替的malloc
    • 每当你使用动态分配,拥有该对象,并遵循RAII原则
    • 不要使用类内这样做全局变量
  • +0

    感谢您的评论。我浏览了代码,并没有意识到它是C++。我认为这是C.我删除了我的帖子。 – alinsoar

    +0

    谢谢你的反馈,不幸的是它是一个c代码。 – kookee