你可以像这样定义一个函数:
#include <stdarg.h>
#include <stdlib.h>
int * intMallocInit (int length, ...) {
// Initialize Variable Arguments
va_list args;
va_start (args, length);
// Allocate Memory
int * arr = malloc (sizeof(int) * length);
if (arr == NULL) return NULL;
// Initialize Array
for (int i = 0; i < length; i++) {
arr[i] = va_arg(args, int);
}
// Clean Up and Return
va_end(args)
return arr;
}
我们可以这样称呼它:
int len = 3;
int * myArray = intMallocInit (len, 4, 5, 2);
if (myArray == NULL) return 0;
for (int i = 0; i < len; i++) {
printf("%d,", myArray [i]);
}
输出: 4,5,2,
注意:我们也可以定义floatMallocInit()等
你也可以使用 void 指针,或者 enum& 开关,但我不会去那里。
一般功能的未经测试的尝试
我确信围绕 fhe 开关有一个聪明的工作,但这是我能想到的。
#include <stdarg.h>
#include <stdlib.h>
enum {INT, FLOAT /* etc...*/}
int getSize(int type) {
int typeSize = 0;
switch (type) {
case INT:
typeSize = sizeof (int);
break;
case FLOAT:
typeSize = sizeof (float);
break;
// Etc...
default:
return -1;
}
return typeSize;
}
void * mallocInit (int type, int length, ...) {
// Initialize Variable Arguments
va_list args;
va_start (args, length);
// Get Size of type
int typeSize = getSize(type);
if (typeSize == -1) return NULL;
// Allocate Memory
void * arr = malloc (typeSize * length);
if (arr == NULL) return NULL;
// Initialize Array, Maybe va_copy can be used? No good reference
for (int i = 0; i < length; i++) {
switch(type) {
case INT:
arr[i] = va_args(args, int);
break;
// Etc..
}
}
// Clean Up and Return
va_end(args)
return arr;
}
调用
float myArray = mallocInit (FLOAT, 3, 1, 5, 7);