在C特定索引范围内分配

时间:2017-02-24 12:26:00

标签: c memory memory-management

是否可以在C中分配特定的索引范围,就像在fortran中一样:

allocate(f(istart-1:iend+1), u(istart-1:iend+1), uold(istart-1:iend+1))


do i = istart, iend
.
.
.
end do

3 个答案:

答案 0 :(得分:1)

你不能直接,在C中没有意义,因为数组是连续元素的序列,第一个元素按照定义具有索引0 。事实上,C标准明确表示:

  

6.5.2.1数组下标   
...
  2后缀表达式后跟方括号[]中的表达式是下标   指定数组对象的元素。下标运算符[]的定义   是E1 [E2]与(*((E1)+(E2)))相同。由于转换规则   应用于二进制+运算符,如果E1是一个数组对象(等效地,指向   数组对象的初始元素),E2是整数,E1 [E2]表示E2   E1的元素(从零开始计数)。

但是您可以通过创建具有特定偏移的新指针来轻松地模拟它。假设您希望数组接受开始(包括)到结尾(独占)的索引(开始和结束是2个整数值,结束>开始):

int * arr = malloc((end - start) * sizeof(int));
arr -= start; // must be done in two steps because malloc return a void*
              // and no pointer arithmetics is possible on void *;

for (int i=start; i<end; i++) {
    arr[i] = ...;
    ...
}
...
free(arr + start);  // do not forget the offset when freeing...

根据定义arr[start] = *(arr + start) = *(arr_orig - start + start) = *arr_orig

答案 1 :(得分:1)

你想要什么基本上归结为设置数组的下限和上限,如Basic(和appranently Fortran):Dim Matrix(3, 4) As Integer

作为一种用途,我可以考虑在稀疏数组中处理一个部分,而不必分配完整的数组。

在C中你可以通过使用一个作为偏移量的整数变量来实现这一点,作为一个简单的例子:

int getElement(int *arr, int index, int offset)
{
    return *(arr + (index-offset));
}

也可以使用更精细的方法,例如:

typedef struct MY_ARR {
    int *arr;
    int lowerbound;  // from
    int upperbound;  // up and including
} t_myArr;

t_myArr *newArr(int lower, int upper)
{
    t_myArr *p;
    if (!(p= malloc(sizeof(t_myArr))) return 0;
    if (!(p->arr= calloc(sizeof(int),upper-lower+1))) {free(p); return 0;}
    p->arr.lowerbound= lower;
    p->arr.upperbound= upper;
    return p;
}
int getElement(t_myArr *p, int element)
{
    if (!p || p->arr.lowerbound<element || element>p->arr.uperbound) return 0;
    return(*(p->arr+element-lowerbound));
}

实质上,您现在已经创建了自己的整数数组类型。

答案 2 :(得分:0)

也许你想要这样的东西:

int array[100];

#define Array(index) array[(index) - 10]

int main() {

  Array(10) = 1;  // actually the same as array[0];
  Array(11) = 2;  // actually the same as array[1];

  printf("%d\n", Array(10) + Array(11));

}

这真的是一个黑客,我不建议实际使用它。