如何通过c中的函数访问typedef结构中的二维数组指针



我在通过指针从其他函数访问typedef中的2D数组时遇到问题,即使我在堆中分配数组!

#include <stdlib.h>
#include <stdio.h>
typedef struct {
int a;
int b;
int **data;
} Image;
Image *createImage(int a, int b) {
Image createImage;
createImage.data = malloc(a * sizeof(int *));
for (int i = 0; i < a; i++) {
createImage.data[i] = malloc(b * sizeof(int));
}
Image *imagePointer = malloc(sizeof(Image));
imagePointer = &createImage;
return imagePointer;
}
int main () {
int a = 70;
int b = 90;
Image *imagePointer = createImage(a, b);
for (int i = 0; i < a; i++) {
for (int j = 0; j < b; j++) {
imagePointer->data[i][j] = i + j;
}
}
}

我在加载映像时出错,因为我在访问分配的存储时出错。我应该改变什么?

Jonathan

不返回指向Image的指针,而是返回局部变量本身,它就可以工作了。此外,变量名和函数名不应该是相同的createImage,这有时会造成混淆。

#include <stdlib.h>
typedef struct {
int a;
int b;
int **data;
} Image;
Image createImage(int a, int b) {
Image ci;
ci.data = malloc(a * sizeof(int *));
for (int i = 0; i < a; i++) {
ci.data[i] = malloc(b * sizeof(int));
}
return ci;
}
int loadImage () {
int a = 70;
int b = 90;
Image imagePointer = createImage(a, b);
for (int i = 0; i < a; i++) {
for (int j = 0; j < b; j++) {
imagePointer.data[i][j] = i + j;
}
}
}
int main(int argc, char const *argv[])
{
loadImage();
return 0;
}
  1. 它不是2D数组,而是指针数组
  2. 尺寸使用size_t
  3. sizeof中使用对象而不是类型
  4. 始终检查malloc的结果

我将使用灵活的数组成员和数组指针来删除一个间接级别,并简化分配和释放(只需要一个malloc/free(

typedef struct {
size_t a;
size_t b;
unsigned data[];
} Image;
Image *createImage(const size_t a, const size_t b) 
{
Image *imagePointer;
imagePointer = malloc(sizeof(*imagePointer) + a * b * sizeof(imagePointer -> data[0]));
if(imagePointer)
{
imagePointer -> a = a;
imagePointer -> b = b;
}
return imagePointer;
}

int main (void) 
{
const size_t a = 70;
const size_t b = 90;
Image *imagePointer = createImage(a, b);
if(imagePointer)
{
unsigned (*image)[imagePointer -> b] = (unsigned (*)[imagePointer -> b])imagePointer -> data;
for (size_t i = 0; i < a; i++) 
{
for (size_t j = 0; j < b; j++) 
{
image[i][j] = i + j;
}
}
}
}