2012-02-22 88 views
1

让我们假设任何C函数都有一个已经声明的指针,但尚未分配任何值。我们将以我们的例子为例。C指向固定大小数组的指针

int *ptr; 

功能的目标是不分配ptr堆上的任何动态内存,所以没有malloc电话。相反,我们希望让它指向一个固定大小的数组n。我知道我可以做到这一点,像这样:

int arr[n]; 
ptr = arr; 

但是,代码可以得到非常混乱,难以阅读,如果我们需要一个功能,即,许多指针字段都需要的结构做了很多次指向一个固定长度的数组。有没有更好的方法来完成这一行?我在想类似下面的东西,但它看起来过于模糊和不可编译:

int *ptr; 
// Many other things happen in between... 
ptr[n]; 

*** ***编辑
这里,下面的附加信息可能有助于引导更多的答案(不是说目前的答案不好)。在我的用例中,指针是在结构中声明的,在一个函数中,我将指针分配给一个数组。我想知道是否有做到这一点比下面的代码更简单的方法(所有的指针指向定长数组):

struct foo { 
    int* a; 
    short* b; 
    char* c; 
    ... 
}; 

void func(void) { 
    struct foo f; 
    int n = ...; 
    int tempArr1[n]; 
    f.a = tempArr1; 
    short tempArr2[n]; 
    f.b = tempArr2; 
    char tempArr3[n]; 
    f.c = tempArr3; 
    ... 
} 
+0

它不仅含糊不清 - 如果在运行时或编译时尚未分配内存,将会导致内存故障。 – Hogan 2012-02-22 13:44:51

+0

为什么你需要'ptr'?为什么不直接使用'arr'? – 2012-02-22 13:45:28

+0

@JamesMcLaughlin - 他不喜欢它的外观。 – Hogan 2012-02-22 13:50:03

回答

1

您不能声明一个数组并将其分配给单个声明中的现有指针。但是,您可以数组指针分配给新申报指针,就像这样:

int arr[n], *ptr = arr; 

如果你坚持在一行内停留,你可以使用一个丑陋的宏,就像这样:

#define DECL_ASSIGN_INT_ARRAY(name,size,pointer) int name[(size)]; pointer = name; 

这一行的清晰度远远低于您的文章中的两行版本,所以我会保留您的初始版本。

编辑(在回答这个问题的编辑)

另一种选择是在声明中创建一个未使用的指针变量,并在初始分配的指针,就像这样:

void func(void) { 
    struct foo f; 
    int n = ...; 
    int tempArr1[n], *tempPtr1 = f.a = tempArr1; 
    short tempArr2[n], *tempPtr2 = f.b = tempArr2; 
    char tempArr3[n], *tempPtr3 = f.c = tempArr3; 
    ... 
} 
0

这似乎是一个明显的例子,你需要的是一些重构。采取类似的语句,extract them into a new function(通过传递对结构体的引用和希望struct字段指向的数据)并给这个新函数一个有意义的名称。

这可能比一些花式指针算术快捷方式更易于维护和读取,这些快捷方式在几周或几个月内会被遗忘。

0

在您例如ptrarr之间的区别是你可以改变ptr的价值。所以我想你想通过阵列移动ptr

那么这个怎么样:

int arr[n], id=0; 

并更改的id的价值和使用arr+id作为ptr

0

我想这样做的方法是使用宏。像(未经测试)

#define autoptr(name,size) int Arrayname[size]; name = Arrayname; 

什么我不清楚这是为什么帮助我想可能“很难看”,但会更容易维护,而不宏。一般来说,隐藏你实际做的是件坏事。