使用带指针的数组注释

tzw*_*ckl 5 c arrays pointers multidimensional-array

我目前无法理解以下场景:我有一个多维数组的字符串,我想通过仅使用指针来解决它,但我总是在指针上使用数组注释时出现分段错误.这只是一个示例代码我想在pthread中使用3D数组,所以我想通过结构作为指针传递它,但它只是不起作用,我想知道为什么?我认为指针和数组在功能上是等价的?以下是示例代码:

#include <stdio.h>

void func(unsigned char ***ptr);

int main() {
  // Image of dimension 10 times 10
  unsigned char image[10][10][3];
  unsigned char ***ptr = image;

  memcpy(image[0][0], "\120\200\12", 3);

  // This works as expected
  printf("Test: %s", image[0][0]);

  func(image);

  return 0;
}

void func(unsigned char ***ptr) {
  // But here I get a Segmentation Fault but why??
  printf("Ptr: %s", ptr[0][0]);
}
Run Code Online (Sandbox Code Playgroud)

在此先感谢您的帮助 :)

zzx*_*xyz 1

我想也许strdup会混淆这个问题。指针和数组并不总是等效的。让我尝试演示一下。我总是避免实际的多维数组,所以我可能会在这里犯错误,但是:

int main()
{
  char d3Array[10][10][4]; //creates a 400-byte contiguous memory area 
  char ***d3Pointer; //a pointer to a pointer to a pointer to a char.
  int i,j;
  d3Pointer = malloc(sizeof(char**) * 10);
  for (i = 0; i < 10; ++i)
  {
    d3Pointer[i] = malloc(sizeof(char*) * 10);
    for (j = 0; j < 4; ++j)
    {
      d3Pointer[i][j] = malloc(sizeof(char) * 4);
    }
  }
  //this
  d3Pointer[2][3][1] = 'a';
  //is equivalent to this
  char **d2Pointer = d3Pointer[2];
  char *d1Pointer = d2Pointer[3];
  d1Pointer[1] = 'a';


  d3Array[2][3][1] = 'a';
  //is equivalent to 
  ((char *)d3Array)[(2 * 10 * 4) + (3 * 4) + (1)] = 'a';
}
Run Code Online (Sandbox Code Playgroud)

一般来说,我使用分层方法。如果我想要连续的内存,我自己处理数学......就像这样:

  char *psuedo3dArray = malloc(sizeof(char) * 10 * 10 * 4);
  psuedo3dArray[(2 * 10 * 4) + (3 * 4) + (1)] = 'a';
Run Code Online (Sandbox Code Playgroud)

更好的是,我使用像uthash.

请注意,正确封装数据会使实际代码非常容易阅读:

typedef unsigned char byte_t;
typedef struct
{
  byte_t r;
  byte_t g;
  byte_t b;
}pixel_t;

typedef struct
{
  int width;
  int height;
  pixel_t * pixelArray;
}screen_t;

pixel_t *getxyPixel(screen_t *pScreen, int x, int y)
{
  return pScreen->pixelArray + (y*pScreen->width) + x;
}

int main()
{
  screen_t myScreen;
  myScreen.width = 1024;
  myScreen.height = 768;
  myScreen.pixelArray = (pixel_t*)malloc(sizeof(pixel_t) * myScreen.height * myScreen.width);
  getxyPixel(&myScreen, 150, 120)->r = 255;
}
Run Code Online (Sandbox Code Playgroud)