Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 当我不';我不知道数据类型I';你需要什么?_C_Data Structures - Fatal编程技术网

C 当我不';我不知道数据类型I';你需要什么?

C 当我不';我不知道数据类型I';你需要什么?,c,data-structures,C,Data Structures,我正在尝试用数据结构和算法创建自己的库。问题是我不知道数据变量使用什么类型。有一天我可能需要用它来保存整数,用它来保存字符串。知道怎么办吗 例如: typedef struct tree{ int data; struct tree *left; struct tree *right; }tree; 但是如果我想使用字符串,我应该手动更改数据类型还是有其他方法来声明数据?如果您只是更改自己程序的内部结构,您可以通过typedef定义自己的数据类型 typedef int

我正在尝试用数据结构和算法创建自己的库。问题是我不知道数据变量使用什么类型。有一天我可能需要用它来保存整数,用它来保存字符串。知道怎么办吗

例如:

typedef struct tree{
    int data;
    struct tree *left;
    struct tree *right;
}tree;

但是如果我想使用字符串,我应该手动更改数据类型还是有其他方法来声明数据?

如果您只是更改自己程序的内部结构,您可以通过
typedef
定义自己的数据类型

typedef int myDataType;
typedef struct tree{
    myDataType data;
    struct tree *left;
    struct tree *right;
} tree;
您确实需要提前决定数据类型(整型、浮点型、字符串型),否则以后您将不得不进行大量的重写。不过,使用额外的typedef将节省您的时间,并帮助您跟踪直接操作或读取数据的所有位置

此外,如果您只是将结构强制转换为
(void*)
,则可以使用接受
(void*)
作为参数的泛型函数,然后在函数体中重新转换参数

int myFunction(void* input) {
  tree* data;
  if (!input) {
    return (-1);
  }
  data = (tree*)input;
  ...
  return 0;
}

int main(void) {
  tree myTree;
  myFunction((void*)&myTree);
  ...
  return 0;
}

我所说的可能只是胡说八道,但我的想法是:工会呢

typedef struct tree{
    union {
        int i;
        char * c;
    } data;
    struct tree *left;
    struct tree *right;
}tree;
这不是你或多或少想要的吗?一块内存,可用作
int
char*
。让我简单地解释一下
联合
是什么:当创建
联合
变量时,一个与其中最大的一个一样大的内存位置。由于union中的所有子变量将使用相同的内存位置,因此它们将相互覆盖

例如,如果我要直接从上面的内容创建一个
,如下所示:

tree asd;
我可以使用内部的
数据
以以下方式存储整数:

asd.data.i = 123;
然后我可以在左边创建一个分支,在里面存储一个字符串:

asd.left = malloc( sizeof asd );
asd.left->data.c = malloc( 10 );
memcpy( asd.left->data.c, "kek", 4 );
如果您不喜欢中间的
数据
,您可以忽略它!但首先,你也必须在声明中省略它

typedef struct tree{
    union {
        int i;
        char * c;
    };          // <-- removed the data
    struct tree *left;
    struct tree *right;
}tree;
typedef结构树{
联合{
int i;
char*c;

}我想你的问题没有详细的描述。举一个你想达到的例子,你可以尝试使用 Value*/Cuth>。但是你应该和你分享更多的细节。也许库函数<代码> qSoSs>代码>可以作为灵感。去C++,用模板<代码> Malc C <代码>来实现。当创建各种数据结构时;),它会返回一个
void*
。这是一个不错的折衷方案,但它只是掩盖了API/接口设计的糟糕规划。如果它是单个字符的并集,或者是一个庞大的结构数组,它也会非常浪费。@Dogbert结构数组的大小只有指针大小,而不是任何指针大小你不仅仅是一个
char*
或任何其他指针……但是,是的,如果你在联合体中同时有一个
double
和一个
char
,那么你将浪费一些空间。我不同意。你实际上可以在一个结构中分配一个完整的数组,它会在堆栈上自动分配。一个更有效的方法是指向struct w的指针它是在堆上动态初始化的,但仍然是可能的。此外,并非所有指针的大小都相同(即:函数指针与基本数据类型指针)@Dogbert噢,是的……我原以为它只是一个指向结构数组分配内存的指针。你可以这样做,但你真的不应该这样做。如果你将自己修复为
void*
,你甚至无法这样做。使用我提供的这种结构的最好方法是只包含在联合体中小于或等于4字节,可能是8字节。对于任何更大的类型,应该包含指向该类型的指针,并且应该分配足够多的内存将其用作该类型的变量。我为每种类型(string/char;int;float/double)创建了不同的结构,但谢谢您,这个答案告诉我。