将项添加到C中的空数组并获取数组长度

时间:2015-12-22 22:46:41

标签: c arrays

我已经多次尝试解决这个问题,但每次都失败了。

我有一个数组

char *array[1024] = {};

现在我想在数组中添加一个项目,并且还可以按数字访问项目

例如: array[0]将是第一项 array[1]将是第二个 array[2]将是第三项

但我也想知道数组中有多少项,所以我可以使用像

这样的东西
for(int i = 0; i <= totalitemsinarray; i++) {
    print(array[i]);
}

4 个答案:

答案 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()调用不是太麻烦,但是当需求发生变化时,它会保护你免受错误的侵害。我的经验是,代码中的任何固定限制,如果看起来非常大,最终都会被超出,并且会导致悲惨的失败。唯一的保障措施是在任何地方使用尽可能多的内存。