我有两个指向
的结构指针typedef struct Square {
...
...
}Square;
Square **s1; //Representing 2D array of say, 100*100
Square **s2; //Representing 2D array of say, 200*200
使用malloc()
在堆上分配两者。
我使用特定值初始化s1
,并使用默认值完全初始化s2
。
基本上我需要将s1
的大小调整为s2
,同时保持其s1
个值,并且'添加'值将与s2
中的值一样 - 默认值。
我写了这个问题memcpy() from smaller array to larger one,但显然我在数组和指针之间混淆/
我的问题是,如何将s1
的大小调整为s2
的大小。我不必保留原始指针。如果这是更好的方式,我可以将s1
复制到s2
并返回s2
我希望我能解释一下我正在追求的东西。
谢谢!
答案 0 :(得分:1)
二维数组按顺序排列在内存中:row1 row2 row3等。
memcpy从一个内存位置执行线性复制。
所以要实现你所需要的:
a)创建一个新数组
Square **s3 = malloc(sizeof(s2));
b)将s2复制到其中
c)将s1中的内容逐行复制到新的
中for(r = 0; r < NROWS_S1; r++)
memcpy(s3[r], s1[r], sizeof(Square) * NCOLS_S1);
http://www.fredosaurus.com/notes-cpp/arrayptr/23two-dim-array-memory-layout.html
答案 1 :(得分:1)
您可以尝试这样的事情:
typedef struct {
//
} Square;
Square** s1; // 100x100, needs to resize and be like s2.
Square** s2; // 200x200
void resize_s1()
{
// resize the outer array
s1 = realloc(s1, sizeof(Square*)*200);
memset(s1 + 100, 0, 100*sizeof(Square*)); // we initialize the newly allocated pointers to NULL
for(int i = 0; i < 200; ++i)
{
// resize the inner array. Since we initialized the last
// 100 pointers to null, realloc will just behave like
// malloc for them.
s1[i] = realloc(s1[i], 200*sizeof(Square));
// ... and copy the new values in! You can omit this step,
// but anything outside of the original bounds of s1 will
// be uninitialized. All your pointers will be valid though.
if(i >= 100)
memcpy(s1[i] + 100, s2[i] + 100, 100*sizeof(Square));
}
}
作为警告的一句话 - 我在这里玩realloc的速度非常快。阅读其手册页以获取更多详细信息,但如果您遇到内存不足的情况,可能会发生不好的事情。
答案 2 :(得分:1)
您已在堆上分配了2-D矩阵,并且您正在使用Square**
来访问它。这意味着您:(1)在对malloc
的一次或多次调用中为每个元素分配空间,以及(2)在调用{{1}时为所有行指针分配空间}}。如何进行取决于你如何分配数组。
下面,我使用malloc
强调每个malloc / realloc都可以返回NULL(表示它无法完成请求)。您可能希望正确处理这些案例。
您分配了assert
矩阵,如下所示:
s1
在这种情况下,您必须分别处理每一行:
Square** s1 = malloc(M1*sizeof(s1[0]));
for (size_t i=0; i < M1; i++)
s1[i] = malloc(N1*sizeof(s1[i][0]));
在这种情况下,您将一个大块中的所有行分配,然后分配指向每行开头的指针。像这样:
/* M1 and N1 set to size of s1 (M1 x N1) */
/* M2 and N2 set to size of s2 (M2 x N2) */
/* First, reallocate the pointers to each row */
Square** tmpRows = realloc(s1, M2*sizeof(*tmpRows));
assert( (tmpRows != NULL) && "Out of memory reallocating rows" );
s1 = tmpRows;
/* Now, reallocate each row */
for (size_t i=0; i < M1; i++) {
Square* tmpVals = realloc(s1[i], N2*sizeof(tmpVals[0]));
assert( (tmpVals != NULL) && "Out of memory reallocating row" );
/* copy elements of s2 into new column */
memcpy(tmpVals+N1, s2[i]+N1, (N2-N1)*sizeof(s1[i][0]));
s1[i] = tmpVals;
}
/* Now, allocate each new row of s1 and copy the additional rows of s2 into s1 */
for (size_t i=M1; i < M2; i++) {
s1[i] = malloc( N2 * sizeof(s1[i][0]) );
assert( (s1[i] != NULL) && "Out of memory allocating new row" );
memcpy(s1[i], s2[i], N2*sizeof(s1[i][0]));
}
要调整数组的大小(并使用s2的元素初始化其新元素),您应该执行以下操作:
Square** s1 = malloc(M1*sizeof(s1[0]));
s1[0] = malloc( M1*N1*sizeof(s1[0][0]) );
for(size_t i=1; i < M1; i++)
s1[i] = s1[i-1] + N1;