gpt4 book ai didi

c - 带有随机打印的空指针数组

转载 作者:行者123 更新时间:2023-11-30 14:45:28 25 4
gpt4 key购买 nike

我尝试了很多不同的方法,也看过很多不同的文章来做到这一点,但我无法让它发挥作用。我尝试过malloc方法。我试图将各种数据类型分配到 void 指针数组中并打印随机选择的值。

#include <stdio.h>
#define LENGTH 4
void main()
{
int a = 3;
float b = 2.5;
char c = 'H';
int d = 421;
char e = 'a';
void *array;
array[LENGTH];
array[0] = &a;
array[1] = &b;
array[2] = &c;
array[3] = &d;
array[4] = &e;
printf("%p \n", array[rand() % LENGTH]);
}

最佳答案

为了打印任何类型的通用数据,您需要将类型信息与数据一起存储。这通常在 C 语言中通过创建枚举来完成。例如:

typedef enum
{
TYPE_INT,
TYPE_FLOAT,
TYPE_CHAR,
TYPE_STR,
} type_t;

然后您可以将其与数据存储在一起:

typedef struct
{
type_t type;
void* data;
} generic_t;

因此数组必须是结构数组:

generic_t array [LENGTH] = { ... };
<小时/>

完整示例:

#include <stdlib.h>
#include <time.h>
#include <stdio.h>

typedef enum
{
TYPE_INT,
TYPE_FLOAT,
TYPE_CHAR,
TYPE_STR,
} type_t;

typedef struct
{
type_t type;
void* data;
} generic_t;


void print_int (int x) { printf("%d", x); }
void print_float (float x) { printf("%f", x); }
void print_char (char x) { printf("%c", x); }
void print_str (const char* x) { printf("%s", x); }

void print (const generic_t* gen)
{
switch(gen->type)
{
case TYPE_INT: print_int(*(int*)gen->data); break;
case TYPE_FLOAT: print_float(*(float*)gen->data); break;
case TYPE_CHAR: print_char(*(char*)gen->data); break;
case TYPE_STR: print_str((const char*)gen->data); break;
}
}

#define LENGTH 5

int main (void)
{
srand(time(NULL));

int a = 3;
float b = 2.5;
char c = 'H';
int d = 421;
char e[] = "hello";

generic_t array [LENGTH] =
{
{ TYPE_INT, &a },
{ TYPE_FLOAT, &b },
{ TYPE_CHAR, &c },
{ TYPE_INT, &d },
{ TYPE_STR, &e },
};

for(size_t i=0; i<10; i++) // print 10 random indices of the array
{
print( &array[rand()%LENGTH] );
printf("\n");
}
}

使用 C11 _Generic 等可以使这变得更漂亮、更安全,但上面是“老派”、向后兼容的通用 C 编程方式。

关于c - 带有随机打印的空指针数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53044390/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com