我已经多次尝试解决这个问题,但每次都失败了。
我有一个数组
char *array[1024] = {};
现在我想在数组中添加一个项目,并且还可以按数字访问项目
例如:
array[0]
将是第一项
array[1]
将是第二个
array[2]
将是第三项
但我也想知道数组中有多少项,所以我可以使用像
这样的东西for(int i = 0; i <= totalitemsinarray; i++) {
print(array[i]);
}
答案 0 :(得分:3)
您无法在C中更改数组的大小。但是,您可以分配足够大的数组,然后用条目填充它。首先,声明一个足够大小的数组,比如1024。
char *array[1024];
然后声明一个变量fill
,用于计算array
中已用插槽的数量。将其初始化为0
,因为开头使用了0个插槽。然后,每次插入项目时,请递增fill
:
array[fill++] = ...;
...
array[fill++] = ...;
确保您永远不会尝试在阵列中插入超过1024个项目,C不会为您检查。
要获得更灵活的方法,请使用malloc()
为数组分配内存,然后在realloc()
填充时定期将其放大。如果以指数步长增加数组大小(例如,乘以Φ= 0.5 +0.5√2≈1.61),则插入每个条目的O(1)摊销时间。
答案 1 :(得分:2)
没有办法直接用C语言提问。如果您知道只有某些值有效,则可以选择一个选项。例如,您有一个char *
数组,因此人们常常使用NULL
作为标记/无效值。在这种情况下,您可以初始化数组以获得所有NULL
并使用它来了解数组的大小:
char *array[1024];
memset(array, 0, sizeof(array));
/* .... */
for (int i = 0; i < sizeof(array)/sizeof(char*); i++) {
if (array[i]) {
printf("%s\n", array[i]);
}
}
答案 2 :(得分:0)
char *array[1024] = {};
首先,这是一个包含1024个char指针/字符串的数组。这些元素可以是0或普通垃圾。如果您不打算将它们全部设置,则可能需要使阵列无效。
关于存储值和计数的问题,您可能希望查看结构。例如:
typedef struct elem {
int count;
char *value;
} elem;
然后elem.count
将是数字,elem.value
将是相应的值。
然后在for循环中初始化它们。
答案 3 :(得分:0)
唯一真正有效的方法是动态增长数组。在堆上分配数组,并管理两个计数:1。当前使用的元素的计数,以及2.当前为其分配内存的元素的数量。像这样:
//the setup
size_t arrayLength = 0, allocatedSize = 8;
int* array = malloc(sizeof(*array) * allocatedSize);
//grow the array -> first check that we have space to add an element
if(arrayLength == allocatedSize) {
array = realloc(array, allocatedSize *= 2);
assert(array);
}
assert(arrayLength < allocatedSize);
//grow the array -> add an element
array[arrayLength++] = ...;
你知道,realloc()
调用不是太麻烦,但是当需求发生变化时,它会保护你免受错误的侵害。我的经验是,代码中的任何固定限制,如果看起来非常大,最终都会被超出,并且会导致悲惨的失败。唯一的保障措施是在任何地方使用尽可能多的内存。