2017-06-19 86 views
-1

我遇到了一个我想要有一个指针数组(M行,N个列)的例子,这个数组的每个成员指向一个浮点向量(L长度)。你能告诉我如何建立它?我希望能够动态地建立它,因为我通常首先不知道M,N和L,而L对于差异向量可能不同。如何在ANSI C中动态分配POINTERS的二维数组?

我的场合是我需要阅读具有不同距离(NDIS)和深度(NDP)的格林函数。所以我需要创建类似* grn [NDP] [NDIS]的东西。然后使用此数组的每个指针指向绿色函数的一个组件。

顺便说一下,我认为这比设置一个已知大小的指针数组有点复杂。你认为使用这种类型的数据结构是否值得?我试图编写一个程序来处理观察,我通常不知道它的大小。 但是,我可以使用大小固定的指针数组。如果总数据大于给定大小,我可以忽略超大部分。但我希望能够全部使用它们。

+1

这肯定会帮助你 - [斯坦福CS](http://cslibrary.stanford.edu/) – Ganesh

+0

也许我没有明确描述我的问题。我想创建一个二维数组,其中每个术语都是指向浮点向量的POINTER指针。我的情况是我需要阅读不同距离和深度的绿色功能。所以我需要创建类似* grn [NDP] [NDIS]的东西。 – mlin

回答

0

您需要使用2-d阵列和需要动态地分配它,这样的:

int i, j; 
float **arr; 
arr = malloc(sizeof(float*) * Size1); //1st array setup 
for(i = 0; i < Size1; i++) 
    arr[i] = malloc(sizeof(float*) * Size2); // 2nd array setup at each element of 1st array 

立即访问它是这样的:

for(i = 0; i < Size1; i++) 
    for(j = 0; j < Size2; j++) 
    printf("%f", arr[i][j]); 

Size1 & Size2是第一尺寸的数组和第二个数组。

您可以在第一个数组元素中设置不同大小的单个数组,因为您需要在不使用循环的情况下更改Size2变量。 希望这有助于。

+0

如果你使用严格的编译器(我的意思是像C++这样严格的检查规则),你应该*不*传递'malloc()'的返回值,就像在这个例子中做的那样 – Toby

+0

,他们会抛出错误。所以,这成为我所知道的推荐做法。 – anil

+1

如果您使用的是C++,那么您错误地回答了一个C问题。除非你使用C的一个非常旧的版本(比如K&R C),否则malloc返回的转换总是不好的做法。即使C89正确地推广了无效指针,这意味着不需要强制转换。请参阅https://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc – Toby