将1d缓冲区重新组织为2d阵列

sph*_*714 2 c c++ arrays pointers

我给了一个int buffer[100]足够大小的1d缓冲区().我需要重新组织与2d数组相同的内存.我想要做的是将它转换为双指针(int ** p)然后将指针传递给将执行重组的alloc函数.函数返回后,我需要该语句p[2][2]才能工作.

这是代码:

#include <stdlib.h>
#include <stdio.h>

void alloc(int ** buf, int r, int c)
{
    int **temp;
    temp=buf;
    for(int i=0;i<r;i++)
        buf[i]=*(temp+i*c);
}
void main()
{
    int buffer[100];
    int **p=(int **)buffer;
    alloc(p, 4, 4);
    p[2][2]=10;
    printf("%d", p[2][2]);
}
Run Code Online (Sandbox Code Playgroud)

上面的代码编译成功,但是当我运行代码时,我在执行语句时得到访问冲突

p[2][2]=10;
Run Code Online (Sandbox Code Playgroud)

我无法理解问题所在.alloc函数有问题吗?或者是其他问题?

R S*_*ahu 6

让我们检查一下你的代码,了解它为什么不起作用.

让我们用一个较短的缓冲区来了解你在做什么.

假设你有:

int buffer[9];
Run Code Online (Sandbox Code Playgroud)

你想把它当作一个3x3 2D阵列.内存使用缓冲区:

buffer
|
v
+---+---+---+---+---+---+---+---+---+
|   |   |   |   |   |   |   |   |   |
+---+---+---+---+---+---+---+---+---+
Run Code Online (Sandbox Code Playgroud)

你想创建一个int** p这样的:

p[0]        p[1]        [p2]
|           |           |
v           v           v
+---+---+---+---+---+---+---+---+---+
|   |   |   |   |   |   |   |   |   |
+---+---+---+---+---+---+---+---+---+
Run Code Online (Sandbox Code Playgroud)

为了实现这个目标,你必须分配内存来存储p[0],p[1]p[2].这意味着,你需要:

int** p = new int*[3];
p[0] = buffer;
p[1] = buffer + 3;
p[2] = buffer + 6;
Run Code Online (Sandbox Code Playgroud)

现在,p还有p[0],p[1],p[2]指向有效的地址.您可以使用语法p[m][n].

在我们的代码中,您只是指定使用该语句p指向相同的位置buffer

buf[i]=*(temp+i*c);
Run Code Online (Sandbox Code Playgroud)

你只是使用buffer作为持有者持有的内存int*,这不仅会篡改数据,buffer还会使指针的值无法预测.

这是一个有效的计划.

#include <stdio.h>

int main()
{
   int buffer[100];
   int rows = 4;
   int cols = 10;
   int **p = new int*[rows];
   for ( int i = 0; i < rows; ++i )
   {
      p[i] = buffer + i*cols;
      printf("%p\n", p[i]);
      for ( int j = 0; j < cols; ++j )
      {
         p[i][j] = i*2 + j*3;
      }
   }
   printf("\n");

   for ( int i = 0; i < rows; ++i )
   {
      for ( int j = 0; j < cols; ++j )
      {
         printf("%d ", p[i][j]);
      }
      printf("\n");
   }
}
Run Code Online (Sandbox Code Playgroud)