0

基本上我在这里想要实现的是拥有一个全局变量,其中包含指向结构的指针数组,该结构的大小在编译时是未知的——在我下面的示例中是my_struct **tab. 在最终版本中,我想调用一个 JNI 方法来初始化我的指针数组,并且我想保留它们以供其他方法使用。

不幸的是,我不是 C 程序员,我真的很努力解决这个问题。下面我展示了我尝试做的事情;显然,它不起作用。任何建设性的反馈都会非常有帮助。

(对不起,包含它应该是 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;
}
4

3 回答 3

3

这段代码太难读了,我很惊讶有人愿意阅读它。遵循这些准则,您的所有问题都将得到解决:

  • 使用 std::vector (或类似的数组类)而不是原始数组
  • 如果不需要,不要使用动态分配,但如果确实使用new而不是 malloc
  • 每当您使用动态分配时,请在拥有该对象并遵循 RAII 原则的类中执行此操作
  • 不要使用全局变量
于 2013-01-10T23:52:16.047 回答
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);
于 2013-01-10T23:39:31.673 回答
0

几点:

  • get_pointer_to_struct可以简单地返回malloc. 并更改它的签名以避免额外的转换为my_struct*.
  • temp_arrayinit_pointers_array在堆栈上创建,因此退出时不再存在。malloc它也是。这是你最大的问题。
  • 这是一般情况。你做了很多多余的工作,这会让你的代码变得很糟糕。尽量避免多余的强制转换和不需要的变量。
于 2013-01-10T23:41:39.067 回答